April 19th, 2012

Лабораторная работа2: знакомство с платой ПЛИС (FPGA) - основы комбинаторной логики (1)

Введение: Для введения я сначала приготовил небольшой документ, который появился по результатам переписки с Юрием Панчулом и Сергеем Вакуленко, следуя которому я хотел рассказать про индустрию инструментов автоматизации проектирования электронных приборов (EDA), цикл разработки и производства микропроцессора и про текущее состояние на рынке инженеров цифрового дизайна. Но через 3 минуты после начала стало понятно, что информация о том, что для разработки процессоров используются платы ПЛИС и язык Verilog, не очень хорошо впитывается в людей, которые платы ПЛИС и язык Verilog никогда перед этим раньше не видели, поэтому рассказ по содержимому документа я решил оставить до более подходящего случая (например в качестве подведения итогов по области ПЛИС после лабы с процессором) и сразу приступить к практической части - знакомству с платами ПЛИС и языком Verilog.

1. Запуск среды разработки и создание проекта для платы Digilent Basys 2

Запустить среду разработки специально подготовленным скриптом (см установка программного обеспечения):


> /opt/Xilinx/bin/start_ise.sh

или 2мя командами в терминале:


> . /opt/Xilinx/13.4/ISE_DS/settings32.sh
> ise &

На появившемся экране нажать кнопку "New Project...", в появившемся диалоге "New Project Wizard" ввести имя проекта "basic_boolean" (место положения проекта можно сменить по желанию), нажать Next:



Collapse )

2. Создать файл с исходным кодом на Verilog - пустой модуль

Далее создаем первый файл с исходниками на верилоге: меню Project > New Source..., в открывшемся диалоге "New Source Wizard":
- выбираем в списке слева тип файла исходного кода (Source Type) = Verilog Module
- Вводим справа в поле File name: basic_boolean

кнопка Next


Collapse )

3. Структурная единица дизайна на Verilog - модуль как черный ящик со входами и выходами

Далее небольшое разъяснения о том, что из себя представляет модуль HDL (Verilog). Модуль Verilog - это основная структурная единица построения цифровой системы - по сути полный аналог физического модуля цифровой логики (logic gate) из 1й лабораторной работы (см упражнение 7 - модуль 4011 - 4NAND) - черный ящик с ножками - на какие-то ножки (input) подается входной сигнал - параметры модуля, с других ножек (output) считывается выходной сигнал - результат работы модуля.



тот же модуль в виде таблицы истинности

Определение любого модуля начинается с перечисления его входов (input) и выходов (output) в зависимости о того, что от этого модуля требуется.

В модуле basic_boolean будет проверена работа базовых булевых операторов NOT, AND, OR, NAND, поэтому у него будет два входа (2 операнда - a и b) и несколько выходов - по одному на каждый оператор (для NOT пусть будет 2) - возьмем:

Collapse )
4. Базовые булевы операторы

В теле модуля входами и выходами можно оперировать примерно как переменными внутри привычной программы - переменным-выходам можно присваивать значения при помощи оператора assign - при этом значением может быть резульатат действия стандартных булевых операторов (или их комбинаций) над переменными-входами (или другими внутренними переменными или числовыми константами).

Каждый вход и выход в данном случае несет ровно 1 бит информации (1=TRUE, 0=FALSE). Значения 2х входных битиков конвертирует в значения 5ти выходных битиков - добавляем еще несколько строк кода:

basic_boolean.v
module basic_boolean(input a, input b,
    output not_a, output not_b, output a_and_b,
    output a_or_b, output a_nand_b
    );

assign not_a = ~a; // NOT
assign not_b = ~b; // NOT
assign a_and_b = a & b; // AND
assign a_or_b = a | b; // OR
assign a_nand_b = ~(a & b); // NAND

endmodule


Collapse )
4. Синтез (synthesis) для ПЛИС (FPGA)




Перед синтезом для платы ПЛИС нужно сначала понять, что любая плата ПЛИС опять же представляет из себя черный ящик - внутри него находится прошивка, синтезированная из программы на Verilog, а снаружи опять же торчат разные устройства ввода (рычажки, кнопки, порт для клавиатуры и т.п) и вывода (отдельные светодиоды, светодиодный дисплей, порт для VGA-дисплея и т.п.), которые с одной стороны доступны человеку, работающему с платой (понажимать кнопки, посмотреть на светодиоды), а с другой - доступны для манипуляций внутри программы (считать значение вкл/выкл с определенного рачажка, подать значение вкл/выкл в нужный светодиод).

Соответственно для того, чтобы программа на Verilog получила возможность начать общение с устройствами ввода/вывода конкретной платы, нужен некий механизм, который ей в этом поможет. Для этого в среде разработки Xilinx ISE WebPack используется механизм специальных файлов с расширением ucf.

4.1. Подключение ucf-файла с описанием структуры платы ПЛИС

Все устройства ввода-вывода на плате ПЛИС пронумерованы уникальными идентификаторами. На Dililent Basys 2 эти идентификаторы можно посмотреть прямо на самой плате или же узнать из документации, доступной на сайте продукта.




см белые подписи рядом с каждым устройством




Устройства ввода рычажки SW и ввода-вывода PIO (о них ниже)

Для проверки работы модуля basic_boolean выберем два рычажка (каждый из которых может находиться в 2х состояниях - LOW/HIGH=0/1=FALSE/TRUE) - для входных параметров a и b и 5 светодиодов (которые тоже могут находиться в 2х состояниях - ВЫКЛ/ВКЛ=LOW/HIGH=0/1=FALSE/TRUE) - для выходных значений not_a, not_b, a_and_b, a_or_b, a_nand_b.

Collapse )

4.2. Создание модуля верхнего уровня для манипуляции реальными устройствами ввода/вывода платы ПЛИС

Как уже было сказано выше, основная структурная единица дизайна на Verilog - это модуль с набором входов и выходов. В рамках дизайна можно "размещать" модули на одном уровне друг рядом с другом и подключать выходы одного модуля к входам другого. А еще можно поместить несколько модулей внутрь другого модуля более высокого уровня - тогда входы внешнего модуля будут подключены к входам внутренних модулей, а выходы внутренних модулей будут подключены к выходам внешнего модуля. Таким образом дизайн на Verilog может расти как вширь, так и вглубь на любое количество уровней.


Collapse )
4.3. Синтез прошивки

Можно синтезировать прошивку для ПЛИС - в списке действий под деревом проекта выбрать элемент Generate Programming File, кликнуть два раза и подождать пока рядом с элементом не появится зеленый кружочек с белой галочкой внутри - значит bit-файл (basic_boolean_basys2.bit) с прошивкой готов.


Collapse )
sw[0], sw[1] справа налево
ld[0]...ld[4] справа налево



a=sw[0]=FALSE, b=sw[1]=FALSE
ld[0]=not_a=TRUE
ld[1]=not_b=TRUE
ld[2]=a_and_b=FALSE
ld[3]=a_or_b=FALSE
ld[4]=a_nand_b=TRUE



a=sw[0]=TRUE, b=sw[1]=FALSE
ld[0]=not_a=FALSE
ld[1]=not_b=TRUE
ld[2]=a_and_b=FALSE
ld[3]=a_or_b=TRUE
ld[4]=a_nand_b=TRUE




a=sw[0]=FALSE, b=sw[1]=TRUE
ld[0]=not_a=TRUE
ld[1]=not_b=FALSE
ld[2]=a_and_b=FALSE
ld[3]=a_or_b=TRUE
ld[4]=a_nand_b=TRUE



a=sw[0]=TRUE, b=sw[1]=TRUE
ld[0]=not_a=FALSE
ld[1]=not_b=FALSE
ld[2]=a_and_b=TRUE
ld[3]=a_or_b=TRUE
ld[4]=a_nand_b=FALSE

Небольшое видео с процессом синтеза и программирования платы ПЛИС, чтобы тем, у кого платы ПЛИС под рукой пока нет, было видно как все происходит действительно просто, но немного долго:



5. Знакомство с симуляцией (simulation)

Перед тем, как запускать дизайн на ПЛИС или если под рукой нет платы ПЛИС, работоспособность модулей Verilog хорошо бы проверить сразу на компьютере - специально для этой задачи созданы симуляторы.

В самом простом случае симулятор позволяет программно задать значения (1=TRUE=HIGH/0=FALSE=LOW) на входы модуля и показывает на специальном графике, какие при этом значения (опять же 1=TRUE=HIGH/0=FALSE=LOW) генерируются на выходах модуля.
Collapse )



продолжение см Лабораторная работа2 (2)

Лабораторная работа2: знакомство с платой ПЛИС (FPGA) - основы комбинаторной логики (2)

начало см Лабораторная работа2 (1)

6. Самостоятельная работа - драйвер для семисегментного диодного дисплея

На самостоятельную работы - написать драйвер для 7мисегментного диодного дисплея, с которым уже емели дело в Лабораторной работе 1 с макетными платами. Т.к. у нас логика пока только комбинаторная и текущее состояние входов системы однозначно определяет состояние всех выходов системы, задача будет немного упрощена - дисплей должен показывать всего 2 разных цифры в зависимости от текущего положения рычага sw[0] (HIGH/LOW) - при sw[0]=HIGH дисплей пусть показывает цифру "5", при sw[0]=LOW - цифру "7".

Дополнительная информация:

- Использовать встроенный в плату дисплей не очень интересно - лучше заодно сразу ознакомиться с возможностью подключения к плате внешних устройств. Для будут использованы специальные порты ввода-вывода Pmod Connectors, доступные на плате в сочетании с проводами и макетной платой из первой лабораторной работы.



На Digilent Basys 2 доступно 4 таких порта - JA, JB, JC и JD - каждый из них содержит по 4 ячейки ввода-вывода + 2 ячейки для подачи питания на внешние устройства - GND (-) и VCC (+).
Collapse )



value=sw[0]=HIGHT=1 ⇒ '7'


value=sw[0]=LOW=0 ⇒ '5'


Ссылки

Исходный код всех упражнений лабораторной работы в проектах Xilinx ISE WebPack доступен в специальном репозитории на github.

Во время проведения лабораторной работы полезно под рукой иметь распечатанный листинг всех исходных файлов.

Хороший онлайн-генератор html+css-кода с подстветкой исходных файлов для разных языков программирования (поддерживает Verilog).