学习了2选一多路选择器之后,记下来又跟着小梅哥学习了3_8 译码器,学习了一些语法知识,然后自己仿照3_8译码器写出了4_16译码器,以此提高自己的写代码能力。
首先3_8译码器。就是很简单的3个输入,8个输出,因为3个输入,有8种排列组合。每一种输入的配列组合,对应着一种输出,这就是3_8译码器。相对应的4_16译码器,就是4个输入,其输入的排列组合方式有16种,每一种对应一个输出。
其中3_8译码器的Verilog代码如下。其中因为out_put是在always块里面,所以一定要将其定义为reg类型。
module decoder_3_8(
//里面是端口列表
a,
b,
c,
out
);
input a;
input b;
input c;
output [7:0] out;
reg [7:0] out; //可以一起赋值 output reg[7:0] out ;
//描述
always@(*) begin //两个等价,*代替,所有信号 //always@(a,b,c) always 块
//以always 块描述的信号赋值,被赋值的对象必须定义为reg型
case({a,b,c}) //{}将3个独立的1位信号,转换为一个3位的信号;这种方式叫做位拼接
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
你完成了一个设计之后,查看原理图,可以了解工具如何将你的代码转换成了电路,综合后的原理图如图所示,
RTL 编码后查看 RTL 分析(RTL ANALYSIS)的原理图。在综合后的原理图中电路已经被映射到器件的 LUT 和 FF 中,并且经过了综合器的优化。相比原先的代码,可以说"面目全非”了``。而 RTL 分析的原理图用逻辑门,选择器以及触发器来表示电路,并尽量使用代码中的变量名表示,可以更清晰地和代码对应。这样一来,就知道自己的代码会变成怎样的电路器件,与门,非门,选择器,加法器等等。尽管我保证他们哪个在 FPGA 上都不存在。代码分析 后设计的原理图如图所示
其功能仿真 的代码如下
`timescale 1ns / 1ps
module decoder_3_8_tb();
reg s_a;
reg s_b;
reg s_c;
wire [7:0]out;
decoder_3_8 decoder_3_8(
.a(s_a),
.b(s_b),
.c(s_c),
.out(out)
);
initial begin
s_a = 0;s_b= 0;s_c = 0;
#200 ;
s_a = 0;s_b= 0;s_c = 1;
#200;
s_a = 0;s_b= 1;s_c = 0;
#200;
s_a = 0;s_b= 1;s_c = 1;
#200;
s_a = 1;s_b= 0;s_c = 0;
#200;
s_a = 1;s_b= 0;s_c = 1;
#200
s_a = 1;s_b= 1;s_c =0;
#200;
s_a = 1;s_b= 1;s_c = 1;
#200;
$stop;
end
endmodule
功能仿真图形如下所示,可以看出其输入出随着输入的变化,是一个梯形。
在仿照了3_8译码器后,自己仿照写了4_16译码器。代码如下素所示。
`timescale 1ns / 1ps
module decoder_4_16(
a,
b,
c,
d,
out
);
input a;
input b;
input c;
input d;
output [15:0] out;
reg [15:0] out ;
always@(*)begin
case({a,b,c,d})
4'b0000:out = 16'h0001;
4'b0001:out = 16'h0002;
4'b0010:out = 16'h0004;
4'b0011:out = 16'h0008;
4'b0100:out = 16'h0010;
4'b0101:out = 16'h0020;
4'b0110:out = 16'h0040;
4'b0111:out = 16'h0080;
4'b1000:out = 16'h0100;
4'b1001:out = 16'h0200;
4'b1010:out = 16'h0400;
4'b1011:out = 16'h0800;
4'b1100:out = 16'h1000;
4'b1101:out = 16'h2000;
4'b1110:out = 16'h4000;
4'b1111:out = 16'h8000;
endcase
end
endmodule
你完成了一个设计之后,查看原理图,可以了解工具如何将你的代码转换成了电路,综合后的原理图如图所示,
代码分析 后设计的原理图如图所示
仿真代码如下。
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2021/04/21 11:05:08
// Design Name:
// Module Name: decoder_4_16_tb
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module decoder_4_16_tb();
reg s_a;
reg s_b;
reg s_c;
reg s_d;
wire [15:0] out;
decoder_4_16 decoder_4_16(
.a(s_a),
.b(s_b),
.c(s_c),
.d(s_d),
.out(out)
);
initial begin
s_a = 0;s_b = 0;s_c= 0;s_d = 0;
#200;
s_a = 0;s_b = 0;s_c= 0;s_d = 1 ;
#200;
s_a = 0;s_b = 0;s_c= 1;s_d = 0;
#200 ;
s_a = 0;s_b = 0;s_c= 1;s_d = 1;
#200;
s_a = 0;s_b = 1;s_c= 0;s_d = 0;
#200;
s_a = 0;s_b = 1;s_c= 0;s_d = 1;
#200;
s_a = 0;s_b = 1;s_c= 1;s_d = 0;
#200;
s_a = 0;s_b = 1;s_c= 1;s_d = 1;
#200;
s_a = 1;s_b = 0;s_c= 0;s_d = 0;
#200;
s_a = 1;s_b = 0;s_c= 0;s_d = 1;
#200;
s_a = 1;s_b = 0;s_c= 1;s_d = 0;
#200;
s_a = 1;s_b = 0;s_c= 1;s_d = 1;
#200;
s_a = 1;s_b = 1;s_c= 0;s_d = 0;
#200;
s_a = 1;s_b = 1;s_c= 0;s_d = 1;
#200;
s_a = 1;s_b = 1;s_c= 1;s_d = 0;
#200;
s_a = 1;s_b = 1;s_c= 1;s_d = 1;
#200;
end
endmodule
功能仿真结果如下