![]() |
![]() |
|||||||||||||||
Отладочная плата на Cyclone IV и немного про FPGA
Автор: balmer
Отладочная плата для FPGA. На основе Cyclone IV EP4CE10. Дальше идет много строк, про каждую из которых можно холиварить. А про некоторые строки можно холиварить по нескольким темам. Плюсы и особенности: EP4CE10 - стоит сейчас порядка 600 рублей, поэтому вполне множно применять даже не в слишком сложных устройствах. Небольшой ликбез. FPGA - это удивительно крутая и вместе с тем убогая штука. Она необычайно гибкая. Хочешь написать свой процессор - пожалуйста! Пистать данные напрямую на дисплей по HDMI? - Без проблемм! Реализовать 20 штук UART в одном чипе? - Раз плюнуть! Сделать обработку звука с гарантированной задержкой менее 1 милисекунды - да этож стандартная задача! Умножть десяток пар чисел за процессорный такт - могем! Вместе с тем - во многих возможностях, много печали. Начинать писать прошивку надо с самых азов. Настолько низкоуровневых азов, что даже голый ассемблер кажется на этом фоне крайне высокоуровневым инструментом. Хочется переслать несколько байт с одного места памяти в другое? Сначала придется реализовать DMA, а потом уже байтики пересылать. Вот простейший пример кода на Verilog always @(posedge clock)
Вроде все понятно, привычно, как во всех языках программирования: Так то оно так, только вот строки: Выполняются не последовательно одна за другой. Они выполняются ПАРАЛЛЕЛЬНО. Потому как для каждого такого элемента будут выделен свой кусочек FPGA, и к нему подведено тактирование сигналом clock. Для каждой из строк будут выделенны соответствующие D-триггеры. Для строки outa <= in_a & in_b; будет синтезирована схемка из логических элементов, которая делает операцию and. Причем все, что находится внутри конструкции always @(posedge clock) выполняется за один такт процессора! Правда у этого благолепия есть и обратная сторона - код надо писать очень аккуратно, чтобы FPGA ненароком не кончилась. Напрмер в EP4CE10 есть 23 умножителя 18-ти битных чисел. Т.е. написал 23 раза a*b в коде и все, умножители закончились. А вот для примера простейший сэмпл. Он мигает светодиодиками туда-сюда, и умеет принимать байтик по uart и выставлять по нему значение светодиодов (мигание в этом случае прекращается). Может и возобновить мигание автоматическое по другой команде uart. Как я уже писал - FPGA "синтезирует" схему из виртуальных элементов. Синтезированная схема (это аналог дизассемблирования скомпилированной программмы для процессора) выглядит так: Да-да. Это логические элементы и провода между ними. count[25:0] это массив D-триггеров, в которых размещается переменная reg [25:0] count; 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 - это соответствующая переменная. Занимает вся эта логика суммарно 79 логических элементов. На EP4CE10 их 10320 штук. Т.е. весь этот корпус можно обвешать светодиодами, влепить внутрь пару десятков UART модулей и еще останется много-много места. Например на парочку простеньких процессоров :)))) А теперь собственно об отладочной плате. Основная ее ценность, это наличие исходников платы на KiCAD. Т.е. если кто хочет сделать свой проект, то ему не придется возиться и разводить весь обвес FPGA заново. По умолчанию отладочная плата питается по USB шнуру, потребляет 31 ма. Но можно вытащить соответствующую перемычку, и питать от отдельного источника +5V. Дам только ссылку на схему, ибо смотреть на цифровые схемы - только в медитацию впадать.
Ну и таки самое главное - ссылка на GitHub на котором хостится этот проект.
Все вопросы в Форум.
|
|
|||||||||||||||
![]() |
![]() |


![]() |
![]() |
|||
|
||||
![]() |
![]() |