一、原理
输入为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脚本仿真
vlib 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译码器等等。