И еще раз про программатор для ПЛИС Альтеры
Тема «как сделать программатор» для ПЛИС уже довольно старая.
На сайте сообщества easyelectronics уже было несколько статей на эту тему.
Например:
1) http://we.easyelectronics.ru/plis/usb-blaster.html
автор hellraiser
Как правило, программаторы строятся на микроконтроллере PIC, но есть и другие схемы. Обычно программаторы имитируют родной Альтеровский UsbBlaster, с той целью, чтобы получить совместимость с Альтеровскими же драйверами.
Тем не менее, предлагаю обратить внимание на альтернативный вариант: построение программатора на микросхеме FTDI FT2232HL
Использование специализированной микросхемы лучше тем, что
1) это проще и надежней;
2) в ней есть специальный интерфейс для JTAG;
3) это USB2.
Дальше…
Красота этой идеи заключается в том, что, возможно, многие уже сделали себе переходник USB-COM на новой микросхеме FTDI FT2232HL, а значит теперь это же устройство может быть использовано и как программатор для ПЛИС Альтеры, вместо USBBlaster. Только интерфейс JTAG микросхемы нужно вывести на разъем.
Сама схема устройства очень проста, фактически она повторяет рекомендации самой FTDI по использованию микросхемы FT2232.
Вот пример такого программатора — MBFTDI из проекта http://marsohod.org:
Интересно, что недавно на этом же сайте появились доступные для скачивания драйвера к Altera Quartus II и этому программатору.
Источник
Простой программатор для ПЛИС фирмы Altera
Данный программатор вполне может заменить подключаемый к LPT-порту фирменный ByteBlasterMV. Электрическая принципиальная схема представлена на рис.1. Длина кабеля, соединяющего корпус разъема DB-25M (подключается к LPT-пору компьютера) с Вашим разъемом, подключаемым к плате, на которой находится программируемая ПЛИС, не должна превышать 0,4 м. Так же не рекомендуется стягивать провода, идущие от разъема к разъему, в очень крепкий жгут, в случае, если у вышеуказанных проводов тонкая изоляция, поскольку при этом возможно образование поразитных связей между проводниками, что может привести к неработоспособности программатора.
Улучшить эксплуатационные характеристики программатора путем удлинения кабеля между разъемами можно, если каждую сигнальную линию выполнить витой парой, как показано на рис.2. В этом случае длина кабеля может составлять более 1 м.
Работоспособность обоих вариантов неоднократно проверена на семействах MAX7000, MAX3000A, FLEX10K.
Приведенные конструкции можно упростить, исключив резисторы R (тоже работает), но все-таки не стоит этого делать.
Источник
Еще один простой программатор ПЛИС
В прошлой статье я писал, что такое JTAG и TAP контроллер. Эти знания нам помогут сделать свой простой программатор для ПЛИС компании Альтера.
Я хочу сделать очень простой программатор, который будет работать через последовательный порт. Последовательный порт хорош тем, что он весьма распространен, прост в программировании и, к тому же, существуют недорогие устройства USB-to-COM. Есть надежда, что мой программатор будет работать и через такой переходник. На компьютере я буду запускать мою специальную программу, управляющую программатором. Нам ее предстоит написать (в смысле я ее уже написал и расскажу как она работает).
Итак, в разъеме JTAG есть 4 существенные для нас сигнала: TDI, TMS, TCK и TDO.
Первые три сигнала являются входами для программируемой микросхемы ПЛИС, то есть мы с компьютера должны ими управлять. Управление каждым сигналом должно быть произвольным, любой из них мы можем в любой момент времени установить или сбросить. У последовательного порта есть несколько сигналов, подходящих для этих целей:
- RTS — он будет соответствовать сигналу TDI интерфейса JTAG
- DTR — он будет соответствовать сигналу TMS
- TX — будет соответствовать сигналу TCK
Кроме этого, на JTAG есть выходной сигнал TDO, состояние которого нам нужно уметь читать с компьютера. Будем использовать для этих целей сигнал CTS последовательного порта.
С сигналами разобрались, но есть одна проблема. Нужно сделать преобразователь уровней сигналов последовательного порта. Конечно можно использовать специализированные микросхемы преобразователей уровня, их существует великое множество. Например, вот такая есть микросхема
Мы (как всегда) пойдем своим путем. Сделаем программатор по вот такой схеме:
Несколько резисторов, стабилитроны, светодиоды для отладки программы и.. это все — проще не бывает.
Вот фотографии нашего программатора, вид сверху:
Программу я буду писать на языке C в среде Microsoft Visual Studio v10.
Моя программа будет состоять как бы из двух логических частей. Первая часть — это управление сигналами последовательного порта, а значит это и управление сигналами JTAG. Вторая часть программы — это чтение *.SVF файла, его интерпретация и последовательное исполнение. В прошлой статье я писал, что SVF файл описывает последовательность команд для TAP контроллера программируемой микросхемы. Среда Altera Quartus II может генерировать SVF файлы для откомпилированных проектов.
Для управления последовательным портом я буду пользоваться API функциями OS Windows:
- CreateFile(..) — используется, чтобы открыть последовательный порт
- EscapeCommFunction(..) — с параметрами SETRTS или CLRRTS для установки или сброса сигнала TDI
- EscapeCommFunction(..) — с параметрами SETDTR или CLRDTR для установки или сброса сигнала TMS
- EscapeCommFunction(..) — с параметрами SETBREAK или CLRBREAK для установки или сброса сигнала TCK
- GetCommModemStatus(..) — чтобы прочитать состояние линии CTS и соответственно узнать значение сигнала TDO от интерфейса JTAG
В программе определены две очень важные функции:
int sir(int nclk, int val);
int sdr(int nclk, int val);
Первая функция sir(..) записывает в регистр команд TAP контроллера программируемой микросхемы значение val длинной nclk бит. Вторая функция sdr(..) записывает в регистр данных TAP контроллера программируемой микросхемы значение val длинной nclk бит.
Функции выглядят примерно одинаково и делают примерно одно и то же. Используя сигнал TMS и TCK они переводят TAP контроллер в состояние записи соответствующего регистра IR или DR согласно диаграмме состояний (TAP state-machine) описанной в предыдущей статье. Сигнал TDI используется для последовательной передачи данных в регистр TAP, а сигнал TDO используется для чтения из контроллера ответных данных.
Теперь об интерпретаторе SVF файла.
Итак, Вы сделали проект для ПЛИС, откомпилировали его с помощью Quartus и получили SVF файл для программирования микросхемы.
SVF — это текстовый файл. Наша программа будет построчно считывать его и интерпретировать команду в этой строке и исполнять ее. Я не знаю всех подробностей стандарта SVF файлов, но то что я вижу в файле сгенерированном квартусом — это очень простой файл. Одна строка — одна команда. Нет никаких условных или безусловных переходов или подпрограмм. Таким образом, чтение и построчное исполнение SVF файла — вполне удобное для нас решение.
Собственно нужно реализовать только несколько основных команд: RUNTEST, SIR, SDR. Как вы конечно догадались команда SIR — записать число в регистр команд TAP и SDR — записать число в регистр данных. RUNTEST — это пауза, когда контроллер остается в состоянии IDLE. Скажу честно, что паузы я в своей программе выдерживаю не строго. У нас и так получится очень медленная частота записи из-за программной реализации протокола передачи. Так что выдерживать паузы согласно SVF надеюсь не обязательно.
Ну вот собственно программа написана и откомпилирована с помощью Visual Studio.
Вы можете скачать ее исходники и бинарный файл на нашем сайте:
Программа консольная, принимает 2 параметра в командной строке: имя последовательного порта и имя файла SVF. Например, вот так:
c:\MarsBlaster.exe COM4 my_proj.svf
Подключаю плату Марсоход к нашему программатору, подключаем его к компьютеру подаем питание.
Вот как идет программирование:
Вот еще видео, как идет программирование с другого ракурса:
Похоже все работает.
PS: ложка дегтя.
Через переходник USB-to-COM тоже работает, но очень медленно. Программирование платы Марсоход (включая проверку после записи) занимает около 5 минут. Причина в том, что управление сигналами идет через USB и чтение ответного сигнала TDO занимает очень много времени (2-3 миллисекунды). Избавиться от этого вот так просто не получится. Нужно делать более сложный программатор, с более сложной логикой работы, что бы обмен вести не побитно, а хотя бы байтами, тогда можно сделать гораздо быстрее.
Ну и еще обратите внимание на схеме программатора есть «обратная связь» с 6й на 3ю ножки разъема COM порта. Это то же нужно — как раз для работы через переходник USB-to-COM. Эта обратная связь позволяет точно сказать пришли ли данные о статусе TDO или еще нет. Я устанавливаю TCK и читаю через обратную связь его же — пришел он или еще нет. Если пришел, значит с ним пришел и TDO. Немного мудрено получилось, но работает.
Источник
Программатор для ПЛИС
Хочу рассказать о том, как развивается проект http://marsohod.org.
Цель проекта — популяризация проектирования для ПЛИС.
Тема ПЛИС постепенно набирает популярность — и совершенно заслуженно. Ведь теперь мы фактически получили простую возможность создать свою цифровую микросхему. Вам не потребуется нано-фаб и миллион долларов — все можно просто сделать имея компьютер и микросхему ПЛИС на плате разработчика. Вы знаете, что 90% производителей микросхем в мире не имеют собственных фабрик? Они проектируют и тестируют в ПЛИС, а производство заказывают сторонним производителям.
Когда-то и программирование микроконтроллеров считалось чуть ли не чудом. Теперь можно купить платку Ардуино и научить старшеклассника «мигать светодиодом».
Я хочу показать, что и ПЛИС — это вполне доступная технология.
Плата «Марсоход» — это самый простой и дешевый девелопер кит на микросхеме ПЛИС компании Альтера EPM240T100C5. Проект — опен соурс — схемы платы есть на нашем сайте. Кроме того, опубликованно уже более 50 проектов выполненных на базе нашей платы.
Дальше я расскажу о программаторе для ПЛИС. Считается, что учиться проектированию ПЛИС гораздо дороже, чем учиться микроконтроллерам. Отчасти это мнение связано с тем, что программаторы вендоров ПЛИС довольно дороги.
Теперь есть альтернатива. Вы сможете сделать простой программатор USB сами!
Мы разработали очень простой программатор на микросхема FTDI FT2232HL. Вот такой:
Это USB программатор с интерфейсом JTAG. Его схема так же есть на сайте, значит при желании вы сможете его сами сделать:
Программное обеспечение, которое мы сами написали к нему — это SVF Player. Кратко расскажу, как это работает.
Среда проектирования для ПЛИС Altera Quartus II позволяет в процессе компиляции вашего проекта создавать файлы для программаторов в разных форматах: POF, SOF, JAM, SVF. Среда проектирования Xilinx ISE так же позволяет создавать SVF файлы.
Файлы в формате SVF — это простой текстовый файл с описанием команд, которые нужно передать в микросхему ПЛИС через интерфейс JTAG для программирования. Файл SVF (Serial Vector Format) может выглядеть вот так:
!
FREQUENCY 10000000.00 HZ;
!
TRST ABSENT;
ENDDR IDLE;
ENDIR IRPAUSE;
STATE IDLE;
SIR 10 TDI (2CC);
RUNTEST IDLE 10003 TCK ENDSTATE IDLE;
!
!CHECKING SILICON ID
!
SIR 10 TDI (203);
RUNTEST 53 TCK;
SDR 13 TDI (0089);
SIR 10 TDI (205);
RUNTEST 53 TCK;
SDR 16 TDI (FFFF) TDO (8232) MASK (FFFF);
SDR 16 TDI (FFFF) TDO (2AA2);
SDR 16 TDI (FFFF) TDO (4A82);
SDR 16 TDI (FFFF) TDO (0C2C);
SDR 16 TDI (FFFF) TDO (0000);
!
!BULK ERASE
!
SIR 10 TDI (203);
RUNTEST 53 TCK;
SDR 13 TDI (0011);
SIR 10 TDI (2F2);
В микросхеме позади интерфейса JTAG есть так называемый TAP контроллер, который управляет процессом тестирования и программирования микросхем ПЛИС. В TAP контроллере есть два регистра: регистр команд IR и регистр данных DR.
Основные команды в SVF файле — это передача данных в регистр инструкций (команда SIR) и передача в регистр данных (команда SDR).
Например, команда SIR 10 TDI (203); говорит, что нужно передать в регистр IR десятибитное число 0x203. Еще пример: команда SDR 16 TDI (FFFF) TDO (2AA2); говорит, что нужно передать в регистр DR шестнадцатибитное число 0xFFFF, но в ответ микросхема должна обязательно прислать число 0x2aa2. Еще одна важная команда — это RUNTEST. Она позволяет выдерживать паузы заданной длительности при программирования. Обычно паузы выдерживаются в состояниях TAP контроллера IDLE, IRPAUSE или DRPAUSE.
Правильно исполняя команды из SVF файла можно «зашить» микросхему ПЛИС. Это и делает наша программа SVF плеера MBFTDI.
Интерфейс программирования и тестирования микросхем JTAG имеет всего четыре основных сигнала для передачи данных: TCK — сигнал тактирования, TMS — сигнал управления передачей, сигнал TDI — данные передаваемые в микросхему и TDO — данные читаемые из микросхемы. Для передачи данных в регистры TAP контроллера IR и DR нужно понимать, как управлять состоянием этого контроллера. Попробуем с этим разобраться.
На самом деле все довольно просто. Состояния TAP контроллера описываются вот такой машиной состояний:
TAP контроллер меняет свое состояние во время импульса сигнала TCK и в зависимости от значения сигнала TMS.
Например, видно, что для того, чтобы сбросить TAP контроллер в состояние RESET из любого другого состояния достаточно держать TMS в единице не менее 6 импульсов TCK. Если нужно перейти из состояния RESET в IDLE нужно перевести TMS в ноль и подать хотя бы один импульс TCK. Из IDLE в состояние передачи данных в регистр инструкций SHIFT_IR — это просто 4 импульса TCK при изменении TMS на 1-1-0-0.
В нашем программаторе MBFTDI мы используем микросхему FTDI FT2232HL в которой уже реализовано управление всеми этими линиями JTAG. Наша программа SVF плеера MBFTDI считывает SVF файл, интрепретирует его и посылает команды микросхеме FTDI управляя линиями JTAG. Описание JTAG команд микросхемы FTDI есть вот здесь.
Мы уже протестировали наш программатор с микросхемами Altera серии MAX II, Cyclone II, Cyclone III и некоторыми микросхемами Xilinx.
Конечно, программатор работает и в Windows и в Linux.
Конечно исходники доступны на нашем сайте в разделе загрузки или на GITHUB.
Источник