Предыстория
У меня уже давно валялась демо плата Марсоход 2 и вот только сейчас появилось время в ней поковыряться.
Я достаточно наслышан о подводных камнях при разработке под FPGA, но я не ожидал что я начну спотыкаться на самом первом этапе - подключения демо платы к ПК.
Посокрушавшись об отсутствии нативной Quartus'овской поддержки я собрал прошивалку mbftdi. К моему удивлению и она меня тоже послала лесом.
Оказалось, что <a href="aquartus2">Quartus II</a> v13.1 генерирует для EP3C10E144 в .svf файле для
первого проекта
секцию TDI длинной 2944296 бит, причём сами данные были разбиты на несколько тысяч строк. На сколько я понял Квартус делает подобную фигню из соображений скорости заливки: меньше оверхед на сброс и переключение в SDR заново. Проблема в том, что mbftdi на такие трюки не рассчитана. Покопавшись в коде, выяснилось, что mbftdi ... скажем так, поддерживает очень ограниченную спецификацию SVF формата.
В глубокой депрессии от бесполезности этой очень крутой железяки и безысходности своего положения я погрузился в настолько глубокое отчаяние, что был близок к тому чтобы переписать этот ... скажем так, код. Но перед этим я вознёс краткую молитву Всезнающему защитнику нашему с просьбой указать ... погуглил, короче.
Программа.
Оказывается добрые дяденьки уже написали всё необходимое для решения данной проблемы. Чудо сие UrJTAG именуется. Это GNU пакет, включающий инструкции jtag для небольшого набора популярных чипов, драйвера коннекторов и командную оболочку. И что самое важное, в командной оболочке есть команда `svf`, лексер которой построен с полной поддержкой спецификации формата(у самой команды есть ограничения с которыми можно ознакомиться в файле /usr/share/doc/urjtag/UrJTAG.txt.gz, но на работоспособность векторных файлов для марсохода они не влияют)
Первый тест.
Далее предполагается что мы пользуемся линуксом с debian-вкусом(обладатели других дистрибутивов могут обратится к своему драгдиллеру за дополнительной информацией о их пакетном менеджере)
Установка
$ sudo apt-get install urjtag
ну и запускаем
$ jtag
UrJTAG 0.10 #1502
Copyright (C) 2002, 2003 ETC s.r.o.
Copyright (C) 2007, 2008, 2009 Kolja Waschk and the respective authors
UrJTAG is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
There is absolutely no warranty for UrJTAG.
WARNING: UrJTAG may damage your hardware!
Type "quit" to exit, "help" for help.
jtag>
Первое что нам нужно сделать - подключиться к железяке. Для этого существует множество драйверов, список которых можно получить набрав:
Нас интересует самый постой - FT2232 драйвер.
jtag> cable FT2232 help
Usage: cable FT2232 [vid=VID] [pid=PID] [desc=DESC] [driver=DRIVER]
VID vendor ID (hex), defaults to 0000
PID product ID (hex), defaults to 0000
DESC Some string to match in description or serial no.
DRIVER usbconn driver, either ftdi-mpsse or ftd2xx-mpsse
defaults to ftdi-mpsse if not specified
jtag>
Как видно нам хорошо бы знать айдишники вендора и продукта. Ну так давайте их таки и узнаем, запустив еще один терминал и набрав(естественно в этот момент Марсоход надобно к компу таки подключить)
$ lsusb | grep -i ft2232
Bus 001 Device 020: ID 0403:6010 Future Technology Devices International, Ltd FT2232C Dual USB-UART/FIFO IC
$
(Если lsusb не нашёл наш девайс то надо копать в сторону udev и глубже в libusb... но это совсеееем другая история)
Вооот, в нашем случае вендор айди - 0403h, а прдукт айди - 0601h. Подключаемся к девайсу
jtag> cable FT2232 vid=0403 pid=0601
Connected to libftdi driver.
jtag>
Следующий этап - определение jtag-chain. Это делается с помощю команды `detect`:
jtag> detect
IR length: 10
Chain length: 1
Device Id: 00000010000011110001000011011101 (0x00000000020F10DD)
Manufacturer: Altera
Unknown part!
chain.c(149) Part 0 without active instruction
chain.c(200) Part 0 without active instruction
chain.c(149) Part 0 without active instruction
jtag>
Ой, а это что за ерунда. Дело в том что UrJTAG не знает про все девайсы на свете и наш циклон как раз в числе неизвестных. К счастью, исправить это досадное недоразумение достаточно просто - достаточно иметь .BSD файл для нашего чипа, который Altera любезно
предоставила
. Скачав его куда-нибудь, надо рассказать UrJTAG`у о нашей находке:
jtag> bsdl path /директория/в/которой/лежит/наш/замечательный/файл
jtag> detect
IR length: 10
Chain length: 1
Device Id: 00000010000011110001000011011101 (0x00000000020F10DD)
Filename: /home/chuiii/develop/programing/verilog/bsdl/EP3C10E144.BSD
jtag>
Всё готово к заливке
jtag> svf /путь/к/файлу/проекта.svf
Вот и всё - плата весело мигает диодами и на мониторе отображаются цветные полосы. Ура.