Технология FPGA (FPGA) в настоящее время приобретает большую популярность.
Количество приложений растет: помимо цифровой обработки сигналов FPGA используются для ускорения машинного обучения, в технологиях блокчейна, обработки видео и IoT. У этой технологии есть один существенный недостаток: для программирования используются достаточно сложные и специфичные языки описания цифрового оборудования Verilog и VHDL. Это затрудняет выход в сферу FPGA новичку, а работодателю сложно найти на рынке труда специалиста с такими специфическими знаниями.
С другой стороны, популярный язык программирования высокого уровня Python с фреймворком MyHDL сделать программирование FPGA простым и приятным.
Более того, людей, знающих Python, на порядок больше, чем специалистов, знающих Verilog/VHDL. Серией статей я хочу показать, как легко войти в область FPGA, зная Python, и начать создавать на этом языке настоящие сложные проекты FPGA. Замечу, что питон не выполняется напрямую на ПЛИС, а является инструментом генерации прошивки.
Для начала нам понадобится сам Python версии 3.6 (здесь и далее все операции выполняются в ОС Ubuntu 18.04).
Установите myhdl:
Как «Привет, мир!» Давайте напишем простую программу, которая зажигает светодиоды при нажатии кнопки.pip3 install myhdl
В мире микропроцессоров «Hello World!» Это программа, которая моргает одним светодиодом; в мире FPGA Hello World — это мигание тысячи светодиодов.
Светодиодов на плате всего четыре, поэтому мы будем мигать ими только в зависимости от нажатия кнопки.
Важно отметить, что весь код в ПЛИС, в отличие от микроконтроллеров, выполняется одновременно, все диоды загораются и гаснут одновременно.
А не последовательно в случае с микроконтроллерами.
Экспериментальная плата представляет собой плату WaveShare OpenEPM1270 со встроенным процессором Altera Max II EPM1270T144C5.
Создайте новый файл Python: from myhdl import *
from random import randrange
def led_blinker(input1, led1, led2, led3, led4):
@always_comb
def on_off_led():
if input1 == 1:
led1.next = 1
led2.next = 1
led3.next = 0
led4.next = 0
else:
led1.next = 0
led2.next = 0
led3.next = 1
led4.next = 1
return on_off_led
Чтобы узнать, правильно ли работает наш код, нам понадобится инструмент проверки.
По сути, любая программа для ПЛИС — это цифровой сигнальный процессор, поэтому разработчику необходимо убедиться, что он правильно указал, что должен делать чип.
Это делается посредством моделирования; для этого необходимо установить программу, которая будет отображать обработанные сигналы.
Таких программ довольно много, но на мой взгляд лучшая на данный момент — бесплатная GTKWave. Устанавливается из терминала: sudo apt-get install gtkwave
Далее в файле прошивки следует описать тестовую среду.
Это также функция Python: def test():
input1, led1, led2, led3, led4 = [Signal(bool(0)) for i in range(5)]
test = led_blinker(input1, led1, led2, led3, led4)
@always(delay(10))
def gen():
input1.next = randrange(2)
return test, gen
Здесь тестовая среда генерирует случайную последовательность нулей и единиц (используется модуль случайных чисел Python).
def simulate(timesteps):
tb = traceSignals(test)
sim = Simulation(tb)
sim.run(timesteps)
И инициализируем симулятор, перетащив в него функцию окружения test_inverter. Таким образом, мы получаем матрешку-инвертор → test_inverter → симулировать (время в произвольных единицах).
После запуска скрипта в рабочей папке будет создан файл .
vcd, который следует запустить через gtkwave, в терминале: gtkwave test_invereter.vcd.
В результате была сгенерирована случайная последовательность входных сигналов input1 и то, как функцияled_blinker обработала эти сигналы.
После того, как мы убедились, что логика сработала именно так, как мы хотели, то нам следует кинуть эту функцию в ПЛИС.
Я привык работать с чипами Intel (ранее Altera), данная последовательность действий аналогична для чипов других производителей с соответствующими САПР.
В чип ПЛИС загружается бинарный файл, который создается компилятором производителя чипа, для Intel это Quartus, для Xilinx Vivado. Компиляторы могут работать только с кодом на VHDL/Verilog, поэтому код Python следует переводить на любой из этих языков (не важно на какой).
def convert():
input1, led1, led2, led3, led4 = [Signal(bool(0)) for i in range(5)]
toVerilog(led_blinker, input1, led1, led2, led3, led4)
convert()
В этом примере код переводится в Verilog. Результат находится в файлеled_blinker.v, который нужно будет передать Quartus для генерации прошивки FPGA: module led_blinker (
input1,
led1,
led2,
led3,
led4
);
input input1;
output led1;
reg led1;
output led2;
reg led2;
output led3;
reg led3;
output led4;
reg led4;
always @(input1) begin: LED_BLINKER_ON_OFF_LED
if ((input1 == 1)) begin
led1 = 1;
led2 = 1;
led3 = 0;
led4 = 0;
end
else begin
led1 = 0;
led2 = 0;
led3 = 1;
led4 = 1;
end
end
endmodule
При таком подходе к разработке прошивки ПЛИС можно игнорировать этот файл и просто закинуть его в Quartus.
Скачать Квартус можно с сайта fpgasoftware.intel.com , нам нужна бесплатная версия Lite, нам ее будет достаточно.
Загрузите базовую версию размером 9 ГБ.
Установка Quartus не должна составить труда для обычного пользователя Linux. После установки необходимо настроить некоторые параметры в системе, чтобы можно было использовать устройство для прошивки программы ПЛИС - программатор:
1. Создайте правило udev. Для этого создайте новый файл /etc/udev/rules.d/51-altera-usb-blaster.rules следующего содержания:
# USB-Blaster
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6002", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6003", MODE="0666"
# USB-Blaster II
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6010", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="09fb", ATTR{idProduct}=="6810", MODE="0666"
Перезагрузите udev с помощью udevadm: sudo udevadm control --reload
2. Разрешите доступ без полномочий root к устройству USB-Blaster. Для этого создайте файл /etc/udev/rules.d/altera-usb-blaster.rules со строкой: ATTR{idVendor}=="09fb", ATTR{idProduct}=="6001", MODE="666"
Это дает rw-rw-rw- доступ к программисту.
3. Настройте jtagd. Для работы Quartus использует демон jtagd, который соединяет программное обеспечение с устройством программатора.
Скопируйте описание из каталога Quartus: sudo mkdir /etc/jtagd
sudo cp <Quartus install path>/quartus/linux64/pgm_parts.txt /etc/jtagd/jtagd.pgm_parts
Запустите Quartus и создайте новый проект «Файл» — «Мастер новых проектов», введите имя проекта.
Далее нажмите Далее.
И в меню «Добавить файлы» подключаем сгенерированный файл verilog с расширением .
v. Таким образом, если файл verilog редактируется из файла Python, Quartus автоматически подхватит его.
Далее попадаем в меню выбора устройства, в нашем случае это MAX II EMP1270T144C5 и еще пару раз далее.
Проект создан.
В Project Navigator перейдите в меню «Файл» и щелкните правой кнопкой мыши наш файл verilog «Установить как объект верхнего уровня».
Давайте скомпилируем проект. Теперь в меню «Назначения-Планировщик контактов» настраиваем выводы на чипе:
Давайте скомпилируем еще раз.
Теперь все готово для программирования: Инструменты-Программист. Подключаем программатор и питание к плате, в Hardware Setup выбираем наш USB-Blaster, ставим галочки как показано на рисунке и запускаем.
После того, как программист сообщил об успехе.
Результат вы можете увидеть на доске:
Заключение
В этом уроке рассказывается, как создать рабочую среду и первый простой проект FPGA на языке программирования Python. Рассмотрено:- Как установить:
- мойЛПВП;
- GTKWave;
- Квартус;
- Программатор USB Blaster настроен в Ubuntu;
- Разработал проект FPGA на Python;
- Проект протестирован и проверен;
- Проект был скомпилирован для FPGA;
- Проект загружен в FPGA.
-
Кремона, Луиджи
19 Oct, 24 -
Коворкинг - Центр В Туле
19 Oct, 24 -
Moose: Ооп В Perl
19 Oct, 24 -
Расширение Диспетчера Мыши
19 Oct, 24