[identity profile] vkorehovisback.livejournal.com posting in [community profile] engineering_ru
Оригинал взят у [livejournal.com profile] vkorehovisback в Как сделать PCI карту своими руками, Часть 1 (введение)
Мне понадобился качественный интерфейс для CNC станка.
Сразу скажу что параллельный порт меня не устраивает. потому как качество его реализации сомнительное, контактов мало (всего 16 I/O, не помню сколько I и сколько O) и максимальная частота работы до 50 кгЦ, с сомнительными показателями по интерференции, крутизне фронтов, задержек, и т.д.
Для интерфейса с 6-осным станком, понадобится 24 дифференциальные пары контактов (6 диффпар на сигналы DIR, 6 диффпар на сигналы PULSE).
Кроме того я предусмотрел 12 цифровых TTL выхода (до 50ма) и 12 опто-изолированных цифровых входа общего назначения.
И того все это добро еле уместилось в SCSI коннектор 50 pin, который мне очень нравится.


Дальше самое главное, какой вариант реализации PCI карты выбрать, существует два пути:
1) Использовать готовый PCI чип какого-либо производителя.
2) Использовать FPGA.


Первый вариант я отбросил, потому что тогда реализация будет целиком зависеть от этого чипа, его глюков или их отсутствия.
т.е. мы будем всецело полагаться на кого-то учить их спецификацию, разбирать какой драйвер нужен, как его написать и т.д.

Второй вариант является немного более трудозатратным изначально, зато потом он дает больше пользы, потому как FPGA наверное самые универсальные устройства в мире, и с их помощью можно сделать практически любой интерфейс, с любым устройством, можно имплементировать практически любую схему и т.д.

Начнем с самого сложного, с шины PCI. Осложняется все тем, что спецификация закрытая, в интернете информации не много, но есть способ обойти буржуев.
Многие производители FPGA имеют и комплект стандартных реализаций различных интерфейсов за доп. плату (которую вменяемые люди конечно-же платить не будут), называется это все IP Core (Xilinx у других может отличаться, но идея таже)
что это такое? ну это вроде библиотеки для линковки кода.
IP Core может поставляться в виде непосредственно кода (Verilog ili VHDL) либо в виде специального закрытого нэтлиста (что-то вроде EDIF, но зашифрован, у каждого вендора свой формат и позволяет линковать их только используя их средства разработки)
Спасибо умельцам, которые четко взломали пакет Xilinx ISE 10.1, что позволяет получить доступ ко всем IP Core абсолютно бесплатно и на уровне исходного кода (что самое полезное для обучения)
Раздачу каждый может найти сам на известном торрент трекере.

Далее, есть сайт fpga4fun.com где рассказывается максимально сжато о всех особенностях FPGA и нет смысля дублировать эту информацию тут. Сайт рассказывает о FPGA двух лидеров на рынке: Xylinx и Altera.
Также вам потребуется изучить Verilog, но если вы уже программировали на каком-то языке, то это не составит большего труда.

Какой чип выбрать??
Я остановился на Xylinx Spartan xxx
Тут есть несколько подводных камней.
1) Совместимость с шиной PCI32 5V
2) Количество выходов которые можно коммутировать одновременно (называется SSO simultaneously switching outputs)
3) Тип корпуса: BGA или PQ (BGA сложнее паять, потребуется печь, либо хороший фен и удача)
4) Встроенный flash либо вынесенный в отдельный чип?
5) Максимальное время загрузки до получения первых сигналов с PCI

Совместимость с шиной PCI32 5V


Это наверное самое ответственное из всего. Вам предстоит сделать выбор, использовать ли вам чипы конвертации уровней сигналов всех I/O шины (около 50) и использовать современный FPGA (1.25V, 2.5V, 3.3V no 5V tolerant).
Либо использовать старый FPGA.
Для своего проекта я сделал выбор в пользу старого FPGA (Spartan II) и пока еще не пожалел.
Следует отметить, что использование чипов конвертации уровней вносит дополнительные сложности в проблему с SSO, потому как
такие чипы генерируют Overshotы и Undershotы напряжения и могут приводить к ошибкам.
Проблема SSO, питания и максимального времени загрузки FPGA для PCI32 3.3V:
http://www.xilinx.com/support/documentation/application_notes/xapp457.pdf
Наилучшее подключение Bus Switch для совместимости с 5V PCI (что является стандартом для домашних ПК):
http://www.xilinx.com/support/documentation/application_notes/xapp646.pdf
Проблему с overshot и undershot тут решают сместив уровень земли для чипов конвертера уровней.
Следует отметить особенно, что для увеличения числа SSO (также называется Ground bounce) применяют шунтирующий резистор в цели питания чипа, задавая ток "холостого хода" 50mA (резистор 34 ом, для питания 3.3V)
Такой резистор, либо низкоомную обратную связь для LDO я видел во ВСЕХ pci платах схемы которых мне удалось достать.

Количество выходов которые можно коммутировать одновременно (называется SSO: simultaneously switching outputs)


У каждого чипа и типа корпуса этот параметр разный и приводится в даташите.
Например в моем случае с типом корпуса PQ208 и моделью Spartan II для стандарта PCI разрешается использовать до 4х SSO на группу питания, которых всего 16 в устройстве (по две на банк, которых 8-мь)

Далее я взял константы которые поставлялись с IP Core PCI (версия 3.199) (*.ucf файл User Constants file)
И оказалось что они распределили все сигналы PCI на 4 банка (получается 32 SSO сигнала разрешено, в то время как для шины pci требуется порядка 40 сигналов у которых крутые фронты):
http://www.xilinx.com/support/documentation/application_notes/xapp457.pdf
• AD[31:0]
• CBE[3:0]
• PAR
• IRDY#, FRAME#
• REQ#

Кроме того банки заполнены неравномерно, что так-же нарушает Допустимый SSО.
С другой стороны IP Core прошла тестирование в такой конфигурации и я побоялся менять тут что-то.
рискуя не вложиться в тайминги PCI шины, из за особенностей внутренней архитектуры FPGA.
Поэтому я предпринял дополнительные усилия для увеличения SSO. Я поставил шунт (120 ом) нa выход каждого регулятора напряжения питания, хорошие байпас конденсаторы, многослойную печатную плату с отдельным слоем для земли и т.д.
Также следует думать тут об удобном расположении выводов для трассировки печатной платы!

Тип корпуса: BGA или PQ


Я выбрал PQ208, BGA имеет большее преимущество (вдвое выше SSO), но есть риск не запаять в домашних условиях, еще может быть закорочен какой-либо контакт из за смещения чипа, что опасно для вашей материнской платы!.

Встроенный flash либо вынесенный в отдельный чип? и Максимальное время загрузки до получения первых сигналов с PCI



Тут я первый раз пожалел что связался со старой линейкой чипов а не выбрал новую Spartan 3AN (со встроены флешем)
Оказалось что для каждой модели Spartan II есть свой чип программируемый через JTAG.
Он оказался довольно дорогим, и чувствуется что его скоро перестанут продавать.
XC18V01 (1 мегабайт флеша в моем случае)
Как его подключить к FPGA Spartan II, есть в даташите.
Возможно либо серийный интерфейс либо параллельный, под управлением внутреннего такта FPGA либо внешнего!, я выбрал серийный под управлением FPGA, т.е. сигнал кола генерирует сам FPGA и после окончания загрузки переходит в рабочий режим.
Частота загрузки конфигурации 66Мгц, для PCI32 5V это достаточно чтобы уложиться в 1.1 секунду (PCI32 5V 32Mhz) для загрузки полной конфигурации. однако в моем проекте будет использоваться лишь небольшая часть конфигурационного пространства.

Ну вот вроде и все, скоро выложу печатную плату и схему, в следующей части.
Потом будет софт и наша PCI карта готова.

Date: 2014-05-01 09:23 pm (UTC)
From: [identity profile] suvorow-.livejournal.com
Я делал 3 МГц ещё в 1997 году. Latency может быть довольно большой, но в пересылке проблем нет. в L-Card-е мы делали плату с АЦП 14 бит 3 МГц, и на входе стоял мультиплексор на 8 каналов, и можно было им управлять напрямую, т.е. принимали 3 мегаслова в секунду и успевали коммутировать мультиплексор после каждого сэмпла. Т.е. можно было делать так - 1,2,1,3,1,4,1,5, дальше по циклу. Т.е. с 1 входа данные идут со скоростью 1,5 MSPS, а со 2, 3, 4 и 5 - вчетверо реже.
а сейчас шина PCI просто устарела.
Проще и дешевле сделать USB plug. Правда, там тоже с Latency проблемы, и даже более зверские.

Date: 2014-05-01 09:38 pm (UTC)
From: [identity profile] vspvsp.livejournal.com
Не спорю, можно сделать столько мегагерц, сколько потянет шина и процессор делая такой "программный ввод-вывод", но всё остальное в это время замрёт совсем (прерывания придётся отключить).

Ну и тогда автору придётся всю программу его станка передать в режим ядра (при этом не накосячить в драйвере) и ждать, пока не отработает или какую-нибудь кнопку у станка сделать типа "верни управление системе" - ведь никакая другая периферия недоступна будет.

Надо выносить большую часть в мелкоконтроллер с USB за 100 р. - отлично справится!
Edited Date: 2014-05-01 09:38 pm (UTC)

Date: 2014-05-01 09:45 pm (UTC)
From: [identity profile] suvorow-.livejournal.com
Ну, у нас эти три мегаслова в секунду ещё и на жёсткий диск записывались. И как-то всё успевало. Причем, через стандартный Windows API. Правда, программировал не я, я только за железо отвечал.
Кстати, первая версия железа была сделана на микросхеме контроллера Tekram 290 - мы перекрестили на нём 6 ножек (4 на шине PCI и 2 на шине IDE), чтоб он не опознавался своими "стандартными" драйверами, а только нашими самопальными. Он, кстати, от этого попадал в класс Token Ring Network Adapter. Но нам это было пофиг :) Потом поставили чип фирмы PLX.
Edited Date: 2014-05-01 09:46 pm (UTC)

Date: 2014-05-01 09:55 pm (UTC)
From: [identity profile] vspvsp.livejournal.com
Через WinAPI вы не могли одновременно пользоваться коммутатором и записывать - он недоступен из режима ядра.

Только снять кусок данных (переключая коммутатор если угодно), выкинуть в память и затем обратиться к соответствующей функции записи на диск из пользовательской программы. Можно, наверное, пошаманить и из ядра писать на диск, но это уже не то API.

Так что на самом деле всё работало как-то иначе.

Date: 2014-05-02 06:00 am (UTC)
From: [identity profile] vspvsp.livejournal.com
Вы неверно пользуетесь терминологией в данном контексте: Jitter - дрожание фазы, неравномерность, например, периода синхросигнала. А буферизация просто даёт задержку на длину буфера, которая позволяет отвлекаться на другие дела, пока данные из него расходуются.

Автор указал, что у него ПРЯМОЕ управление коммутатором от процессора. А тут уже и контроллер и буфер (с одним "ф" по-русски пишется, кстати).

Да и у вас та же ситуация, если движками станка управляете от процессора программно формируя задержки (какой-нибудь шаговый двигатель с ШИМ на обмотках или микрошагом) или у вас есть обратная связь от датчиков положения/валкодера - особо не набуферишь, т.е. нет выигрыша по скорости и, тем более, по точности.

Date: 2014-05-02 07:17 am (UTC)
From: [identity profile] vspvsp.livejournal.com
Слил и перешел на личности?

Date: 2014-05-02 07:09 am (UTC)
From: [identity profile] suvorow-.livejournal.com
Там был маленький программный трюк - управление коммутатором шло в виде блочных данных, и, таким образом, их можно было тоже буферизовать. А для того, чтобы точно знать, какие данные в в сэмпле, в младшие 2 бита (АЦП-то был 14-битный) писались младшие два бита номера канала, с которого они получены.
Но всех деталей я, конечно, за давностью не помню. Но ведь и процессор у нас был всего лишь первый пентиум.

Date: 2014-05-02 07:26 am (UTC)
From: [identity profile] vspvsp.livejournal.com
Ну вот теперь верю!

Фактически шел опрос с заданной частотой и порядком выборки (кому-то больше выборок, кому-то меньше), а результаты снабжались меткой и писались в буфер, выгружаемый пользовательской программой.

Я и сам не вполне "честными" трюками баловался для синхронизации двух десятков каналов последовательного вывода с АЦП просто дублируя младшие биты, что всегда шумят и экономя на "железе". После нескольких десятков выборок вероятность ошибиться в синхронизации стремилась к "абсолютному нулю"
Edited Date: 2014-05-02 07:27 am (UTC)

Date: 2014-05-02 07:49 am (UTC)
From: [identity profile] suvorow-.livejournal.com
Не, ну, на самом деле, порядок опроса можно было менять на лету, просто нужно было делать упреждение, как, например, при съёмке взлёта Аполлона-17 с Луны, там оператор на Земле начинал поднимать камеру за полторы секунды до взлёта, и радиокоманда, как раз, успевала дойти.
Один из наших клиентов этим пользовался - что-то у него там взрывалось, и к разным каналам подключались внешние усилители с разным коэффициентом усиления, так что и "голова" и "хвост" процесса исследовались с примерно одинаковой эффективностью.

Вот программирование частоты опросов занимало больше времени.

Эх, были ж времена...
Когда я только пришёл в L-Card, и начал проектировать плату с интерфейсом EPP, "любимым" АЦП у нас был AD7892 - 12 бит 500 кГц, древний, как фекалии мамонта :) Причём, описания стандарта IEEE1284 у нас не было, и работу EPP мы, в итоге, оттрассировали с помощью TD386
И, кстати, через EPP в комп легко вводится 1 мегабайт в секунду. Не, ну, не очень легко, но и без большого напряжения, даже безо всяких программных "извратов".
E330 выпускалась и после того, как я уволился из L-Card-а, а АЦП этот, оказывается, выпускается до сих пор. Правда, он несколько изменился - в него добавили SPI, а тогда он был только параллельный.

Date: 2014-05-02 08:06 am (UTC)
From: [identity profile] vspvsp.livejournal.com
Ну это клиент таким незамысловатым образом расширил динамический диапазон. Точно так же можно было, например, ускорить выборки, запараллелив каналы (если АЦП несколько, а не коммутатор), но сдвинув моменты срабатывания УВХ. Сейчас народ балуется HDR в фотографии, снимая с передержкой и недодержкой и т.п.

Это вы "турбодебаггером", что ли, порты анализировали?! Мсье знали толк...

Однако вы и и на малом ресурсе, подумав, добились хороших результатов, а топикстартер лепит контроллер с пропускной способностью за 100 мегабайт в секунду для задач, где и 100 килобайт с головой хватит.

Date: 2014-05-02 10:21 am (UTC)
From: [identity profile] suvorow-.livejournal.com
Да, именно турбодебаггером. Так мы и обнаружили, что порт данных EPP находится не там, где у обычного LPT, и что в него можно пихать сразу двойное слово (4 байта) одной командой OUT DX, EAX, и, соответственно, одной командой читать четыре байта.
Сейчас-то все документы легко доступны, но в 1995 это было вовсе не так.
Вообще, народ как-то ленится применять мозги сейчас, "всё украдено до нас". Всё собирается из готовых кубиков.

Date: 2014-05-02 10:42 am (UTC)
From: [identity profile] vspvsp.livejournal.com
Ну да, в 95-м с "интернетов" было сильно меньше, только-только терминалы всяких ЕС последние выкинули.

Так учат. Когда я учился, разжёвывали всё, вплоть до элементарной логики и построения цифровых схем вручную и оптимизации всяких функций (ru.wikipedia.org/wiki/Карта Карно).
Сейчас сразу сажают за какую-нибудь IDE от любимой фирмы и вперёд, по принципу "напиши кое-как алгоритм - компилятор пережуёт - запхни в железку со 100-кратным запасом".

Profile

engineering_ru: (Default)
Инженерия

December 2025

S M T W T F S
 123456
78910111213
14151617181920
2122232425 2627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 8th, 2026 10:58 am
Powered by Dreamwidth Studios