Проект написан на языке описания аппаратуры Verilog HDL. Модули отладочной платы, задействованные в реализации проекта: кварцевый генератор на 50 мГц, группа из 12 светодиодов. С помощью данного проекта приобретаются навыки работы с портами ввода\вывода, делителем частоты, блоками событий. Блок схема данного проекта приведена на рисунке 1.

Рисунок 1 – Блок схема проекта по работе с группой светодиодов

Изначально необходимо указать имя модуля и назначить порты ввода/вывода. В данном случае входными являются сигнал с кварцевого генератора (clk), а выходным регистр из 12 бит (led_d).

После указывается дополнительный регистр из 26 бит(clk1), который в свою очередь будет генерировать для кейса управления, сигналы выражения.

module led_r (clk,led_d);
output reg [11:0] led_d;
input clk;

reg [25:0] clk1 ;

Первый блок события (always) реагирует на фронт тактирующего сигнала (clk). Каждое срабатывание блока события в данном случает прибавляет к дополнительному регистру (clk1) один бит, после переполнения регистр clk1 обнуляется и процесс начинается с начала. Для полного заполнения регистра clk1 необходимо 67 108 863 тактов сигнала clk. Наш генератор работает на частоте 50 мГц, то есть за одну секунду он генерирует 50 000 000 тактовых сигналов, следовательно, регистр clk1 будет обнулятся примерно через 1,34 секунды. Таким образом и реализуется делитель частоты.

always @ (posedge clk)
begin
	clk1<=clk1+1;
end

Второй блок событий так же реагирует на фронт тактирующего сигнала (clk), но в теле блока расположен блок кейс. В котором последние 4 бита регистра (clk1) являются выражением. В кейсе расписаны альтернативы и присвоенные им операции. Рассмотрим процесс срабатывания на примере первой альтернативы. Каждый фронт тактирующего сигнала запускает кейс, в котором выражение состоящие из 4 последних бит регистра clk1 сравниваются с альтернативой (которая записана в десятичном виде). Если перевести 1 из десятичной в двоичную систему, то получится 0001.

always @ (posedge clk)
begin
case (clk1 [25:22])
	1:led_d [11:0]<=12'b0000_0000_0001;
	2:led_d [11:0]<=12'b0000_0000_0011;
	3:led_d [11:0]<=12'b0000_0000_0111;
	4:led_d [11:0]<=12'b0000_0000_1111;
	5:led_d [11:0]<=12'b0000_0001_1111;
	6:led_d [11:0]<=12'b0000_0011_1111;
	7:led_d [11:0]<=12'b0000_0111_1111;
	8:led_d [11:0]<=12'b0000_1111_1111;
	9:led_d [11:0]<=12'b0001_1111_1111;
	10:led_d [11:0]<=12'b0011_1111_1111;
	11:led_d [11:0]<=12'b0111_1111_1111;
	12:led_d [11:0]<=12'b1111_1111_1111;
	13:led_d [11:0]<=12'b0000_0000_0000;
	14:led_d [11:0]<=12'b1111_1111_1111;
endcase
end
endmodule

То есть оператор первой альтернативы запуститься только тогда, когда 4 последних бита clk1 примут состояние 0001. И в этот момент регистру выхода led_d присвоиться значение из двенадцати указанных бит. Которые в свою очередь указывают на то какой светодиод включен (логический ноль) а какой выключен (логическая единица).

Назначение портов входов/выходов произведена в соответствии с таблицей пинов и показана на рисунке 2.

Рисунок 2 – Назначенные порты ввода/вывода для проекта со светодиодами

Общее количество задействованных портов 13 штук, общее количество задействованных логических блоков 39.