РадиоКот :: Отладочная плата на Cyclone IV и немного про FPGA
Например TDA7294

РадиоКот >Лаборатория >Цифровые устройства >

Теги статьи: Cyclone IVДобавить тег

Отладочная плата на Cyclone IV и немного про FPGA

Автор: balmer
Опубликовано 22.11.2018
Создано при помощи КотоРед.

 

Отладочная плата  для FPGA. На основе Cyclone IV EP4CE10.

Дальше идет много строк, про каждую из которых можно холиварить. А про некоторые строки можно холиварить по нескольким темам.

Плюсы и особенности:

EP4CE10 - стоит сейчас порядка 600 рублей, поэтому вполне множно применять даже не в слишком сложных устройствах.
LQFP144 корпус достаточно легко паять. Нижний подогрев платы правда все равно потребуется, чтобы припаять центральный земляной вывод.
Среда разработки Intel Quartus сравнительно проста в освоении. Работает как под Windows так и под Linux (я естественно использую Linux). Бесплатной версии Lite достаточно, чтобы писать прошивку для этого чипа.
Пара примеров для этой платы написал на Verilog, потому как синтаксис его более красив, чем у VHDL.

Небольшой ликбез.

FPGA - это удивительно крутая и вместе с тем убогая штука. Она необычайно гибкая.

Хочешь написать свой процессор - пожалуйста! Пистать данные напрямую на дисплей по HDMI? - Без проблемм! Реализовать 20 штук UART в одном чипе? - Раз плюнуть! Сделать обработку звука с гарантированной задержкой менее 1 милисекунды - да этож стандартная задача! Умножть десяток пар чисел за процессорный такт - могем!

Вместе с тем - во многих возможностях, много печали. Начинать писать прошивку надо с самых азов. Настолько низкоуровневых азов, что даже голый ассемблер кажется на этом фоне крайне высокоуровневым инструментом. Хочется переслать несколько байт с одного места памяти в другое? Сначала придется реализовать DMA, а потом уже байтики пересылать.

Вот простейший пример кода на Verilog

always @(posedge clock)
begin
    outa <= in_a & in_b;
    outb <= in_a * in_b;
end

 

Вроде все понятно, привычно, как во всех языках программирования:
outa, in_a, in_b - переменные.
<= - пересылка данных из одной переменной в другую

Так то оно так, только вот строки:
outa <= in_a & in_b;
outb <= in_a * in_b;

Выполняются не последовательно одна за другой. Они выполняются ПАРАЛЛЕЛЬНО. Потому как для каждого такого элемента будут выделен свой кусочек FPGA, и к нему подведено тактирование сигналом clock. Для каждой из строк будут выделенны соответствующие D-триггеры. Для строки outa <= in_a & in_b; будет синтезирована схемка из логических элементов, которая делает операцию and. Причем все, что находится внутри конструкции always @(posedge clock) выполняется за один такт процессора! Правда у этого благолепия есть и обратная сторона - код надо писать очень аккуратно, чтобы FPGA ненароком не кончилась. Напрмер в EP4CE10 есть 23 умножителя 18-ти битных чисел. Т.е. написал 23 раза a*b в коде и все, умножители закончились.

А вот для примера простейший сэмпл. Он мигает светодиодиками туда-сюда, и умеет принимать байтик по uart и выставлять по нему значение светодиодов (мигание в этом случае прекращается). Может и возобновить мигание автоматическое по другой команде uart.

Как я уже писал - FPGA "синтезирует" схему из виртуальных элементов. Синтезированная схема (это аналог дизассемблирования скомпилированной программмы для процессора) выглядит так:

Да-да. Это логические элементы и провода между ними.
clk_50M - это внешняя ножка с которой приходит тактовый сигнал 50 МГц с кварца.
uart_rx_pin - ножка подключенная к USB<->UART конвертору CP2102.
led110, l1d111, led114, led115 - выходы на светодиоды, подключенные к соответствующим номерам ножек.

count[25:0] это массив D-триггеров, в которых размещается переменная reg [25:0] count;
add0 это блок, который каждый такт прибавляет единичку к count. См. строку: count <= count+1'd1;

Decoder0 превращает 3 бита count[25:23] в 8 сигалов, которые потом посредством OR элементов leds~0..leds~3 реализуют логику зажигания светодиодов описанных в case (count[25:23]) ... endcase блоке.

uart_rx:uart_rx0 - это отдельный модуль написанный на Verilog который позволяет нам принимать байтики по UART. Это "большая сложная микросхема". На вход она принимает тактовый сигнал i_Clock и входные UART данные i_Rx_serial. На выходе o_Rx_Byte - принятый байт. o_Rx_DV - сигнал, оповещающио о том, что байт принят.

use_leds_from_uart - это соответствующая переменная.
leds~[7:4] - выбирает, откуда нам взять данные для светодиодов. От постоянно изменяющегося count или из UART данных.
leds[3..0] - массив D-триггеров перед светодиодами.

Занимает вся эта логика суммарно 79 логических элементов. На EP4CE10 их 10320 штук. Т.е. весь этот корпус можно обвешать светодиодами, влепить внутрь пару десятков UART модулей и еще останется много-много места. Например на парочку простеньких процессоров :))))
По причине простоты эта схема может работать на максимальной для этой FPGA частоте 250 МГц. Т.е. например UART можно разогнать до частоты 250/2 = 125 МГц. Для UART это конечно overkill, но вот SPI на такой частоте использовать вполне реально. Причем это еще не самый быстрый способ засосать внутрь данные. Есть еще LVDS, по которому можно гонять данные с еще большей скоростью.

А теперь собственно об отладочной плате.

Основная ее ценность, это наличие исходников платы на KiCAD. Т.е. если кто хочет сделать свой проект, то ему не придется возиться и разводить весь обвес FPGA заново.
Что находится на плате:
- Cyclone IV EP4CE10E22C8N собственно сама FPGA
- CP2102 USB<->UART для общения с компьютером простого
- SPI Flash на 32 мегабита - в ней хранится прошивка
- кристал 50 МГц для тактирования FPGA
- 28 ножек пользовательских, часть из которых собранны в пару IDC-10 разъемов, которые мне очень нравятся.
- питание 3.3 V, 2.5V и 1.2 V которое требуется для этой микросхемы
- ну и конечноже JTAG разъем для заливки прошивки и дебагирования

По умолчанию отладочная плата питается по USB шнуру, потребляет 31 ма. Но можно вытащить соответствующую перемычку, и питать от отдельного источника +5V.
Импульсный блок питания китайский на MP1584. Это хороший низкошумящий блок питания. Китайцы продают их настолько дешево, что смысла саммому собирать из деталей нет.

Дам только ссылку на схему, ибо смотреть на цифровые схемы - только в медитацию впадать.
А вот фотки платы прикреплю.


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

Ну и таки самое главное - ссылка на GitHub на котором хостится этот проект.
Там есть исходники платы и пара тестовых проектов.



Все вопросы в Форум.




Как вам эта статья?

Заработало ли это устройство у вас?

23 6 1
2 0 0