В данном проекте предлагается ознакомиться с работой декодеров 2 на 4 и 3 на 8, реализовать наглядную демонстрацию их работы, а также спроектировать более сложное устройство дешифрации кодов который имеет 5 входов и 32 выхода. Модули, задействованные в реализации проекта: восемь семисегментных индикаторов, блок состоящий из восьми переключателей и кварцевый генератор. С помощью данного проекта приобретаются навыки работы кейсов с группой сигналов.

Различие с входными/выходными сигналами от предыдущего проекта заключается в том, что отсутствуют сигналы кнопок.

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

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

Первый переключатель отвечает за включение дешифратора 2 на 4, а второй включает дешифратор 3 на 8, если включены оба переключателя, то на индикаторах будут все нули. В первом блоке событий который реагирует на изменение любого сигнала, с помощью трех условий и двух кейсов описывается весь процесс. С помощью второго и третьего переключателя задается комбинация для первого дешифратора в том случае если он включен. В момент, когда включен второй дешифратор с помощью второго, третьего и четвертого переключателя задается комбинация уже для него.

module dec_2_and_3
(
input [7:0] sw,
input clk,
output reg [7:0] outled,
output reg [7:0] sevsegnumb = 8'b11111111
);

reg [7:0] cnt = 8'b00000000;

always @(*)
begin
	if (sw[0]==0)
	begin
		case (sw[3:2])
			2'b11: cnt[7:0]=8'b00000001;
			2'b10: cnt[7:0]=8'b00000010;
			2'b01: cnt[7:0]=8'b00000100;
			2'b00: cnt[7:0]=8'b00001000;
			default cnt[7:0]=8'b00000000;
		endcase
	end
	if (sw[1]==0)
	begin
		case (sw[4:2])
			3'b111: cnt[7:0]=8'b00000001;
			3'b110: cnt[7:0]=8'b00000010;
			3'b101: cnt[7:0]=8'b00000100;
			3'b100: cnt[7:0]=8'b00001000;
			3'b011: cnt[7:0]=8'b00010000;
			3'b010: cnt[7:0]=8'b00100000;
			3'b001: cnt[7:0]=8'b01000000;
			3'b000: cnt[7:0]=8'b10000000;
			default cnt[7:0]=8'b00000000;
		endcase
	end
	if((sw[1]==1) && (sw[0]==1))
	begin
		cnt[7:0]=8'b00000000;
	end
end

Далее используется уже знакомый блок вывода регистра на семисегментные индикаторы. Общее число использованных портов ввода/вывода равно 25, число использованных логических блоков 71.

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

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

После проверки работоспособности двух дешифраторов можно приступить к моделированию дешифратора имеющий 5 входов и 32 выхода, для этого необходимо создать новый проект, код которого приведен в конце.

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

Рисунок 2 -  Блок схема дешифратора 5 на 32

Суть заключается в том, что старшие три входных бита подключаются параллельно к входам четырех дешифраторов 3 на 8, а младшие подключаются к входу дешифратора 2 на 4 который в свою очередь управляет включением одного из четырех дешифраторов три на восемь с помощью дополнительного сигнала разрешения. Смоделированная блок схема приведена на рисунке 2. Количество задействованных логических блоков в усовершенствованном проекте равно 36.

module dec5x32 (A,Y);
input [4:0] A;
output wire [31:0] Y;
wire [3:0] E;
decoder2x41 decoder2x4x1 (A[4:3], E[3:0]);
decoder3x8 decoder3x8x1 (A[2:0], E[0] , Y[7:0]);
decoder3x8 decoder3x8x2 (A[2:0], E[1] , Y[15:8]);
decoder3x8 decoder3x8x3 (A[2:0], E[2] , Y[23:16]);
decoder3x8 decoder3x8x4 (A[2:0], E[3] , Y[31:24]);
endmodule 

module decoder2x41(A1,E1);
input [1:0] A1;
output reg [3:0] E1;

always @(*)
	case (A1)
		2'b00: E1=4'b0001;
		2'b01: E1=4'b0010;
		2'b10: E1=4'b0100;
		2'b11: E1=4'b1000;
		default E1=4'b0000;
	endcase
endmodule 

module decoder3x8(A2,E2,Y2);
input [2:0] A2;
input E2;
output reg [7:0] Y2;

always @(*)
	case ({E2,A2})
		4'b1000: Y2=8'b00000001;
		4'b1001: Y2=8'b00000010;
		4'b1010: Y2=8'b00000100;
		4'b1011: Y2=8'b00001000;
		4'b1100: Y2=8'b00010000;
		4'b1101: Y2=8'b00100000;
		4'b1110: Y2=8'b01000000;
		4'b1111: Y2=8'b10000000;
		default Y2=8'b00000000;
	endcase
endmodule