FPGA & Verilog БлогFPGA chips

САПР Altera Quartus II / Intel Quartus Prime, язык Verilog HDL и кое-что про VHDL, FPGA Cyclone III, Cyclone IV, MAX II, MAX10. Платы разработчика серии Марсоход, Марсоход2, Марсоход3.


QuartusPrime19.1

Компания Intel уже довольно давно выпустила очередную версию САПР Quartus Prime, но вот наконец дошли руки попробовать. Я скачал Quartus Prime Lite Edition версии 19.1 для WIndows и для Linux. Инструкция для скачивания есть здесь. Пробовать я буду соответственно в Windows 10 Professional и в Ubuntu Desktop 18. Надо сказать, что 19.1 - даже на сегодняшний день не самая последняя версия. Точнее говоря, для Lite Edition - это последняя, но вот для версии Quartus Prime Pro Edition последняя версия уже сейчас 19.4. Ну, что же, для моих несложных проектов всегда хватало и бесплатной Lite Edition.

В Release Notes описаны изменения в программном обеспечении для новой версии. Из основного:

  • в проектах VHDL возможно придется модивицировать пути к модулям удаляя ведущий слэш "/" в файле QSF;
  • при использовании NIOS придется отдельно вручную ставить Eclipse IDE для NIOS;
  • удалена поддержка WIndows 7, 
  • удалена поддержка некоторых IP ядер для некоторых семейств микросхем, например, удалены IP DDR/DDR2 для Cyclone IV.

Отдельно говорится о том, что теперь Quartus Prime будет использовать подсистему WSL (Windows Subsystem for Linux), и якобы это должно дать прирост в производительности. Честно говоря не очень понятно для каких версий квартуса это будет работать. Я поставил Lite Edition и не ставил никаких WSL. Все работает, как и работало раньше. Возможно это все будет только для версий Standard или Pro.

Кроме этого, упомянуто, что в новой версии Quartus сделаны security updates, ну вероятно закрыты какие-то проблемы с безопасностью ПО. Наверное это важно.

Но меня, честно говоря в первую очередь интересует, как с новой версией квартуса будет работать наш программатор MBFTDI. Если кратко - работает. Если нужны подробности, то читайте дальше.

usb host block schema

В предыдущей статье я рассказал, как запустил свой собственный велосипед USB хост контроллер и как он работает в железе в плате Марсоход3. Там я в основном рассказывал, как взаимодействует управляющая программа с контроллером. Но вот как работает мой контроллер? Чтобы разобраться в этом нужно провести Verilog симуляцию.

Внутреннее устройство моего контроллера схематично показано рисунке выше.

Внутри контроллера есть:

  • входное FIFO, модуль generic_fifo_dc_gray fifo_in, сюда складываются все входящие команды и данные;
  • выходное FIFO, модуль generic_fifo_dc_gray fifo_out, отсюда внешние устройства будут забирать результат исполнения команды;
  • временное FIFO, generic_fifo_dc_gray fifo_out_tmp, где временно хранятся принятые из USB шины байты;
  • модуль USB передатчика ls_usb_send ls_usb_send_;
  • модуль USB приемника ls_usb_recv ls_usb_recv_;
  • машина состояний по регистру состояний state.

Рисунок довольно схематичный, но в целом отражает происходящее в хост контроллере.
Далее расскажу подробнее.

USB host controller schema in Intel Quartus Prime

Я сделал USB хост контроллер в FPGA для подключения Low Speed устройств, клавиатур или мышей. Немного расскажу про этот проект. Контроллер делается для платы Марсоход3/Марсоход3bis плюс шилд разъемов. Тем не менее, так же все должно работать и на платах Марсоход2 или Марсоход2bis или других FPGA платах (если сделать правильные назначения сигналов проекта). В этом проекте есть два компонента, аппаратный и программный:

  • USB хост контроллер выполнен в среде Intel Quartus Prime Lite, топ модуль в виде схемы, остальные модули - это Verilog HDL;
  • Программа управления, написана на C/C++ в среде Visual Studio. Программа открывает последовательный порт, который связывает FPGA плату и компьютер. Через последовательный порт программа отправляет управляющие команды USB хост контроллеру и получает от него результат исполнения команд и принятые данные.

Ниже постараюсь рассказать подробнее, но больше про программный компонент.

Приближается Новый Год! Мы поздравляем читателей нашего сайта с этим праздником! НО, сегодня нам нужен Новогодний FPGA Проект. У нас уже чего только не было на сайте: и двигалось и светило и моргало и показывало. Но, что поделать, самое новогоднее, что можно придумать - это гирлянды, бегущие огни, светодиодная лента. Их тоже мы уже подключали: был проект простого управления светодиодной лентой и мы ее устанавливали в виде импровизированной елочки и потом мы даже сделали цветомузыку на светодиодной ленте.

Теперь пришла идея сделать.. саму светодиодную ленту. Простая светодиодная лента состоит из последовательно соединенных RGB микросхем, например, вот таких: WS2812B. Соединяются они тремя проводами: питание, земля и информационный сигнал, по которому передается код цвета для каждого пикселя индивидуально.

Идея проекта состоит в следующем. Я попытаюсь сделать "реверс инжиниринг" микросхемы WS2812B и реализовать всю ее логику внутри простой ПЛИС платы Марсоход с Altera MAX II. Потом я соединяю последовательно несколько плат Марсоход и подключаю их прямо к светодиодной ленте, таким образом, делаю ленту длиннее на несколько пикселей. Мои ПЛИСы становятся продолжением ленты и светодиоды, подключенные к ПЛИС, должны светиться точно так же, как сама лента. Вообще-то платы Марсоход пришлось немного модернизировать: у них штатно стоят 8 желтых светодиодов, а мы заменяем 3 из них на цветные R, G, B. Это не очень большая переделка.

Наверное кто-то скажет, что это бессмысленный проект, зачем делать то, что уже кем-то сделано. Но с другой стороны - а почему бы и нет? У нас же образовательный сайт. Вот поучимся копировать логику существующих микросхем в FPGA, благо логика очень простая. Ну и в конце концов, может какой нибудь светодиодный завод в России захочет производить подобные чипы где нибудь в Зеленограде? Мне даже кажется, что в этом есть какой-то смысл: для изготовления светодиодных лент и видео стен требуются сотни, тысячи и миллионы таких микросхем... Для одного FullHD светодиодного экрана, если бы его изготавливали из светодиодной ленты, нужно 2 миллиона RGB микросхем. Оптовое изготовление всегда снижает итоговую стоимость производства.

Конечно я немного упрощаю. Микросхема WS2812B возможно не такая простая, как я тут расписываю. В ней есть встроенный генератор, видимо RC-генератор, и он должен быть весьма стабильным вне зависимости от внешней температуры. Но я про это сейчас даже думать не буду. Мой проект немного упрощенный, я буду эмулировать микросхему WS2812B в нашей простой плате Марсоход и на плате есть кварцевый генератор 100МГц. Его и буду использовать для измерения интервалов времени.

Итак, поехали.

raspberry pi4 with FPGA Cyclone IV board marsohod2rpi

Раздобыли плату Raspberry Pi4 и попробовали подключать к ней нашу FPGA плату Марсоход2RPI. В принципе все работает, но JTAG сервер пришлось слегка модифицировать. Все из-за того, что базовый адрес периферии в Raspberry Pi4 изменился.

Поэтому вот, новая версия сетевого программатора-загрузчика JTAG:

Этот набор из двух файлов:

  • nw_jtag_srv, версия 1.2
  • jtag_hw_net_blaster64.dll, версия 1.8b

Первый исполняемый файл nw_jtag_srv запускается на Raspberry и выполняет роль JTAG сервера. По идее поддерживаются все версии одноплатников: Pi-Zero, Pi2, Pi3 и теперь уже Pi4. Сервер nw_jtag_srv слушает по сети входящие соединения от Quartus Prime Programmer и исполняет JTAG команды. Запускать сервер нужно через sudo.

В новой версии 1.2 сервера nw_jtag_srv предусмотрено использование конфигурационного файла jconfig.txt. Он может выглядеть вот так:

PERI_BASE=0xFE000000
TMS_RPI_PIN=0
TDI_RPI_PIN=11
TCK_RPI_PIN=7
TDO_RPI_PIN=1

Этот конфигурационный файл позволяет назначить новые параметры для сервера, альтернативные номера пинов для сигналов JTAG и альтернативный базовый адрес периферии в плате Raspberry. Я столкнулся с тем, что не вполне понимаю, как распознать платы. Написано про это много в интернете, но четкого описания нет. Так, что если по каким-то причинам nw_jtag_srv неправильно определяет тип платы вы сможете переназначить базовый адрес периферии в конфигурационном файле.

Типичные значения базового адреса для платы Pi-Zero: 0x0x20000000. Для Pi3 - это 0x3F000000. Ну и для Pi4 0xFE000000.

Со стороны Quartus Prime все довольно просто: копируйте jtag_hw_net_blaster64.dll в папку c:\intelFPGA_lite\18.1\quartus\bin64 или соответсвующую ей на вашем компьютере. После этого программатор должен появиться в диалоговом окне Quartus Prime Programmer.

Я проверил имеющиеся у нас проекты к плате Марсоход2RPI - все они успешно загружаются по сети в FPGA Cyclone IV платы.