Jtag программатор своими руками для плис

И еще раз про программатор для ПЛИС Альтеры

Тема «как сделать программатор» для ПЛИС уже довольно старая.
На сайте сообщества 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 и этому программатору.

Источник

Программатор для ПЛИС Xilinx на AT90USB162


Понадобился мне программатор для ПЛИС Xilinx. Как оказалось, готовые программаторы достаточно дороги и труднодоступны, а доступных для самостоятельного изготовления программаторов совсем мало. Решил сделать свой программатор, путем соединения трех Open source проектов.

Из доступных для повторения имелись проекты: www.mikrocontroller.net/articles/Xilinx_USB-JTAG-Adapter (копия программатора от Xilinx, довольно сложная и использующая CPLD).
Есть программатор на FT2232H, но у меня не было этой микросхемы.
Есть программатор FPGALink, использующий AT90USB162, которая у меня была (описание программатора на русском).
Этот программатор я собрал, но он не является полноценным программатором, а XSVF player’ом, и соответственно, не поддерживается программами IMPACT и ChipScope.
Есть проект XVCD, использующий FT232. Особенность этого программатора в том, что он использует стандарт плагинов XVC — «Xilinx Virtual Cable», и поддерживается вышеупомянутыми программами.
Однако и FT232 у меня не было, а покупать ее, разводить и делать под нее плату было лень.
Но ведь у меня уже есть программатор FPGALink, и поэтому возникла мысль сделать для него XVC плагин. Однако изучение протокола XVC и протокола FPGALink показало, что команды JTAG в этих проектах передаются по разному.

После этого я обратил внимание на адаптер opendous-jtag, рассчитанный на работу с OpenOCD. В этом адаптере тоже используется контроллер AT90USB162, и протокол связи контроллера с компьютером близок к тому, что требуется XVC. Однако протокол OpenOCD не позволяет передавать по JTAG «сырые» команды, как это нужно XVC. Поэтому мне пришлось написать свой плагин, а для этого объединить исходные коды проектов xvcd (связь с IMPACT), OpenOCD (низкий уровень работы с libusb), opendous-jtag (более высокий уровень работы с адаптером). Прошивка контроллера используется от opendous-jtag, её можно скачать здесь: code.google.com/p/opendous-jtag/downloads/list

Распиновка программатора:
PORTB.0 — TDI
PORTB.1 — TMS
PORTB.4 — TCK
PORTB.5 — TDO

Получившийся плагин был проверен с IMPACT и ChipScope — работает нормально. Работа проверялась на FPGA xc3s200 (Spartan-3) соединенной последовательно с памятью xcf01. В настройках программ нужно указать использование Cable Plug-in с настройками «xilinx_xvc host=localhost:2542 disableversioncheck=true»
Для устройства требуется драйвер libusb, его можно установить при помощи программы Zadig.

Исходный код, прошивка контроллера, и сама программа, скомпилированная под x86: opendous-jtag-xvc

Источник

Программатор для ПЛИС

Хочу рассказать о том, как развивается проект 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.

Источник

Сетевой JTAG программатор для Altera Quartus Prime из Raspberry Pi3

Выпущено программное обеспечение, которое позволяет сделать из Raspberry Pi3 сетевой JTAG программатор для САПР Altera Quartus Prime. Это решение позволяет удаленно загружать FPGA Altera/Intel и даже вести удаленную отладку с помощью инструмента SignalTap. Далее расскажу,
как использовать это ПО.

Вообще-то все это ПО создавалось ради платы расширения Марсоход2RPI, которая показана выше на фото. Плата имеет на борту ПЛИС Intel Cyclone IV и может подключаться через переходник к Raspberry Pi3 / Pi2 / Pi-Zero. Описывать здесь плату пожалуй подробно не буду, о ней уже писали на geektimes. Однако, ничто не мешает использовать это же программное обеспечение самостоятельно с другими FPGA платами — все, что нужно сделать — это изготовить простой JTAG провод и подключить его к GPIO микрокомпьютера распберри. Там всего-то нужны четыре сигнала tck → GPIO7, tms → GPIO0, tdi → GPIO11 и tdo ← GPIO1, ну и конечно, хорошая «Земля»/GND.

Честно говоря, использовать Raspberry Pi в качестве JTAG программатора было возможно и раньше. САПР Quartus Prime позволяет при компиляции проектов генерировать SVF файлы, а сервер OpenOCD может загружать SVF файлы в ПЛИС через GPIO пины распберри.

Однако, к сожалению, OpenOCD нельзя использовать в связке с самой САПР Quartus.
Теперь у нас есть другое ПО, где это возможно. Программное обеспечение можно скачать бесплатно без регистрации и без SMS вот здесь, на сайте проекта.

Архив содержит два файла.

Файл nw_jtag_srv — это исполняемый файл для raspberry pi. Является JTAG сервером, управляемым по UDP/TCP сети.

Вот так запускается nw_jtag_srv на распберри в консоли терминала. Использую sudo, так как нужен доступ к GPIO:

Второй файл из архива jtag_hw_net_blaster64.dll — это драйвер для Altera Quartus Prime. Его нужно переписать в папку c:\altera\17.0\quartus\bin64 ну или другую папку в зависимости от используемой версии квартуса.

После этого, запуская «программатор» из среды квартуса можно обнаружить новый сетевой программатор (конечно если между вашим компьютером и распберри есть сеть/связь). Имя обнаруженного сетевого программатора содержит IP адрес распберри:

Далее все как обычно. Можно делать определение подключенного чипа, загружать ПЛИС.
Более того, сетевой программатор обнаруживается в Altera SignalTap и можно удаленно смотреть сигналы в анализируемой ПЛИС:

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

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

Источник

Еще один простой программатор ПЛИС

В прошлой статье я писал, что такое 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:

  1. CreateFile(..) — используется, чтобы открыть последовательный порт
  2. EscapeCommFunction(..) — с параметрами SETRTS или CLRRTS для установки или сброса сигнала TDI
  3. EscapeCommFunction(..) — с параметрами SETDTR или CLRDTR для установки или сброса сигнала TMS
  4. EscapeCommFunction(..) — с параметрами SETBREAK или CLRBREAK для установки или сброса сигнала TCK
  5. 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. Немного мудрено получилось, но работает.

Источник

Оцените статью