Мастерство встраиваемого FPGA-дизайна: практическое руководство по реализации
Наличие более мощных FPGA и более эффективных сред программирования сделало FPGA-реализацию широко доступной, но использование FPGA может показаться пугающим.
Примечание редактора: По мере появления передовых алгоритмов для умных продуктов разработчики часто сталкиваются с трудностями реализации встраиваемых систем, способных удовлетворить связанные вычислительные требования. FPGA могут обеспечить требуемую производительность, но проектирование с FPGA долго считалось прерогативой экспертов по программированию FPGA. Сегодня, однако, доступность более мощных FPGA и более эффективных сред разработки сделала FPGA-разработку широко доступной. В этом отрывке, Глава 4 из книги Architecting High-Performance Embedded Systems, автор предлагает исчерпывающий обзор FPGA-устройств, языков реализации и процесса FPGA-разработки, а также детальное пошаговое руководство по началу внедрения FPGA в собственный дизайн. Полный отрывок представлен в следующей серии публикаций:
1: Аппаратные ресурсы
2: Языки реализации
3: Процесс разработки
4: Создание проекта
5: Реализация (эта статья)
Адаптировано из Architecting High-Performance Embedded Systems, автор Jim Ledin.
Тестирование логического поведения
Важно тестировать поведение логики с помощью симуляции перед попыткой запуска в FPGA. Это потому, что обнаружить и исправить проблемы в среде симуляции гораздо легче, чем с логикой, работающей внутри FPGA. Инструменты симуляции Vivado отлично представляют поведение схемы:
- В подокне Sources правой кнопкой мыши кликните на Simulation Sources и выберите Add Sources…:

Рисунок 4.18 – Выбор меню Add Sources… для Simulation Sources
- В диалоге Add Sources убедитесь, что выбрано Add or create simulation sources, затем нажмите Next.
- В диалоге Add or Create Simulation Sources нажмите Create File.
- Введите имя файла vhdl и нажмите OK.
- Нажмите Finish для закрытия диалога Add or Create Simulation Sources, затем OK в диалоге Define Module и Yes при вопросе о подтверждении использования.
- Дважды кликните Adder4 TestBench (Behavioral) (Adder4TestBench.vhdl) под Simulation Sources. Удалите автоматически заполненное содержимое окна редактора vhdl и введите следующий код в редактор Adder4TestBench.vhdl:
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity ADDER4_TESTBENCH is end entity ADDER4_TESTBENCH; architecture BEHAVIORAL of ADDER4_TESTBENCH is component ADDER4 is port ( A4 : in std_logic_vector(3 downto 0); B4 : in std_logic_vector(3 downto 0); SUM4 : out std_logic_vector(3 downto 0); C_OUT4 : out std_logic ); end component; signal a : std_logic_vector(3 downto 0); signal b : std_logic_vector(3 downto 0); signal s : std_logic_vector(3 downto 0); signal c_out : std_logic; signal expected_sum5: unsigned(4 downto 0); signal expected_sum4: unsigned(3 downto 0); signal expected_c : std_logic; signal error : std_logic; begin TESTED_DEVICE: ADDER4 port map ( A4 => a, B4 => b, SUM4 => s, C_OUT4 => c_out ); TEST: process begin -- Test all combinations of two 4-bit addends (256 total tests) for a_val in 0 to 15 loop for b_val in 0 to 15 loop -- Set the inputs to the ADDER4 component a <= std_logic_vector(to_unsigned(a_val, a'length)); b <= std_logic_vector(to_unsigned(b_val, b'length)); wait for 1 ns; -- Compute the 5-bit sum of the two 4-bit values expected_sum5 <= unsigned('0' & a) + unsigned('0' & b); wait for 1 ns; -- Break the sum into a 4-bit output and a carry bit expected_sum4 <= expected_sum5(3 downto 0); expected_c <= expected_sum5(4); wait for 1 ns; -- The 'error' signal will only go to 1 if an error occurs if ((unsigned(s) = unsigned(expected_sum4)) and (c_out = expected_c)) then error <= '0'; else error <= '1'; end if; -- Each pass through the inner loop takes 10 ns wait for 7 ns; end loop; end loop; wait; end process TEST; end architecture BEHAVIORAL;
Этот код проверяет функциональность 4-битного сумматора, подавая все комбинации 4-битных чисел на входы A4 и B4 компонента Adder4. Он сравнивает выходы SUM4 и C_OUT4 компонента Adder4 с независимо вычисленными значениями для тех же входов. После каждой операции сложения сигнал error устанавливается в 0, если выходы Adder4 совпали с ожидаемыми значениями, или в 1 при несовпадении.
Код в Adder4TestBench.vhdl напоминает традиционный программный код в использовании вложенных циклов for для подачи всех тестовых комбинаций на компонент Adder4 под тестом. Код, запускающий тесты в режиме симуляции, не синтезируем, что означает, что он не чисто представляет аппаратную логическую схему и способен на традиционные программные операции, такие как итеративное выполнение циклов for.
Однако, как и в физических схемах, сигналам, получающим значения в коде тестбенча через оператор <=, нельзя использовать их в тот же момент времени в последующих выражениях. Это связано с тем, что среда симуляции представляет реальные эффекты задержки распространения, которая значительна даже в крошечных FPGA. Три оператора wait for 1 ns; в коде тестбенча приостанавливают операции схемы, чтобы дать время на распространение сигналов. Эти задержки 1 нс предоставляют время для распространения значений сигналов, вычисленных перед оператором wait, чтобы они могли быть использованы в следующем операторе. Последний оператор wait for 7 ns; во внутреннем цикле — пауза, позволяющая четко видеть результаты каждой итерации симуляции в отображении трасс сигналов.
- Правой кнопкой мыши кликните Adder4 TestBench (Behavioral) (Adder4TestBench.vhdl) под Simulation Sources и выберите Automatic Update and Compile Order. Это устанавливает ADDER4_TESTBENCH как объект верхнего уровня для симуляции:

Рисунок 4.19 – Выбор меню для установки Automatic Update and Compile Order
- Нажмите Run Simulation, затем Run Behavioral Simulation в окне Flow Navigator для входа в режим симуляции. Если файлы редактора еще не сохранены, будет запрос на сохранение. Нажмите Save. Симуляция затем запустится:

Рисунок 4.20 – Выбор меню Run Behavioral Simulation
- Когда откроется окно SIMULATION, нажмите кнопку максимизации в окне вывода симуляции с заголовком Untitled 1:

Рисунок 4.21 – Окно результатов симуляции
Общее симулированное время каждого прохода внутреннего цикла — 10 нс. Поскольку в Adder4TestBench.vhdl 256 проходов цикла, время симуляции составляет 2560 нс.
- Установите время симуляции 2560 нс в верхней панели инструментов (шаг 1 на следующем рисунке), нажмите левую кнопку перезапуска (шаг 2), затем правую кнопку для запуска симуляции на 2560 нс (шаг 3), и наконец кнопку Zoom Fit (шаг 4) для масштабирования диапазона данных вывода симуляции под окно:

Рисунок 4.22 – Результаты симуляции от начала до конца запуска
Вы можете использовать иконки лупы для увеличения любой точки трассы и наблюдения результатов каждой операции сложения во время тестирования. Например, на следующем рисунке показано, что десятичные значения 6 и 2 были сложены для получения результата 8 с переносом 0. Эти значения совпадают с ожидаемыми, что привело к установке error в 0. Сигнал error равен 0 для всех 256 тестовых случаев, что указывает на прохождение всех тестов нашей логической схемой:

Рисунок 4.23 – Увеличенный фрагмент результатов симуляции
- Закройте режим симуляции, нажав X в синей панели SIMULATION над трассой данных. Нажмите OK при вопросе о закрытии симуляции.
Пройдя поведенческое тестирование, мы определим I/O-сигналы, используемые в дизайне.
Определение I/O-сигналов
Наш следующий шаг — подключить входы и выходы нашей схемы к аппаратным устройствам на плате Arty. Входами будут переключатели и кнопки платы, а выходами — светодиоды.
Следующие шаги создадут файл ограничений, описывающий I/O-выводы FPGA и функции, подключенные к этим выводам на плате Arty. Файлы ограничений имеют расширение xdc:
- В подокне Sources правой кнопкой мыши кликните Constraints и выберите Add Sources….
- В диалоге Add Sources убедитесь, что выбрано Add or create constraints, затем нажмите Next.
- В диалоге Add or Create Constraints нажмите Create File.
- Введите имя файла Arty-A7-100.xdc (или Arty-A7-35.xdc если уместно для вашего устройства) и нажмите OK.
- Нажмите Finish для закрытия диалога Add or Create Constraints.
- Раскройте дерево источников Constraints и дважды кликните Arty-A7-35.xdc.
- Digilent предоставляет предзаполненные файлы ограничений для плат Arty A7. Посетите https://raw.githubusercontent.com/Digilent/digilent-xdc/master/Arty-A7-35-Master.xdc и скопируйте всё содержимое окна браузера в окно редактора Arty-A7-35.xdc в Vivado. Если уместно для вашего устройства, используйте файл по адресу https://raw.githubusercontent.com/Digilent/digilent-xdc/master/Arty-A7-100-Master.xdc.
- Все I/O-выводы в файле ограничений закомментированы. Раскомментируйте соответствующие строки, удалив символ # в начале каждой строки. Мы будем использовать выводы, перечисленные в следующих разделах в файле Arty-A7-100.xdc: Switches, RGB LEDs (но только led0_g, первый зеленый светодиод), LEDs и Buttons. На следующем рисунке показаны эти строки после раскомментирования:

Рисунок 4.24 – Окно редактора ограничений
В следующем разделе мы создадим файл VHDL верхнего уровня, интерфейсный код сумматора с I/O-устройствами.
Создание файла VHDL верхнего уровня
Мы создадим файл VHDL верхнего уровня, соединяющий наш 4-битный сумматор с соответствующими I/O-сигналами платы:
- В подокне Sources правой кнопкой мыши кликните на Design Sources и выберите Add Sources….
- В диалоге Add Sources убедитесь, что выбрано Add or create design sources, затем нажмите Next.
- В диалоге Add or Create Design Sources нажмите Create File.
- Введите имя файла vhdl и нажмите OK.
- Нажмите Finish для закрытия диалога Add or Create Design Sources, затем OK в диалоге Define Module и Yes при вопросе о подтверждении.
- Дважды кликните vhdl под Design Sources. Удалите автоматически заполненное содержимое окна редактора ArtyAdder.vhdl и введите следующий код в редактор ArtyAdder.vhdl:
-- Load the standard libraries library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity ARTY_ADDER is port ( sw : in STD_LOGIC_VECTOR (3 downto 0); btn : in STD_LOGIC_VECTOR (3 downto 0); led : out STD_LOGIC_VECTOR (3 downto 0); led0_g : out STD_LOGIC ); end entity ARTY_ADDER; architecture BEHAVIORAL of ARTY_ADDER is -- Reference the previous definition of the 4-bit adder component ADDER4 is port ( A4 : in std_logic_vector(3 downto 0); B4 : in std_logic_vector(3 downto 0); SUM4 : out std_logic_vector(3 downto 0); C_OUT4 : out std_logic ); end component; begin ADDER : ADDER4 port map ( A4 => sw, B4 => btn, SUM4 => led, C_OUT4 => led0_g ); end architecture BEHAVIORAL;
Этот код отображает имена сигналов для I/O-устройств, названных в Arty-A7-100.xdc как sw (4 переключателя), btn (4 кнопки), led (4 одноцветных светодиода) и led0_g (зеленый канал первого многоцветного светодиода) на входы и выходы ADDER4.
Хотя VHDL нечувствителен к регистру, обработка файлов ограничений xdc в Vivado чувствительна к регистру. Регистр, используемый в именах I/O-устройств, определенных в xdc файле, должен быть идентичным при ссылке в VHDL файле. Конкретно, имена I/O-сигналов в VHDL должны быть строчными в этом файле, потому что они строчные в файле ограничений.
Теперь мы готовы к синтезу, реализации и программированию нашего дизайна для платы Arty.
Синтез и реализация битстрима FPGA
Альтернативно, можно выбрать Generate Bitstream и Vivado выполнит все необходимые шаги, включая синтез, реализацию и генерацию битстрима без дополнительного вмешательства. Если произойдет фатальная ошибка, процесс остановится и будут показаны сообщения об ошибках. Выполните следующие шаги для генерации битстрима:
- Нажмите Generate Bitstream для запуска сборки. Может появиться запрос о сохранении текстовых редакторов. Нажмите Save. Может появиться сообщение, что результаты реализации недоступны, и вопрос, можно ли запустить синтез и реализацию. Нажмите Yes:

Рисунок 4.25 – Выбор меню Generate Bitstream
- Диалог Launch Runs появится. Можно выбрать значение для Number of jobs до количества ядер процессора в вашем компьютере. Использование большего числа ядер ускоряет процесс, но может затормозить машину, если вы хотите продолжить работу во время длительной сборки. Нажмите OK для запуска сборки:

Рисунок 4.26 – Диалог Launch Runs
- Во время сборки Vivado будет отображать статус в правом верхнем углу главного окна. При необходимости можно отменить сборку, нажав Cancel рядом с отображением статуса:

Рисунок 4.27 – Отображение статуса компиляции
- Когда процесс сборки завершится, если не было фатальных ошибок, появится диалог Bitstream Generation Completed. Хотя предлагаются другие варианты, мы перейдем напрямую к загрузке битстрима на плату Arty. Выберите Open Hardware Manager и нажмите OK:

Рисунок 4.28 – Диалог Bitstream Generation Completed
Далее мы загрузим битстрим в FPGA.
Загрузка битстрима на плату
Выполните следующие шаги для загрузки битстрима на плату Arty A7:
- Появится диалог HARDWARE MANAGER, указывающий No hardware target is open.
- Подключите вашу плату Arty A7-35 или A7-100 к компьютеру по USB. Подождите несколько секунд для распознавания платы, затем нажмите Open target, затем Auto Connect:

Рисунок 4.29 – Выбор Open target и Auto Connect
- Через несколько секунд Vivado должен указать, что плата подключена. Нажмите Program device для загрузки битстрима FPGA на плату Arty. Будет предложено выбрать файл битстрима. Если вы использовали ту же структуру каталогов, файл будет находиться по адресу C:/Projects/ArtyAdder/ArtyAdder.runs/impl_1/ARTY_ADDER.bit:

Рисунок 4.30 – Диалог Program Device
- Нажмите Program для загрузки программы в FPGA и запуска
- Теперь можно протестировать работу программы с I/O Arty. Поставьте все четыре переключателя в положение off (сдвиньте переключатели к краю платы) и не нажимайте никакие из четырех кнопок. Все четыре зеленых светодиода должны быть выключены.
- Если включить любой отдельный переключатель или нажать любую одну кнопку, соответствующий зеленый светодиод должен загореться. Включение любой комбинации переключателей при нажатии любой комбинации кнопок сложит соответствующие 4-битные числа и зажжет светодиоды с результатом. Если есть перенос (например, включить SW3 и нажать BTN3 одновременно), загорится зеленый светодиод переноса.
Процесс программирования, выполненный здесь, сохранил программу в ОЗУ FPGA. Если вы цикле питание платы FPGA, вам придется повторить программирование для перезагрузки программы. Альтернативно, можно сохранить конфигурационный файл FPGA во встроенной флеш-памяти, как описано в следующем разделе.
Программирование битстрима во встроенную флеш-память
Для конфигурации FPGA при каждом включении питания платы Arty конфигурационный файл FPGA должен быть сохранен во флеш-памяти на плате. Если перемычка MODE установлена, FPGA попытается загрузить конфигурационный файл из встроенной флеш-памяти при включении. Эта память находится в отдельном чипе рядом с FPGA Artix-7. Следуйте этим шагам для программирования конфигурационного файла во флеш-память:
- Установите перемычку MODE на плате Arty, если она еще не установлена.
- Правой кнопкой мыши кликните Generate Bitstream и выберите Bitstream Settings….
- В диалоге Settings отметьте галочку рядом с -bin_file и нажмите OK:

Рисунок 4.31 – Диалог настроек битстрима
- В главном диалоге Vivado нажмите Generate Bitstream и повторите процесс генерации битстрима. Нажмите Cancel когда появится диалог Bitstream Generation Completed.
- В диалоге Hardware правой кнопкой мыши кликните номер части FPGA (xc7a100t_0) и выберите Add Configuration Memory Device…:

Рисунок 4.32 – Выбор меню Add Configuration Memory Device…
- Введите s25fl127 в поле Search. Должен появиться один соответствующий номер части. Выберите его и нажмите OK:

Рисунок 4.33 – Диалог Add Configuration Memory Device
- Появится диалог с вопросом Do you want to program the configuration memory device now? Нажмите OK.
- Откроется диалог Program Configuration Memory Device с запросом имени конфигурационного файла. Нажмите кнопку … справа от Configuration file и выберите C:/Projects/ArtyAdder/ArtyAdder.runs/impl_1/ARTY_ADDER.bin. Нажмите OK:

Рисунок 4.34 – Диалог Program Configuration Memory Device
- Процесс программирования займет несколько секунд. Вы должны получить сообщение об успехе после программирования файла во флеш-память платы:

Рисунок 4.35 – Диалог завершения программирования флеш
После этого каждый раз при цикле питания платы 4-битная программа сумматора будет загружаться и запускаться. Загрузка программы займет много времени с настройками, которые мы использовали для загрузки конфигурационного файла. Чтобы избежать ожидания загрузки программы FPGA, можно ускорить загрузку конфигурационного файла, выполнив следующие шаги:
- Выберите Open Synthesized Design в Flow Navigator.
- В главном меню Vivado выберите Tools/Edit Device Properties….
- На вкладке General установите Enable Bitstream Compression в TRUE.
- На вкладке Configuration установите Configuration Rate (MHz) в 33, затем нажмите OK.
- Сгенерируйте битстрим снова и запрограммируйте флеш-память как описано. Вам придется удалить устройство конфигурационной памяти и добавить его снова, чтобы отобразить опцию перепрограммирования.
- Закройте Hardware Manager.
- Отключите USB-кабель платы Arty и подключите снова. Программа должна начать работу практически мгновенно при включении питания.
Этот раздел представил пример простой комбинационной логики, взаимодействующей с сигналами на I/O-выводах FPGA. Цель здесь — ознакомить вас с набором инструментов Vivado и продемонстрировать, как инструменты используются для выполнения полного цикла FPGA-разработки.
Резюме
Эта глава началась с обсуждению эффективного использования FPGA в архитектурах встраиваемых систем реального времени и продолжилась описанием стандартных FPGA-устройств и низкоуровневых компонентов, которые они содержат. Была представлена гамма языков FPGA-дизайна, включая HDL, блочно-диаграммные методы и популярные языки программирования вроде C/C++. Представлен обзор процесса FPGA-разработки. Глава завершилась полным примером цикла FPGA-разработки, начиная с заявления требований и заканчивая функциональной системой, реализованной на низкобюджетной FPGA-плате разработки.
Завершив эту главу, вы должны знать, как FPGA могут быть эффективно применены в архитектурах встраиваемых систем реального времени и понимать компоненты внутри FPGA. Вы узнали о языках программирования, используемых в дизайне FPGA-алгоритмов, шагах цикла FPGA-разработки и поняли последовательность шагов в процессе FPGA-разработки.
Следующая глава расширит процесс FPGA-разработки для предоставления полного подхода к архитектуре встраиваемых систем реального времени, содержащих FPGA. Она также начнет разработку прототипа высокопроизводительной встраиваемой системы — цифрового осциллографа — который послужит примером для следующих глав.
Воспроизведено с разрешения Packt Publishing. Copyright © 2021 Packt Publishing
Джим Ледин — CEO Ledin Engineering, Inc. Джим — эксперт в дизайне, разработке и тестировании встраиваемого ПО и железа. Также успешен в оценке кибербезопасности и пентестинге встраиваемых систем. Имеет степень B.S. в аэрокосмической инженерии от Iowa State University и M.S. в электротехнике и компьютерной инженерии от Georgia Institute of Technology. Джим — зарегистрированный профессиональный электроинженер в Калифорнии, CISSP, CEH, CPT.
Связанные материалы:
- Встраиваемый дизайн с FPGA: Аппаратные ресурсы
- Встраиваемый дизайн с FPGA: Языки реализации
- Встраиваемый дизайн с FPGA: Процесс разработки
- Open-source инструменты помогают упростить FPGA-программирование
- Реализация алгоритмов с плавающей точкой в FPGA или ASIC
- Использование FPGA для глубокого обучения
- Программные инструменты мигрируют GPU-код в FPGA для AI-приложений
Для получения дополнительных материалов Embedded подпишитесь на еженедельную рассылку.
Встроенный
- Проектирование встроенных систем: этапы, принципы и реальные применения
- Окрашивание 3D-печатных деталей восковыми мелками: новаторская техника постобработки
- Интервью с главным технологом ANSYS: симуляция как драйвер успеха металлической 3D-печати
- Использование встроенного ИИ для превращения Big Data в действенные Smart Insights
- Мастерство USB-C: вызовы дизайна и практические решения для high-speed данных и питания
- Тренды встроенного дизайна, переформирующие будущее технологий
- Foundries.io стремится стать Red Hat IoT с процессор-агностичным Linux и Zephyr решениями
- Clientron PST650: все-в-одном POS-терминал с встроенным термопринтером для гостеприимства и ритейла
- MAXREFDES220# — Бесманжетный мониторинг артериального давления с оптическими датчиками
- Максимизация производства с передовым ПО для аддитивного производства