FPGA & Verilog БлогFPGA chips

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


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 платы.

 

verilator amber arm soc

Поскольку я начал изучать этот очень быстрый симулятор Verilog HDL - Verilator, то подумал, мне, чтобы лучше понять и освоить его нужен конкретный проект. Но ведь у меня их много! Почему бы мне не попробовать симулировать скажем Amber SoC - систему на кристалле с процессором ARM v2a? Когда-то я занимался этим проектом и запустил эту SoC в плате Марсоход2 и даже какой-то Linux у меня там стартовал. Я когда-то даже симулировал этот проект в Icarus Verilog, но работала та симуляция чрезвычайно медленно. Это то, что нужно. Я попробую теперь симулировать этот же Amber SoC с помощью Verilator. Посмотрим насколько он окажется быстрее.

verilator logo

Я уже писал про симуляцию Verilog HDL проектов в ModelSim и с помощью Icarus Verilog. Однако, конечно, существуют и другие средства. Один из самых быстрых симуляторов, и к тому же свободный и бесплатный, - это Verilator. У него есть свои особенности:

  1. Verilator позволяет преобразовать Verilog модули в C++ классы, которые потом компилируются в обычную исполняемую программу. Запускаем получившуюся программу - запускаем симуляцию. Это позволяет достичь очень высокой производительности.
  2. Verilator, может обрабатывать только синтезируемый Verilog, то есть именно тот код, из которого потом получается "прошивка" для FPGA. Поведенческие модели, всякие присвоения с задержками вроде A = #5 ~A; работать не будут.
  3. Из пункта 2 следует, что тестбенч для симуляции нужно будет писать не на самом верилоге, как обычно, а на C++. Впрочем, в некотором смысле это даже плюс.

Ниже я приведу несколько очень простых примеров использования симулятора Verilator. Я умышленно буду все упрощать, возможно даже слишком упрощать, чтобы было лучше понятно, что из себя представляет Verilator.