Verilog38译码器
⼀、原理
输⼊为n,输出为2^n。⼀种多输⼊多输出的组合逻辑电路,负责将⼆进制代码翻译为特定的对象。在这⾥3-8译码器则将3为⼆进制代码翻译为8位只有⼀位为低电平其余全为⾼电平的对象。
⼆、时序
在这⾥采⽤组合逻辑,每输⼊⼀个三位⼆进制,就⽴即对应输出8位译码。
三、代码
decoder_38.v
module decoder_38(
input    clk,
input    rst_n,
input[2:0] din,
output reg [7:0] dout
);
always @(*)begin
case(din)
3'b000:dout<=8'b11111110;
3'b001:dout<=8'b11111101;
3'b010:dout<=8'b11111011;
3'b011:dout<=8'b11110111;
3'b100:dout<=8'b11101111;
3'b101:dout<=8'b11011111;
3'b110:dout<=8'b10111111;
3'b111:dout<=8'b01111111;
default:;
endcase
end
endmodule
decoder_38_tb.v
`timescale 1ns/1ps
module decoder_38_tb();
reg    tb_clk ;
reg    tb_rst_n;
reg  [2:0] tb_din ;
wire [7:0] tb_dout ;
decoder_38 u_decoder_38(
.clk (tb_clk  ),
.rst_n (tb_rst_n ),
.din (tb_din  ),
.dout  (tb_dout )
);
parameter CYCLE_CLOCK =20;
initial tb_clk =1'b1;
always #(CYCLE_CLOCK/2) tb_clk = ~tb_clk;
integer i=0,j=0;
initial begin
tb_din =3'd0;
tb_rst_n =1'b1;
#(20*CYCLE_CLOCK);
tb_rst_n =1'b0;
#(20*CYCLE_CLOCK);
tb_rst_n =1'b1;
repeat(20)begin
for(i=0;i<10;i=i+1)begin
j={$random}%10;
#2;
tb_din ={$random}%7;
#(j*CYCLE_CLOCK);
end
end
$stop;
end
endmodule
decoder_38.do
#tcl脚本仿真
decodervlib work
#创建⼯作库名为work
vmap work work
#映射⼯作库 work 到 work
vlog decoder_38_tb.v
#编译被testbench⽂件
vlog decoder_38.v
#编译被仿真⽂件
vsim -novopt work.decoder_38_tb
#指定仿真顶层
add wave -position insertpoint sim:/decoder_38_tb//* #添加testbench顶层模块中的信号波形窗
四、总结
可以对其进⾏扩展,例如4-16译码器,5-32译码器等等。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。