包括3-8译码器的程序文件、RTL原理图、时序仿真等内容。
涉及思路如下: 三八译码器有三根输入线,可以输入三位二进制数码,共有八种状态组合,即可译出 8 个输出信号,所以实验需要一个存放3位输入信号的变量in和一个8位输出信号的变量out,接下来只需要判断输入信号的数据来确定输出信号的数据就可以了,当输入信号为000时,输出信号应该为00000001,当输入信号为001时,输出信号应该为00000010,当输入信号为010时,输出信号应为00000100,后续信号同理。对于仿真代码,由于输入信号是一个从000开始每次加1的三位二进制数,所以仿真代码只需要使用for循环,然后通过一个integer变量i来控制循环次数,就可以做到输入信号数据的累加。
首先进行工程的创建,然后创建一个design source进行主程序的编写,然后进行仿真程序的编写,创建一个simulation source,这里只写了一个周期的三八译码器仿真代码,在定义好引脚后初始化寄存器,代码如下:
//主程序代码
`timescale 1ns / 1ps
module decode_3_8(
input [2:0]in,
output [7:0]out
);
assign out[0]=(in==3'd0); //先判断输入端in的值,然后根据结果对输出端out进行赋值
assign out[1]=(in==3'd1);
assign out[2]=(in==3'd2);
assign out[3]=(in==3'd3);
assign out[4]=(in==3'd4);
assign out[5]=(in==3'd5);
assign out[6]=(in==3'd6);
assign out[7]=(in==3'd7);
endmodule
//仿真代码
`timescale 1ns / 1ps
module decoder_3_8_tb();
reg [2:0]in0;
wire [7:0]out0;
decode_3_8 decoder_3_80(.in(in0),.out(out0));//定义设计文件名和使用变量
integer i=0; //定义inteager类对象,会在后续initial中进行例化
initial begin
for(i=0;i<=7;i=i+1)begin //通过for循环让输入端的三位二进制不断加1
# 10
in0=i;
end
# 30
$finish;
end
endmodule
之后进行仿真测试,点击run simulation后测试结果如下
可以看到,输出变量out按照00000001-00000010…..-10000000的顺序都依次输出了一次,输出的八个结果也正好对应了输入端的000-111,符合三八译码器的逻辑,也符合仿真代码中只执行一个选择周期的逻辑,可见实验代码没有问题。
点击Open Elaborated Designed进行所有程序的编译,产生的RTL图和编译结果如下
可见,实验电路符合三八译码器逻辑电路,实验代码没有error,认为实验成功,试验结束。