简介:
用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