Verilog 3-8译码器

简介:
用Verilog实现一个3-8译码器。可分别用结构描述和行为描述的方式实现,目的是比较两种方式在实现目标电路时的优劣性。一般数字系统设计中行为描述会用于较高层次的电路设计,而结构描述多用于实现更底层的逻辑功能。
代码实现:

/*--------------------------------------------------
Filename: decoder3_8_02.v
Function: 用结构描述的方式实现一个可综合的3—8译码器
Author: Zhang Kaizhou
Date: 2019-10-24 20:50:28
--------------------------------------------------*/
module decoder3_8_02(ena, addr, y);
	//定义输入输出
	input ena;
	input [2 : 0] addr;
	output [7 : 0] y;
	
	//内部连线定义
	wire naddr0, naddr1, naddr2;
	
	//结构描述的方式实现
	not nt0(naddr0, addr[0]);
	not nt1(naddr1, addr[1]);
	not nt2(naddr2, addr[2]);
	and ad0(y[0], naddr2, naddr1, naddr0, ena);
	and ad1(y[1], naddr2, naddr1, addr[0], ena);
	and ad2(y[2], naddr2, addr[1], naddr0, ena);
	and ad3(y[3], naddr2, addr[1], addr[0], ena);
	and ad4(y[4], addr[2], naddr1, naddr0, ena);
	and ad5(y[5], addr[2], naddr1, addr[0], ena);
	and ad6(y[6], addr[2], addr[1], naddr0, ena);
	and ad7(y[7], addr[2], addr[1], addr[0], ena);
endmodule
/*--------------------------------------------------
Filename: decoder3_8_01.v
Function: 用行为描述的方式实现一个可综合的3—8译码器
Author: Zhang Kaizhou
Date: 2019-10-24 20:51:29
--------------------------------------------------*/
module decoder3_8_01(ena, addr, y);
	//定义输入输出
	input ena;
	input [2 : 0] addr;
	output [7 : 0] y;
	
	//内部寄存器定义
	reg [7 : 0] y;
	
	//行为描述的方式实现译码功能
	always@(addr or ena)
	begin
		if(!ena) y <= 8'b0000_0000;
		else
		begin
			casex(addr)
				3'b000: y <= 8'b0000_0001;
				3'b001: y <= 8'b0000_0010;
				3'b010: y <= 8'b0000_0100;
				3'b011: y <= 8'b0000_1000;
				3'b100:	y <= 8'b0001_0000;
				3'b101:	y <= 8'b0010_0000;
				3'b110:	y <= 8'b0100_0000;
				3'b111: y <= 8'b1000_0000;
				default: y <= 8'b0000_0000;
			endcase
		end
	end
endmodule
/*--------------------------------------------------
Filename: decoder3_8_t.v
Function: 3—8译码器测试代码
Author: Zhang Kaizhou
Date: 2019-10-24 20:52:26
--------------------------------------------------*/
`timescale 1ns/1ns
module decoder3_8_t(y);
	//定义输出端口
	output [7 : 0] y;
	
	//定义寄存器及连线
	reg ena;
	reg [2 : 0] addr;
	
	//产生测试信号
	initial
	begin
		#2 ena = 0; addr = 3'b000;
		#10 ena = 1;
		#10 addr = 3'b001;
		#10 addr = 3'b010;
		#10 addr = 3'b011;
		#10 addr = 3'b100;
		#10 addr = 3'b101;
		#10 addr = 3'b110;
		#10 addr = 3'b111;
		#100 $stop;
	end
	
	//实例化待测模块
	//decoder3_8_01 m0(.ena(ena), .addr(addr), .y(y));
	decoder3_8_02 m0(.ena(ena), .addr(addr), .y(y));
endmodule

ModelSim仿真结果:
Verilog 3-8译码器_第1张图片
总结:
由上面的仿真结果知,两种方式实现的3-8译码器的逻辑功能正常,达到了设计预期。

你可能感兴趣的:(FPGA相关)