本次笔记记录的是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",编译时会报错
