Начало Работы С Fpga В Python

Технология 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.

Начало работы с FPGA в Python

Создайте новый файл 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.

Начало работы с FPGA в Python

В результате была сгенерирована случайная последовательность входных сигналов 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 «Установить как объект верхнего уровня».

Давайте скомпилируем проект. Теперь в меню «Назначения-Планировщик контактов» настраиваем выводы на чипе:

Начало работы с FPGA в Python

Давайте скомпилируем еще раз.

Теперь все готово для программирования: Инструменты-Программист. Подключаем программатор и питание к плате, в Hardware Setup выбираем наш USB-Blaster, ставим галочки как показано на рисунке и запускаем.



Начало работы с FPGA в Python

После того, как программист сообщил об успехе.

Результат вы можете увидеть на доске:

Начало работы с FPGA в Python



Заключение

В этом уроке рассказывается, как создать рабочую среду и первый простой проект FPGA на языке программирования Python. Рассмотрено:
  • Как установить:
    • мойЛПВП;
    • GTKWave;
    • Квартус;
  • Программатор USB Blaster настроен в Ubuntu;
  • Разработал проект FPGA на Python;
  • Проект протестирован и проверен;
  • Проект был скомпилирован для FPGA;
  • Проект загружен в FPGA.
Теги: #python #FPGA #plis #FPGA #plis #altera #altera #quartus #myhdl
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.