一、程序文件源码+注释分析moduledecode38(data_in,data_out,enable);input[2:0]data_in;//定义输入,对应38译码器的8个输出状态output[7:0]data_out;//定义输出,对应38译码器的3个输入状态inputenable;//定义输入一个开关控制信号reg[7:0]data_out;//将输出定义为寄存器型变量,表示过程块语句always内的指定信号always@(data_inorenable)begin//电平触发(输入信号发生电平变化时,执行always块中语句)if(enable==1)//如果控制开关打开,就进行译码case(data_in)3'b000:data_out=8'b11111110;3'b001:data_out=8'b11111101;3'b010:data_out=8'b11111011;3'b011:data_out=8'b11110111;3'b100:data_out=8'b11101111;3'b101:data_out=8'b11011111;3'b110:data_out=8'b10111111;3'b111:data_out=8'b01111111;default:data_out=8'bxxxxxxxx;endcaseelse//否则将输出高电平data_out=8'b11111111;endendmodule二、测试文件源码+注释分析`timescale1ns/10psmoduledecode38_tb;//测试文件,即在仿真软件中以编程文件的方式,给定对应程序文件的输入信号和控制信号reg[2:0]data_in_tb;//定义输入为寄存器型变量wire[7:0]data_out_tb;//定义输出为连线型变量regenable_tb;//定义输入控制信号为寄存器型变量decode38t1(data_in_tb,data_out_tb,enable_tb);//调用需要测试的程序文件,此处括号内给的变量,顺序要求和调用的程序处定义的变量的顺序一致initialbeginenable_tb=0;data_in_tb=0;#20enable_tb=1;//在第20个周期处打开控制开关,下面每隔50个周期就增加一次输入信号,仿真结束后就可以看到所有的译码结果#50data_in_tb=0;#50data_in_tb=1;#50data_in_tb=2;#50data_in_tb=3;#50data_in_tb=4;#50data_in_tb=5;#50data_in_tb=6;#50data_in_tb=7;#50$finish();endendmodule三、下图为仿真实验结果四、38译码器的其他几种解法第一种:if-else语法moduledecode38(data_in,data_out,enable);input[2:0]data_in;output[7:0]data_out;inputenable;reg[7:0]data_out;always@(data_inorenable)beginif(enable==1)if(data_in==3'b000)data_out=8'b11111110;elseif(data_in==3'b001)data_out=8'b11111101;elseif(data_in==3'b010)data_out=8'b11111011;elseif(data_in==3'b011)data_out=8'b11110111;elseif(data_in==3'b100)data_out=8'b11101111;elseif(data_in==3'b101)data_out=8'b11011111;elseif(data_in==3'b110)data_out=8'b10111111;elseif(data_in==3'b111)data_out=8'b01111111;elsedata_out=8'bxxxxxxxx;elsedata_out=8'b11111111;endendmodule第二种:算法实现(不可综合)moduledecode38(data_in,data_out,enable);input[2:0]data_in;output[7:0]data_out;inputenable;regA=8’b0000_0001;assigndata_out=(enable)?(~(Adata_in-1)):8'b1111_1111;//此处采用Y?A:B三目算法,即Y为1时选择A执行,Y为0时选择B执行endmodule第三种:for语句moduledecode38(data_in,data_out,enable);input[2:0]data_in;output[7:0]data_out;inputenable;reg[7:0]data_out;integeri;always@(data_inorenable)begindata_out=8'hff;if(enable)beginfor(i=0;i8;i=i+1)beginif(data_in==i)data_out=255-(1i);endendelsedata_out=8'hff;endendmodule第四种:带条件的连续赋值moduledecode38(data_in,data_out,enable);input[2:0]data_in;output[7:0]data_out;inputenable;assigndata_out=//此处把译码选择嵌入到连续嵌套的Y?A:B语句中,任意一个”:”后的内容都可看成是当前”:”所对应的三目条件语句中的B条件({enable,data_in}==4'b1000)?8'b1111_1110:({enable,data_in}==4'b1001)?8'b1111_1101:({enable,data_in}==4'b1010)?8'b1111_1011:({enable,data_in}==4'b1011)?8'b1111_0111:({enable,data_in}==4'b1100)?8'b1110_1111:({enable,data_in}==4'b1101)?8'b1101_1111:({enable,data_in}==4'b1110)?8'b1011_1111:({enable,data_in}==4'b1111)?8'b0111_1111:8'b1111_1111;endmodulePS:以上几种解法为网络搜索结果,并未仿真验证,仅仅整理和注释,仅供学习参考使用转载自