FPGA学习篇——Verilog学习译码器的实现
PS:目前手上仍然没有板子,按照野火视频的讲解,目前我们只能做到前面六步(其实第一步设计规划也是需要看板子的硬件的,但是现在没有板子就完全与野火传授的板子一致来看)
1 设计规划及真值表(波形绘制)
译码器的原理:译码器可理解把编码(或者理解为代号)译出对应的输出结果。(可以理解为每一件事都有一个编号,而译码器的作用就是通过编号来找出对应哪件事)
根据原理,两个输入可以有00,01,10,11四种编码就可以对应四种输出情况,三个输入可以有000,001......八种编码,就可以对应8种输出情况。因此,n个输入对应于种输出情况。
除此以外,按照译码器的原理来看,输出的结果应该是可以任意定义的。但未作任何说明的话,则二进制的译码器输出默认使用独热码形式(即只有一位为1其他为0)。
比如三八译码器(在这里我们直接使用真值表,不绘制波形图了,真值表更加直观):三位输入,输出用8位独热码表示。(实际上,如果有实际需要,三八译码器的输出可以是你定义的任何八种输出。)
2 代码编写
module Decoder3_8
(input in1,input in2,input in3,output reg [7:0] out
);always@(*)begincase({in1,in2,in3})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;
// default: out = 8'bxxxx_xxxx;endcase
endendmodule
注意,以上代码是使用case语句的方法来实现译码器的功能,是没有优先级的写法,Quartus编译出来的RTL就是一个译码器(如下图1)。
但如果使用if else语句来实现功能,由于if.......else语句具备优先级,Quartus编译出来的RTL就是许多门电路的组合(如下图2)。
图1
图2
3 逻辑仿真及波形验证
编写仿真文件:
`timescale 1ns/1nsmodule tb_Decoder3_8();reg tb_in1, tb_in2, tb_in3;
wire [7:0] tb_out;initial begintb_in1 = 1'b0;tb_in2 = 1'b0;tb_in3 = 1'b0;
endalways #10 tb_in1 <= {$random} % 2;
always #10 tb_in2 <= {$random} % 2;
always #10 tb_in3 <= {$random} % 2;Decoder3_8 Decoder3_8_inst
(.in1(tb_in1),.in2(tb_in2),.in3(tb_in3),.out(tb_out)
);endmodule
波形图种可以看到,能够对应真值表的内容,仿真验证通过。
(本贴仅是个人经验,参考哔哩哔野火视频:08-第七讲-简单组合逻辑---译码器_哔哩哔哩_bilibili。如有侵权请联系我~)