本次笔记记录的是4-16译码器的验证
下面我们看一下4-16译码器的真值表
从真值表中我们可以观察到,从十六组数据中取出要写程序的所需要的信息
例程:
modulemy_4_16(a,b,c,d,out);
inputa;
inputb;
inputc;
inputd;
outputreg[15:0]out;
always@(a,b,c,d)begin//a,b,c,d作为敏感信号
case({a,b,c,d})
4'b0000:out=16'b0000_0000_0000_0001;
4'b0001:out=16'b0000_0000_0000_0010;
4'b0010:out=16'b0000_0000_0000_0100;
4'b0011:out=16'b0000_0000_0000_1000;
4'b0100:out=16'b0000_0000_0001_0000;
4'b0101:out=16'b0000_0000_0010_0000;
4'b0110:out=16'b0000_0000_0100_0000;
4'b0111:out=16'b0000_0000_1000_0000;
4'b1000:out=16'b0000_0001_0000_0000;
4'b1001:out=16'b0000_0010_0000_0000;
4'b1010:out=16'b0000_0100_0000_0000;
4'b1011:out=16'b0000_1000_0000_0000;
4'b1100:out=16'b0001_0000_0000_0000;
4'b1101:out=16'b0010_0000_0000_0000;
4'b1110:out=16'b0100_0000_0000_0000;
4'b1111:out=16'b1111_1111_1111_1111;
//由于刚好16组数据,所以default语句不需要在写
endcase
end
endmodule
///`tb
`timescale1ns/1ns
modulemy_4_16_tb;
rega;
regb;
regc;
regd;
wire[15:0]out;
my_4_16my_4_16(
.a(a),
.b(b),
.c(c),
.d(d),
.out(out)
);
initialbegin
a=0;b=0;c=0;d=0;
#100;
a=0;b=0;c=0;d=1;
#100;
a=0;b=0;c=1;d=0;
#100;
a=0;b=0;c=1;d=1;
#100;
a=0;b=1;c=0;d=0;
#100;
a=0;b=1;c=0;d=1;
#100;
a=0;b=1;c=1;d=0;
#100;
a=0;b=1;c=1;d=1;
#100;
a=1;b=0;c=0;d=0;
#100;
a=1;b=0;c=0;d=1;
#100;
a=1;b=0;c=1;d=0;
#100;
a=1;b=0;c=1;d=1;
#100;
a=1;b=1;c=0;d=0;
#100;
a=1;b=1;c=0;d=1;
#100;
a=1;b=1;c=1;d=0;
#100;
a=1;b=1;c=1;d=1;
#200;
$stop;
end
endmodule
仿真波形图:
本次程序读懂真值表后不难写出,因为全部二进制书写,比较浪费时间.同样的,3-8译码器更容易写出
注: 程序模块名命名时不要以纯数字命名例如"4_16",编译时会报错