Как я оживлял EPM7128S

Изменено: . Разместил: FadeDemon | Меню
Количество просмотров4`310 / FD2015-6-0

Как-то раз, попалась мне плата, содержащая на борту весьма экзотическое сочетание компонентов. На ней уживались вместе процессор Intel i386 EX (KU80386EX33) с RAM и флешь-памятью, сигнальные процессоры ADSP-2168N в изрядном количестве, и что самое удивительное, ТТЛ микросхемы российского производства, а именно ЭКФ1533АП6 и ЭКФ1533ИР33. Конечно, сии детальки поспешили пополнить мою коллекцию, но внимание привлекло кое-что другое. На плате располагалась ПЛИС серии Altera MAX II, а именно EPM7128SLC84-15. Немного почитав о ней, и увидев, что она умеет питаться от 5 вольт и содержит 2500 логических элементов, мне невыносимо захотелось прикрутить её к своему маленькому проэктику, и заставить её приносить в нём пользу. Ну, а если мне чего-то захотелось…


Без названия
Рис. №1040. EPM7128SLC84-15. Как она выглядит.

В нашей ПЛИС мне ещё понравилось то, что она, как можно заметить, имеет корпус PLCC с большим шагом ножки, что делает возможным без большого геморроя припаять её к самодельной плате, которую, конечно-же предварительно надо будет развести. Кстати это было первое, с чего я начал.


Разводим плату


Собственно, как всегда всё усложняя, на одну плату с ПЛИС я решил водрузить имеющийся у меня лишний микроконтроллер ATMega8535 в здоровенном DIP-40 корпусе. Да, я не люблю мелкие корпуса… Идея была такова, что микроконтроллер будет общаться с внешним миром (другой атмегой) по I2C, и по необходимости как-то передавать данные в ПЛИС. Как именно, я долго думал, и ввиду моей любви к велосипедам, а так-же того факта, что мой маленький проэктик делается исключительно для себя, я решил сконструировать свой, пардон, протокол передачи. Всего микроконтроллер и ПЛИС соединяют 4 дорожки. Одна из них — тактовая частота для синхронизации передаваемых/принимаемых данных, которую всегда задаёт микроконтроллер. Просто потому, что это удобно: из AVR менять состояние ножки легко, а вот отслеживать её изменение, если это не ножка прерывания, уже совсем не просто. А в ПЛИС можно элементарно отслеживать изменение уровней на ножках, да ещё и на частотах, в десяток-другой раз превышающих частоту работы МК.


Однако, помимо синхронизирующего сигнала, надо передавать и данные, которые мы, собственно, синхронизируем. Для этого использоваться будут оставшиеся 3 ножки. Две из них, будут образовывать 2-х битную шину данных, по которой данные будут передаваться в ПЛИС, и оставшаяся ножка образует канал передачи в обратном направлении: из ПЛИС в МК. Так я решил сделать, из того расчета, что для направления МК → ПЛИС скорость может потребоваться больше, чем в обратном направлении. В целом, ничего не мешало бы подключить 8 ног в одну сторону, и 8 в другую, или сделать двунаправленную шину, но я не стал. Ноги я решил экономить, а двунаправленная шина не позволила бы вести полнодуплексную передачу, что усложнило бы программирование всего этого. Впрочем, эти тонкости для нас не так важны. Почитав даташит на ПЛИС, подумав, и поработав пилой в Sprint Layout, получилось примерно вот что:


Плата для EPM7128S (вид сверху)
Рис. №1041. Плата — вид сверху

Плата для EPM7128S (вид снизу)
Рис. №1043. Плата — вид снизу

Разводка весьма брутальна и бессердечна, всё что касается микроконтроллера вообще было содрано с другой моей платы, но это в целом не важно. Всё что требуется — правильно подключить все ноги питания, земли, и сделать возможность подключения программаторов. Для микроконтроллера это ISP разъём, а для ПЛИС — JTAG. Ну, и минимальная периферия, конечно-же, в виде кварца, кнопки сброса (ну хочется мне кнопочку RESET иметь), и большого количества фильтрующих конденсаторов, которых много никогда не бывает. Был разве что случай, когда их оказалось мало, и из-за этого МК адово глючил при управлении динамиком-пищалкой.


Надо еще вспомнить, что помимо микроконтроллера, ПЛИС тоже нуждается в тактовом сигнале. Не так сильно, конечно, как МК, но тем не менее. А самое простое, что можно тут придумать, это брать тактовый сигнал с ноги XTAL2 микроконтроллера, предварительно установив в единичку CKOPT в его FUSE-битах. Всё дело тут в том, что XTAL2 это выход инвертирующего усилителя (XTAL1, как нетрудно догадаться, вход), который заставляет работать кварц, и поэтому на нем присутствует вполне пригодный тактовый сигнал, которым можно тактировать что-либо извне. Вот только если бит CKOPT установлен в ноль, сигнал этот имеет чрезвычайно маленькую амплитуду, сотни милливольт, что явно недостаточно.


Распиновки для ISP, JTAG, ATMega8535, EPM7128S
Рис. №1044. Всё, что нужно, чтобы понять происходящее

Итак, чтобы лучше понимать происходящее, взглянем на картинку выше. Нам нужно установить разъёмы JTAG (для ПЛИС) и ISP (для микроконтроллера), для каждого из них нужно соединить по 5 выводов. Для ISP это MISO, MOSI, SCK, RESET, GND, для JTAG — TCK, TDO, TMS, TDI и тоже GND. Куда же без GND. Думаю, по двум схемам выше, понятно, что куда надо подключать… Тактовый сигнал ПЛИС, кстати, надо подавать на вывод 81 (GCLK1), именно поэтому в разводке он соединён с XTAL2.


Стадия №2: прошивка


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


Собранная плата с ATMega8535 и ПЛИС на боту
Рис. №1045. Собранная плата с ATMega8535 и ПЛИС на боту

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


Прошивать AVR микроконтроллеры через USBasp к тому времени я уже умел, там вопросов (впрочем, как и проблем) не возникло. А вот JTAG… Впрочем, интернеты переполнены подобного рода информацией. Для прошивки ПЛИС Altera существуют 2 официальных девайса: USB-Blaster и ByteBlaster, для работы коего нужно наличие порта LPT. Не вдаваясь в подробности, мною была слизана с marsohod.org МАКСИМАЛЬНО простая схема ByteBlaster'а, а именно:


Минимальный ByteBlaster
Рис. №1046. Простейший ByteBlaster. © marsohod.org

Да, это простейший программатор. Не без удивления можно заметить, что в нём ничего нету, кроме проводов… Нужно просто взять паяльник, взять разъём, и поглядывая на картинке выше, не забывая про распиновку самого разъёма JTAG, спаять эту штуку. После этого, как можно заметить, нужно будет ещё достать компьютер, содержащий LPT порт, кои в наше время стали большой редкостью… Впрочем, у меня это заняло 10 минут. Или 5. Не суть… Как только у нас имеется такой компьютер, на него надо водрузить Quartus II. Чтобы не было геморроя, желательно использовать Quartus II Web Edition. После установки, надо будет установить драйвера программатора на LPT порт, для этого зайдём в папку установки Квартуса, и найдём там папку qprogrammer, в ней папку bin, и запустим находящийся в ней файлик bblpt.exe с параметром /i. Если проще, то надо открыть CMD (командную строку), и там написать что-то вроде


Код:
C:
cd C:\Altera\qprogrammer\bin
bblpt /i

Папку, понятное дело, свою надо вписать, если она другая. После этого должно появиться окно, сообщающее об успехе. Если этого не произошло, остаётся… Ну… Грустить, например. А вообще, такое вроде может случиться только из-за неисправного LPT порта. Можно еще поэкспериментировать с его настройками в BIOS, кстати там же его можно и включить, если его вдруг нету в списке устройств. Впрочем, у меня всё прошло без проблем.


На этом этапе, предположим, что у вас уже в Квартусе есть проект, который вы неудержимо желаете засунуть внутрь ПЛИС. Тогда, проект этот открываем, и действуем примерно следующим образом:


Как добавить LPT в программатор Quartus II
Рис. №1047. Как добавить LPT в программатор Quartus II

В диалоговом окне Add Hardware нужно выбрать ByteBlaster, после этого он появиться в списке в окне Hardware Setup. После этого, возвращаемся в главное окно программатора, и… И вот здесь уже понадобятся бубен и танцовщицы.


На самом деле, мы почти у цели, но есть одно НО. Я уверен почти на 95%, что простым втыканием кабеля в разъём здесь вы не обойдётесь. Может быть у меня корявый LPT-порт, или корявые руки, но на этом пункте я первый раз довольно надолго завис. Проблема была в том, что ПЛИС если и определялась через Auto Detect, то может быть 1 раз из 100 попыток. О прошивке вообще не могло быть речи. Однако, один раз её таки получилось прошить, как-то хитро приложив палец к контактам разъёма. Один раз. Второй раз не получалось. Очевидно было, что дело в помехах, или чём-то подобном… Надо заметить, что где-то или в даташитах, или других источниках есть рекомендации вешать резисторы между питанием и некоторыми контактами JTAG. Но мне они не помогли, и поэтому даже приводить их не буду. Я пошел с другого конца, и исследовал плату, из которой ПЛИС была выдрана изначально. Там всё было довольно брутально: все выводы TCK, TDO, TMS и TDI были соединены через резисторы в 1 кОм с питанием. Однако копирование этой схемы помогло мало, хотя и немножко помогло. ПЛИС стала определяться чуть чаще, и появилась возможность прошивать её примерно через раз, если правильно палец держать на ножках. Однако такой расклад меня не устраивал, и я начал экспериментировать…


В итоге, после длительных экспериментов по методу тыка оказалось, что все эти проблемы решает конденсатор на 390 пикофарад, включённый между питанием и TCK. Конденсаторы меньших номиналов, не решали проблему — верификация не проходила в 2/3 случаев. Только припаяв этот конденсатор, мне таки удалось загрузить в плис мой 24-разрядный счётчик, который сразу же принялся считать тактовые импульсы, и приветливо мигать диодиками.


Коротко на заметку


Итак, чтобы заставить работать вот такой вот брутальный ByteBlaster, достаточно было соединить резисторами на 1 кОм выводы TCK, TDO, TMS, TDI с питанием (5 вольт в моем случае), и затем между TCK и питанием повесить конденсатор на 390 пФ. Думаю, если ваша проблема будет схожа, то это её должно решить. Потом как нибудь напишу про отладку передатчика, который я описал в начале статьи в ModelSim. Его, кстати, удалось реализовать на Verilog. А сейчас, приятных всем снов…

Ключевые слова эксперимент, ПЛИС, Altera, EPM7128SLC84-15, ATMega8535, JTAG, LPT, Quartus II
QR-код
Интересное
HV relay driver, или продолжение темы зарядовых насосов Задача сего устройства — зарядить конденсатор до 36 вольт, разрядить его на обмотки электромагнитов, и подать на них небольшое постоянное напряжение, для поддержки их включенными.

Читать »»
Случайные фото