一.三八译码器
译码器(Decoder)是一种多输入多输出的组合逻辑电路,负责将二进制代码翻译为特定的对象(如逻辑电平等),功能与编码器相反。译码器一般分为通 用译码器和数字显示译码器两大类。本节设计的是通用译码器,数字显示译码 器会在数码管驱动设计章节中详细介绍。
以 3-8 译码器为例,即将 3 种输入状态翻译成 8 种输出状态,其真值表如下表所示,其中 A,B,C 为数据输入,Out 为数据输出。在 MCU 应用中,如果需要保证一定的速度情况下实现此功能,一般选取外挂一片 74HC38 或者 74LS38 等独立芯片,但 FPGA 提供了一个完整的想象以及实现空间,仅靠其自身即可实现设计要求。
A | B | C | OUT |
0 | 0 | 0 | 0000_0001 |
0 | 0 | 1 | 0000_0010 |
0 | 1 | 0 | 0000_0100 |
0 | 1 | 1 | 0000_1000 |
1 | 0 | 0 | 0001_0000 |
1 | 0 | 1 | 0010_0000 |
1 | 1 | 0 | 0100_0000 |
1 | 1 | 1 | 1000_0000 |
二.模块接口图
三.Verilog代码设计
`timescale 1ns / 1ps
module decoder_38(
in_a,
in_b,
in_c,
out
);
input in_a;
input in_b;
input in_c;
output reg [7:0] out;
always@(*)begin
case({in_a,in_b,in_c})
3'b000: out= 8'b0000_0001;
3'b001: out= 8'b0000_0010;
3'b010: out= 8'b0000_0100;
3'b011: out= 8'b0000_1000;
3'b100: out= 8'b0001_0000;
3'b101: out= 8'b0010_0000;
3'b110: out= 8'b0100_0000;
3'b111: out= 8'b1000_0000;
endcase
end
endmodule
使用此方法所设计的电路图如下:
四.仿真代码以及仿真结果
仿真代码:
`timescale 1ns / 1ps
module decoder_38_tb();
reg in_a;
reg in_b;
reg in_c;
wire [7:0] out;
decoder_38 decoder_ins(
.in_a(in_a),
.in_b(in_b),
.in_c(in_c),
.out(out)
);
initial begin
in_a = 0;in_b = 0;in_c = 0;
#20;
in_a = 0;in_b = 0;in_c = 1;
#20;
in_a = 0;in_b = 1;in_c = 0;
#20;
in_a = 0;in_b = 1;in_c = 1;
#20;
in_a = 1;in_b = 0;in_c = 0;
#20;
in_a = 1;in_b = 0;in_c = 1;
#20;
in_a = 1;in_b = 1;in_c = 0;
#20;
in_a = 1;in_b = 1;in_c = 1;
end
endmodule
仿真结果:
通过整体的代码逻辑和仿真输出来看,仿真波形符合设计的逻辑。
五.引脚约束
set_property PACKAGE_PIN AB22 [get_ports in_a]
set_property PACKAGE_PIN AB21 [get_ports in_b]
set_property PACKAGE_PIN AA20 [get_ports in_c]
set_property PACKAGE_PIN AB14 [get_ports {out[0]}]
set_property PACKAGE_PIN AA14 [get_ports {out[1]}]
set_property PACKAGE_PIN AA15 [get_ports {out[2]}]
set_property PACKAGE_PIN AA12 [get_ports {out[3]}]
set_property PACKAGE_PIN R17 [get_ports {out[4]}]
set_property PACKAGE_PIN T17 [get_ports {out[5]}]
set_property PACKAGE_PIN U19 [get_ports {out[6]}]
set_property PACKAGE_PIN V19 [get_ports {out[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {out[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {out[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {out[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {out[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {out[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {out[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {out[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {out[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports in_a]
set_property IOSTANDARD LVCMOS33 [get_ports in_b]
set_property IOSTANDARD LVCMOS33 [get_ports in_c]
六.上板测试
通过整体的代码逻辑上板测试的输出来看,上板测试的结果符合设计的逻辑。