FPGA & Verilog БлогFPGA chips

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


mcy316

Выпущена наша новая плата MCY316.

На плате MCY316 установлена ПЛИС EP3C16Q240C8, в ней содержатся 15408 логических элементов, 516098 бит встроенной памяти, четыре PLL и 112 умножиетелей. Так же, на плате стоят:

- Кварцевый генератор 100Мгц;
- Две пользовательские кнопки;
- Восемь пользовательских светодиодов и 7-ми сегментный индикатор;
- SDRAM IS42S32200B, 8 (или 16) Мбайт, 32 разряда шина данных (на обратной стороне платы);
- Двухканальная аудио АЦП PCM1801U,16 бит, 48 Кгц;
- Двухканальный аудио выход для Дельта Сигма ЦАП (8бит);
- Три разъема для установки плат расширения, квазисовместимые с Raspberry Pi;
- SPI Flash W25Q16, 2 Мбайта для автозагрузки ПЛИС:
- SPI Flash W25Q16, 2 Мбайта для пользовательских данных;
- Разъем для установки USB JTAG программатора, например MBFTDI или UsbBlaster

Плата отличается довольно ёмкой ПЛИС (почти 16 тысяч логических элементов) и довольно большим количеством доступных пользователю выводов GPIO.

Дальше более подробное описание платы и проектов для неё.

На этом демонстрационном видео показана очень простая игра Теннис, реализованная в плате Марсоход3GW.

Здесь используется HDMI вывод изображения, которое формируется на лету просто из текущих координат строчной и кадровой развертки. Управление ракеткой выполнено переменным резистором, который подключен к АЦП платы.

Про HDMI вывод я уже писал раньше, впрочем, как и про захват данных из АЦП.

Весь проект можно посмотреть в папке _hdmi_tennis нашего репозитория на github: https://github.com/marsohod4you/Marsohod3GW

 

cat on hdmi

У микросхем FPGA компании Gowin может быть встроенное динамическое ОЗУ, причем один из двух возможных типов:

  • классическая SDR SDRAM типа MT48LC4M16 (64 мегабита);
  • PSRAM (псевдо статическая) HyperRAM типа W955D8MBYA (2*32 мегабита ).

HyperRAM отличается от "классики" интерфейсом и наличием встроенной системы регенерации. Конкретно в чипе GW1NR-UV9QN88PC6/I5, установленном на нашей плате Марсоход3GW, есть ОЗУ именно второго типа. 

На основе этой встроенной памяти создан этот проект фреймбуффера. Можно загружать битмапы прямо в чип FPGA платы Марсоход3GW и отображать их через HDMI выход на мониторе.

Проект находится в папке _hdmi_psram_fb репозитория гитхаб https://github.com/marsohod4you/Marsohod3GW.

hdmi 800x600

Читатели нашего блога уже наверняка знают, что плата Марсоход3GW построена на основе платы Марсоход3. Мы заменили чип Intel MAX10 на чип китайской компании Gowin GW1NR. В остальном платы, как близнецы, похожи и по габаритам и по компоновке и наличием одинаковых разъемов для шилдов и выход HDMI.

Для платы Марсоход3 у нас когда-то уже был создан проект генерации сигнала HDMI. Можно попробовать адаптировать тот прежний проект к новому чипу. Собственно это мы и сделали. На картинке выше показан вывод вертикальных цветных полос на монитор через HDMI разъем платы Марсоход3GW.

Микросхема FPGA GW1NR-UV9QN88PC6/I5 китайской компании Gowin имеет много довольно интересных встроенных блоков. Сейчас в этом проекте HDMI мы сможем попробовать использовать встроенные в ПЛИС сериализаторы и LVDS блоки.

Кратко скажу, что в используемой нами микросхеме серии GW1NR есть сериализаторы из параллельного кода в последовательный, это такие блоки, как: OSER4, OSER8, OVIDEO, OSER10, OSER16. И есть десериализаторы, преобразующие последовательный код в параллельный, это блоки IDES4, IDES8, IVIDEO, IDES10 и IDES16.

Если бы мы делали проект захвата видео, тогда нужно было бы пытаться использовать модули IDES. Но в нашем проекте HDMI вывода нам нужны блоки преобразования из параллельного в последовательный, а именно OSER10.  Используем их!

Я продолжаю изучать FPGA китайской компании GOWIN и делаю проекты для FPGA платы Марсоход3GW. В этой статье пойдет речь об АЦП. На нашей плате установлена микросхема АЦП ADC1175. Она даёт нам 8ми битные выборки на частоте до 20МГц. Первый эксперимент, который я сделаю - выведу данные из АЦП просто на 8 светодиодов платы. Сделать это в программе Verilog HDL очень просто. Для этого нужно на АЦП подать тактовую частоту pll_out_clk взятую, например из rPLL, и этим же сигналом тактовой частоты защелкивать входные данные в регистре adc_data. Ну а выход регистра потом подать на светодиоды:
...
wire pll_out_clk;
wire pll_locked;
Gowin_rPLL rpll(
   .clkin( CLK ),
   .clkout( pll_out_clk ),
.   lock( pll_locked )
);

//pass clk to external ADC chip
assign ADC_CLK = pll_out_clk;

//capture ADC data
reg [7:0]adc_data;
always @(posedge pll_out_clk)
   adc_data <= ADC_D;

//show ADC data on LEDs
assign LED = adc_data;
...

Чтобы испытать этот проект можно ко входу АЦП на плате Марсоход3GW подключить среднюю точку переменного резистора. Ну а два других вывода переменного резистора подключить к +5В и к Земле соответственно. Вот как на этотом фрагменте схема платы Марсоход3GW я добавил синим цветом:

adc led

Получается делитель напряжения и вот это напряжение на средней точке и можно измерить с помощью нашего АЦП. На представленном выше видео показано, как я вращаю ручку переменного резистора и как от этого действия меняется двоичное число на 8ми светодиодах платы. Понятно, что это очень примитивный проект, но он дает отправную точку для следующих, более сложных проектов.

Далее я собираюсь оцифрованные данные передавать через последовательный порт в компьютер. А на компьютере напишу программу на питоне и она будет мне отображать осцилограммы из полученных данных.