1i7 (1i7) wrote,
1i7
1i7

Categories:

Лабораторная работа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 (+).

Ячейки можно соединять проводом с макетной платой. Управлять ячейками ввода-вывода очень просто - точно так, как рычагом sw и светодиодом ld - их нужно просто обозначить в ucf-файле (у каждой однобитной ячейки свое имя), после чего после записи в них 1 или 0 из программы на Verilog подключенное к ним внешнее устройство на проводе подключения будет получать напряжение (+) или (-).

- Семисегментный дисплей с общим анодом. Для включения сегмента дисплея на соответствующую ножку  нужно подавать напряжение LOW (-), т.е. в нужную ножку PIO записывать значение 0=FALSE, а не HIGH=(+)=1=TRUE.



- В Verilog есть также простой и удобный оператор условного выбора:

assign out1 = condition ? val_cond_true : val_cond_false;

Работает точно также, как аналог в C++ и Java.

condition - это булево значение - 1 или 0 (например значение на одном из входов). Если condition=1=TRUE, переменной out1 будет присвоено значение val_cond_true, если condition=0=FALSE, переменной out2 будет присвоено значение val_cond_false.


решение

Для начала удобно пронумеровать все сегменты дисплея индексом начиная с 0 (как будет внутри программы), а не с 1 (как нарисовано в исходной схеме).



После чего стандартно создать новый проект, создать один рабочий модуль seven_driver, один модуль верхнего уровня seven_driver_basys2, раскомментировать в ucf-файле 8 строк для двух модулей PIO и оставить один рычаг sw, разместить на макетной плате дисплей, подключить макетную плату проводками к портам PIO так, чтобы ножки дисплея были соединены с ножками PIO в нужном порядке, подключить порт VCC (+) к ножке питания дисплея, залить на плату синтезированную прошивку из bit-файла и переключая рычаг sw[0] помигать дисплеем меняя туда-сюда цифры "5"/"7".

seven_driver.v
module seven_driver(
    input value,
    output [0:7] segments
    );

     // value=true - 7
     // value=false - 5  

     assign segments[0] = value ? 0 : 0;
     assign segments[1] = value ? 0 : 1;
     assign segments[2] = value ? 1 : 1;
     assign segments[3] = value ? 1 : 1;
     assign segments[4] = value ? 1 : 0;
     assign segments[5] = value ? 1 : 1;
     assign segments[6] = value ? 0 : 1;
     assign segments[7] = value ? 0 : 1;

endmodule

seven_driver_basys2.v
module seven_driver_basys2(
    input [0:0] sw,
    output [72:79] pio
    );

seven_driver driver57(.value(sw[0]), .segments(pio));

endmodule

basys2.ucf
# Pin assignment for slide switches
NET "sw<0>" LOC = "p11";

# Loop Back only tested signals
NET "PIO<72>" LOC = "B2";
NET "PIO<73>" LOC = "A3";
NET "PIO<74>" LOC = "J3";
NET "PIO<75>" LOC = "B5";

NET "PIO<76>" LOC = "C6";
NET "PIO<77>" LOC = "B6";
NET "PIO<78>" LOC = "C5";
NET "PIO<79>" LOC = "B7";






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


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


Ссылки

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

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

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

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments