Данный проект является следующим шагом в освоении работы с FPGA, устройство позволяет ознакомиться с принципом работы с регистрами и семисегментными индикаторами. В проекте задействованы такие модули как блок из восьми переключателей, кнопки, восемь семисегментных индикаторов. Блок схема показана на рисунке 1.

Рисунок 1 – Блок схема устройства параллельной записи/чтения регистра

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

module reg_reg_led
(
input [7:0] sw,
input k4,k5,clk,
output reg [7:0] outled,
output reg [7:0] sevsegnumb = 8'b11111111
);
reg [7:0] buff= 8'b00000000;
reg [7:0] cnt = 8'b00000000;

Первый блок событий срабатывает на изменения любого сигнала, в теле блока находятся два условия, первое проверяет нажата ли кнопка k4, если кнопка нажата, то входной регистр с переключателей записывается во внутренний регистр(buff). Второе условие проверят кнопку k5 при нажатии на которой внутренний регистр записывается в регистр вывода на индикаторы(cnt).

always @(*)
begin
	if(k4==0)
		buff=sw;
	if(k5==0)
		cnt=buff;
end

В первой главе уже рассказано как работать с одним индикатором, но для того что бы вывести на каждый индикатор разное значение необходимо поочередно включать каждый индикатор и выводить в этот момент необходимое значение. Управление происходит с помощью регистра sevsegnumb которые отвечает за включение определённого индикатора и регистра outled который передает с помощью восьми бит комбинацию для отображения определенного символа на индикаторе.

Второй блок событий который из себя представляет из себя комбинированную схему делителя частоты и счетчика. В данном случае проверяется обнулился ли регистр clk1 и если он обнулился, то переменная i увеличивается на единицу. Если переменная i становиться равная 8, то она обнуляется.

Обнуления регистра clk1 происходит примерно за 0,0003 секунда, то есть именно такое количество времени один индикатор будет включен и за это время на него необходимо вывести символ.

integer i=0;
reg [0:13] clk1 = 14'b0;

always @ (posedge clk)
begin
	clk1<=clk1+1'b1;
if (clk1[0]==1)
	begin
		if (i==8)
		i=0;
		else
		i=i+1;
	end
end

Третий блок содержит в себе кейс который реагирует на изменение переменной i, и сопоставляет его со своим списком альтернатив и в соответствии с ним записывает в регистр sevsegnumb 8 битное значение, показывающие какой индикатор включить.

В этом же блоке с помощью условия проверяется каждый бит регистра cnt, равен ли он нулю либо единицы, и в соответствии с этим передает на информационную линию индикатора комбинацию необходимого символа, в наем случае либо нуля, либо единицы.

always @(*)
begin
	case (i)
		0:sevsegnumb <= 8'b01111111;
		1:sevsegnumb <= 8'b10111111;
		2:sevsegnumb <= 8'b11011111;
		3:sevsegnumb <= 8'b11101111;
		4:sevsegnumb <= 8'b11110111;
		5:sevsegnumb <= 8'b11111011;
		6:sevsegnumb <= 8'b11111101;
		7:sevsegnumb <= 8'b11111110;
		default sevsegnumb <= 8'b11111111;
	endcase
	
	if (cnt[i]==1)begin
	outled [7:0] = 8'b1111_1001;
	end else begin
	outled [7:0] = 8'b1100_0000;
	end
end
endmodule

Задействовано портов ввода/вывода 27, а логических блоков 89.