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

 

verilator amber arm soc

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