Небольшой учебный проект на SystemVerilog для платы Nexys A7-100T, в котором положение переключателей sw_i[15:0] управляет цветом встроенного RGB LED, а также выводит шестнадцатеричное представление цвета на 7-segment display.
Модуль led принимает 16-битное значение с переключателей и использует его как источник компонент цвета:
- красный канал
R - зелёный канал
G - синий канал
B
Цвет выводится двумя способами:
- через встроенный
RGB LEDс помощьюPWM - через шестиразрядную индикацию
7-segment, где отображается значениеRGBв шестнадцатеричном формате
Таким образом проект одновременно показывает:
- базовую работу с внешними входами платы
- генерацию
PWM - динамическую индикацию на семисегментном дисплее
- использование
XDC-констрейнтов для реальной FPGA-платы
В проекте реализованы:
- приём 16-битного значения от переключателей
sw_i - формирование компонент
red,green,blue - расширение цветовых каналов до 8 бит
- генерация
PWMдляLED16_R,LED16_G,LED16_B - формирование 24-битного слова
hex_RGB - мультиплексирование 6 разрядов семисегментного индикатора
- декодер
hex -> 7-segment - простой testbench
- файл ограничений
XDCдля платыNexys A7-100T
clk_i— тактовый сигналrst_i— асинхронный сброс, активный низким уровнемsw_i[15:0]— входы от переключателей платы
LED16_R— красный канал встроенного RGB-светодиодаLED16_G— зелёный канал встроенного RGB-светодиодаLED16_B— синий канал встроенного RGB-светодиодаan_o[7:0]— управление разрядами семисегментного индикатораca_o ... cg_o— сегменты индикатора
Значение sw_i[15:0] разбивается на три цветовых канала:
red— старшие битыgreen— средние битыblue— младшие биты
Для красного и синего каналов используется расширение до 6 бит, после чего все три канала преобразуются в 8-битный формат:
red_8green_8blue_8
Далее формируется общее 24-битное значение:
hex_RGB = {red_8, green_8, blue_8}
Для управления яркостью используется PWM.
В модуле работает 6-битный счётчик cnt_my_ff, который непрерывно увеличивается.
На каждом такте текущие значения цветовых каналов сравниваются со счётчиком:
- если
cnt_my_ff < red, включается красный канал - если
cnt_my_ff < green, включается зелёный канал - если
cnt_my_ff < blue, включается синий канал
За счёт этого формируется широтно-импульсная модуляция, и яркость каждого цвета зависит от положения переключателей.
Параллельно значение hex_RGB выводится на семисегментный индикатор.
Для этого:
- делитель частоты
clk_div_ffзамедляет переключение разрядов - счётчик
scan_cnt_ffвыбирает активный разряд - из
hex_RGBвыбирается текущая 4-битная тетрада - декодер преобразует её в сигналы сегментов
ca_o ... cg_o
В проекте используются 6 разрядов, поскольку 24-битное значение RGB содержит 6 шестнадцатеричных цифр.
В testbench проверялись следующие сценарии:
- начальный сброс
- запуск модуля после снятия сброса
- установка значения только для красного канала
- установка значения только для зелёного канала
- установка значения только для синего канала
- установка нулевого значения
- установка
16'hFFFFдля проверки максимального заполнения
Для проверки использовались значения:
16'b11111_000000_0000016'b00000_111111_0000016'b00000_000000_1111116'h000016'hFFFF
Это позволяет посмотреть на waveform:
- изменение сигналов
LED16_R,LED16_G,LED16_B - работу
PWM - переключение активных разрядов
an_o - формирование сегментов индикатора
Проект подготовлен под плату:
Digilent Nexys A7-100T
В файле nexys_a7_100t.xdc заданы ограничения для:
- входного тактового сигнала
clk_i - переключателей
sw_i[15:0] - встроенного RGB LED
- семисегментного индикатора
В результате был получен учебный модуль, который преобразует положение переключателей в цветовое значение, управляет встроенным RGB-светодиодом через PWM и одновременно отображает шестнадцатеричное значение цвета на семисегментном индикаторе.
Работа проекта была проверена в моделировании с помощью простого testbench и подготовлена для запуска на реальной FPGA-плате через XDC-констрейнты.