http://vkorehovisback.livejournal.com/ ([identity profile] vkorehovisback.livejournal.com) wrote in [community profile] engineering_ru2014-05-01 04:25 pm

Как сделать PCI карту своими руками, Часть 1 (введение)

Оригинал взят у [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 карта готова.

[identity profile] soldatovdd.livejournal.com 2014-05-01 07:46 pm (UTC)(link)
Пост про то, как изобрести костыль.

[identity profile] 1500py470.livejournal.com 2014-05-01 07:56 pm (UTC)(link)
Пост воспитывает уважение к труду разработчика, даёшь больше верилога! Лучшей первомайский пост!

(no subject)

[identity profile] soldatovdd.livejournal.com - 2014-05-01 20:11 (UTC) - Expand

(no subject)

[identity profile] 1500py470.livejournal.com - 2014-05-01 20:28 (UTC) - Expand

(no subject)

[identity profile] soldatovdd.livejournal.com - 2014-05-02 04:59 (UTC) - Expand

[identity profile] serokoy.livejournal.com 2014-05-01 07:54 pm (UTC)(link)
> Осложняется все тем, что спецификация закрытая
Почему? Скачивается легко. Протокол простой...

> рискуя не вложиться в тайминги PCI шины
На современных ПЛИС это надо постараться... Тайминги на PCI перестали беспокоить (меня) на ПЛИС уже лет 10 как. 33МГц, правда, ещё не 66.

(no subject)

[identity profile] serokoy.livejournal.com - 2014-05-01 21:00 (UTC) - Expand

(no subject)

[identity profile] agathpher.livejournal.com - 2014-05-02 00:38 (UTC) - Expand

(no subject)

[identity profile] serokoy.livejournal.com - 2014-05-02 06:59 (UTC) - Expand

[identity profile] vspvsp.livejournal.com 2014-05-01 08:01 pm (UTC)(link)
Автор надеется "дёргать ножками" через PCI быстрее, чем 50 кГц LPT? т.е. 20 мкс?

Даже через драйвер в режиме ядра не гарантия, что сможет быстрее, чем 20-100 мкс сделать (ну время ISR/DPC) и то при условии, что в это время всё остальное вообще замрёт.
Edited 2014-05-01 20:04 (UTC)

[identity profile] sitlar.livejournal.com 2014-05-01 09:16 pm (UTC)(link)
Я вот тоже подумал. Намного проще было бы передавать данные параллельно через USB на микроконтроллер, который в свою очередь будет дергать за все 50 ног.
Edited 2014-05-01 21:16 (UTC)

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-01 21:20 (UTC) - Expand

(no subject)

[identity profile] sitlar.livejournal.com - 2014-05-01 21:22 (UTC) - Expand

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-04 10:57 (UTC) - Expand

[identity profile] suvorow-.livejournal.com 2014-05-01 09:23 pm (UTC)(link)
Я делал 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 проблемы, и даже более зверские.

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-01 21:38 (UTC) - Expand

(no subject)

[identity profile] suvorow-.livejournal.com - 2014-05-01 21:45 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-01 21:55 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-02 06:00 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-02 07:17 (UTC) - Expand

(no subject)

[identity profile] suvorow-.livejournal.com - 2014-05-02 07:09 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-02 07:26 (UTC) - Expand

(no subject)

[identity profile] suvorow-.livejournal.com - 2014-05-02 07:49 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-02 08:06 (UTC) - Expand

(no subject)

[identity profile] suvorow-.livejournal.com - 2014-05-02 10:21 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-02 10:42 (UTC) - Expand

[identity profile] dimorlus.livejournal.com 2014-05-01 08:43 pm (UTC)(link)
А микроконтроллер с USB не проще?

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-01 21:10 (UTC) - Expand

(no subject)

[identity profile] ikaktys.livejournal.com - 2014-05-06 07:10 (UTC) - Expand

[identity profile] ed-jan-lt.livejournal.com 2014-05-01 09:11 pm (UTC)(link)
Для России - очень полезный пост. Но лучше было начать с темы "как изобрести виндовс", это быстрее станет актуальным. :)

[identity profile] bantaputu.livejournal.com 2014-05-01 09:17 pm (UTC)(link)
Хорошо. А что пилить будете 6 осями?

(no subject)

[identity profile] bantaputu.livejournal.com - 2014-05-02 00:00 (UTC) - Expand

(no subject)

[identity profile] bantaputu.livejournal.com - 2014-05-02 00:20 (UTC) - Expand

(no subject)

[identity profile] bantaputu.livejournal.com - 2014-05-02 14:08 (UTC) - Expand

(no subject)

[identity profile] bantaputu.livejournal.com - 2014-05-02 15:57 (UTC) - Expand

[identity profile] vspvsp.livejournal.com 2014-05-01 09:42 pm (UTC)(link)
А вообще учитесь "дёргать ножками" и писать программы так, как этот дядька:

"Craft by lft"

http://www.youtube.com/watch?v=sNCqrylNY-0

Здесь формируется цветной RGB со всякими синхронизациями плюс музицирует таймерами.

Исходники прилагаются.

А то обилие ресурсов расслабляет ;)

Есть вариант и с PAL-версией, с формированием ПЦТС 0_o:

http://www.youtube.com/watch?v=sCN1bqRG-7o
Edited 2014-05-01 21:44 (UTC)

[identity profile] dimorlus.livejournal.com 2014-05-01 09:48 pm (UTC)(link)
Трудное детство, восьмибитные игрушки.

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-01 21:57 (UTC) - Expand

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-01 22:00 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-01 22:08 (UTC) - Expand

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-01 22:32 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-02 06:13 (UTC) - Expand

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-02 06:23 (UTC) - Expand

Чем Ардуино не устраивает?

[identity profile] videocontroler.livejournal.com 2014-05-02 12:26 am (UTC)(link)
> Мне понадобился качественный интерфейс для CNC станка
Чем Ардуино не устраивает? Просто не знакомы? Это электронный конструктор такой, платформа предназначенная чтобы управлять разными устройствами и считывать показания датчиков. Там роботами, станками с ЧПУ, автоматами разными, чем угодно. Всяких датчиков, приводов, интерфейсов, контроллеров к ней понаделана куча. Берите да втыкайте их просто. Ничего не надо изобретать, паять. Просто втыкаете да пишите программу, которая этим будет управлять.

[identity profile] koshovske.livejournal.com 2014-05-02 06:45 am (UTC)(link)
1 В нем много лишних деталей, которые увеличивают стоимость конечного продукта.
2 Встроенный язык скетчей плох для профессиональных задач (лишнее место в памяти, неоправданная длительность выполнения команд)

но направление в сторону микроконтроллеров верное

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-02 09:57 (UTC) - Expand

[identity profile] kulibin-d.livejournal.com 2014-05-02 06:49 am (UTC)(link)
оболочка содержит неотлавливаемые глюки, машинный код на выходе просто ужасен! для серьёзных вещей надо писать на ассемблере - код в разы компактнее и без сюрпризов.

[identity profile] kulibin-d.livejournal.com 2014-05-02 06:47 am (UTC)(link)
Если на компе какой нить *nix - ещё может быть, а вот винда не является системой реального времени. Проходили это. Управляющая прога была на TurboPas 7 - пока она была большой простынёй, всё более менее работало, как только её причесали, разнесли по процедурам - привод начал чудить. Оказалось, при вызове процедур винда перехватывает управление на опрос мыши, клавы и прочей периферии. "Простыня" просто вешала комп насмерть, но работала.

Утопично реализовывать низкоуровневый привод на большом брате. Лучше сделать внешний контроллер по принципу того же дисковода: комп даже на уровне прерываний BIOS знает только "поместить головку на такой то сектор, считать информацию/записать информацию". Сколько шагов должен сделать двигатель, как он калибруется при запуске - этим ведает контроллер, у которого нет проблем с задержками и реальным временем. Ардуина со своей костыльной оболочкой тоже не пойдёт - тут надо курить ассемблер. Тогда и небольшую очередь команд можно реализовать, и обычного USB для управления хватит. Ну и бонусами кроссплатформенность и защищённость от копирования, если хочется выйти на серьёзный уровень. А так - бомжизм какой то. Проще у китайцев купить, вполне сносно работает.

[identity profile] dimorlus.livejournal.com 2014-05-02 07:24 am (UTC)(link)
Только ассемблер - это C[++], тогда и кроссплатформенность, и прочие плюшки, вроде готового USB стека.

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-07 07:51 (UTC) - Expand

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-02 09:41 (UTC) - Expand

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-02 10:07 (UTC) - Expand

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-02 10:21 (UTC) - Expand

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-02 10:42 (UTC) - Expand

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-02 14:35 (UTC) - Expand

(no subject)

[identity profile] a e100 - 2014-05-02 18:29 (UTC) - Expand

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-02 19:18 (UTC) - Expand

(no subject)

[identity profile] a e100 - 2014-05-03 03:49 (UTC) - Expand

(no subject)

[identity profile] dimorlus.livejournal.com - 2014-05-03 09:44 (UTC) - Expand

(no subject)

[identity profile] kulibin-d.livejournal.com - 2014-05-02 10:50 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-06 16:09 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-07 06:11 (UTC) - Expand

(no subject)

[identity profile] kulibin-d.livejournal.com - 2014-05-07 06:31 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-07 06:35 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-07 07:30 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-07 08:06 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-07 16:15 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-07 17:26 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-07 19:03 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-07 16:59 (UTC) - Expand

(no subject)

[identity profile] vspvsp.livejournal.com - 2014-05-07 17:30 (UTC) - Expand

[identity profile] serbod.livejournal.com 2014-05-02 01:10 pm (UTC)(link)
Это похоже на переделку гоночного мотоцикла под мотокультиватор. =) Эффектно, но не эффективно. Выше верно пишут про контроллеры - проще взять готовый синхронный контроллер, чем превращать в синхронный контроллер целый ПК для этого совсем не предназначенный. Но мне интересно, что же из этого получится. =)

(no subject)

[identity profile] ikaktys.livejournal.com - 2014-05-06 07:18 (UTC) - Expand

[identity profile] vasiapetechkin.livejournal.com 2014-05-02 03:21 pm (UTC)(link)
а теперь представим, что нужно взять ноутбук и настроить(управлять) станок(ом) где-нибудь, где неудобно это делать стационарным компом