Verilog RTL 基础模块代码设计
组合逻辑电路
多路选择器
电路描述
- 纯组合逻辑
- 根据控制信号的值,把输入信号之一连接到输出信号上。
- 可能的变化
- 数据信号的宽度
- 选通逻辑的变化,控制信号为0或1时选通哪个通道
2选1的mux
module mux2_1(
IN0 ,
IN1 ,
SEL ,
OUT );
parameter WL = 1; // bit wide of input and output. set 1 for conciseness here
input [WL-1:0] IN0, IN1;
input SEL;
output[WL-1:0] OUT;
reg [WL-1:0] OUT;
// code for combinational logic
always @ (IN0 or IN1 or SEL) begin
if(SEL)
OUT = IN1;
else
OUT = IN0;
end
endmodule
// endmodule top
小声:本人英语拉得很,但是我的quartus9.1不支持中文,所以所有代码注释均为英文。如有离谱之处,敬请指出。(当然代码如有问题还望不吝赐教)
编译报告:

编译报告要注意一些资源的消耗,主要有:
- logic elements 逻辑单元
- logic registers 逻辑寄存器,主要用于设置D触发器
- memory bits 所用的内存单元,ram等
- multiplier 所到的乘法器
- PLLs 锁相环
仿真结果:

电路中的逻辑单元有延迟,故输出有延迟,所以时钟间隔应当大一些。我一般设置为100ns。
4选1的mux
module mux4_1(
IN0 ,
IN1 ,
IN2 ,
IN3 , //4 input
SEL ,
OUT );
parameter WL = 1; //input bit wide
input [WL-1:0] IN0,IN1,IN2,IN3;
input [1:0] SEL; //4input need 2bits select
output [WL-1:0] OUT;
reg [WL-1:0] OUT;
always @ (IN0 or IN1 or IN2 or IN3 or SEL) begin
case(SEL)
0 : OUT = IN0;
1 : OUT = IN1;
2 : OUT = IN2;
default : OUT = IN3;
endcase
end
endmodule
注意case后面要有end。最好写完case( )end再填充内容,防止忘记。
编译报告:

与2选1的mux编译报告对比可发现4选1的mux资源用了更多的逻辑单元。
仿真结果:

输出正确。
交叉开关
电路描述
- 实际上是MUX的组合体
- 通常用在复杂一些的信号选通的场合。
- 每一个输出端都有对应的选通信号
- 用选通信号控制输出端选通到哪个输入端。
- 当输入和输出的端口增加时,该电路会消耗非常多的电路资源
- 电路在不同应用时的变化
- 数据信号的宽度
- 选通逻辑的变化,选择信号为0或1时选通哪个通道
2x2路交叉开关
// module top, a 2x2 crossbar switch circuit
module crossbar_switch_2x2(
IN0 , // input 1
IN1 , // input 2
SEL0 , // select the output0 source
SEL1 , // select the output1 source
OUT0 , // output data 0
OUT1 ); // output data 1
parameter WL = 1;
input [WL-1:0] IN0, IN1;
input SEL0, SEL1;
output[WL-1:0] OUT0, OUT1;
reg [WL-1:0] OUT0, OUT1;
// get the OUT0
always @ (IN0 or IN1 or SEL0) begin
if(SEL0)
OUT0 = IN1;
else
OUT0 = IN0;
end
// get the OUT1
always @ (IN0 or IN1 or SEL1) begin
if(SEL1)
OUT1 = IN1;
else
OUT1 = IN0;
end
endmodule
// endmodule top
代码中不难看出这里其实是两个多路选择器的组合。
RTL Viewer:

RTL视图里也可以清晰地看到这其实只是两个多路选择器的组合。
4x4路交叉开关
module crossbar_switch_4x4(
IN0 ,
IN1 ,
IN2 ,
IN3 ,
SEL0 ,
SEL1 ,
SEL2 ,
SEL3 ,
OUT0 ,
OUT1 ,
OUT2 ,
OUT3 );
parameter WL = 1;
input [WL-1:0] IN0,IN1,IN2,IN3;
input [1:0] SEL0,SEL1,SEL2,SEL3;
//Each output need a independent select signals, so we need 4 sel;
//There are 4 inputs, so sel need 2 bis.
output [WL-1:0] OUT0,OUT1,OUT2,OUT3;
reg [WL-1:0] OUT0,OUT1,OUT2,OUT3;
always @ (IN0 or IN1 or IN2 or IN3 or SEL0) begin
case(SEL0)
0 : OUT0 = IN0;
1 : OUT0 = IN1;
2 : OUT0 = IN2;
default : OUT0 = IN3;
endcase
end
always @ (IN0 or IN1 or IN2 or IN3 or SEL1) begin
case(SEL1)
0 : OUT1 = IN0;
1 : OUT1 = IN1;
2 : OUT1 = IN2;
default : OUT1 = IN3;
endcase
end
always @ (IN0 or IN1 or IN2 or IN3 or SEL2) begin
case(SEL2)
0 : OUT2 = IN0;
1 : OUT2 = IN1;
2 : OUT2 = IN2;
default : OUT2 = IN3;
endcase
end
always @ (IN0 or IN1 or IN2 or IN3 or SEL3) begin
case(SEL3)
0 : OUT3 = IN0;
1 : OUT3 = IN1;
2 : OUT3 = IN2;
default : OUT3 = IN3;
endcase
end
endmodule
这里的输入输出端口比较多,本来想把input,output,sel全都使用数组表示的,但是报错了。查询语法后发现reg内存的可以只用数组表示,端口不能。用到的四个reg这里可以直接与输出端口匹配,为了防止未知的语法问题和代码复杂化,就没有采用数组表示。
RTL Viewer:

四个输出,分别用四个2bit的sel来分别选择输入信号。也就是四个4_1多路选择器的组合。
优先编码器
电路描述
- 纯粹的组合逻辑电路
- 常用于状态检测
- 优先的含义是,如果多个条件同时成立,则按照优先级高的条件输出
- 使用if-else if 语句实现
- 例如,CPU的中断编码电路就是一个优先编码器
- 电路随应用场景的变化
- 编码信号的个数
- 编码的逻辑
4_2优先编码器
// module top, 4 input priority encoder with zero input check
module priority_encoder4_2(
IN ,
OUT );
input [3:0] IN;
output [2:0] OUT;
reg [2:0] OUT;
always @ (IN) begin
if(IN[3]) // highest priority
OUT = 3'b011;
else if(IN[2]) // second priority
OUT = 3'b010;
else if(IN[1]) // third priority
OUT = 3'b001;
else if(IN[0]) // fourth priority
OUT = 3'b000;
else // detected nothing
OUT = 3'b111; // arbitrary value which different from the values above
end
endmodule
仿真结果:

RTL Viewer:

层级依次选通。
8_3优先编码器
module priority_encoder8_3(
IN ,
OUT );
input [7:0] IN;
output [3:0] OUT;
reg [2:0] OUT;
always @ (IN) begin
if(IN[7]) OUT = 4'b0111;
else if(IN[6]) OUT = 4'b0110;
else if(IN[5]) OUT = 4'b0101;
else if(IN[4]) OUT = 4'b0100;
else if(IN[3]) OUT = 4'b0011;
else if(IN[2]) OUT = 4'b0010;
else if(IN[1]) OUT = 4'b0001;
else if(IN[0]) OUT = 4'b0000;
else OUT = 4'b1111;
end
endmodule
仿真结果:

RTL Viewer:

也是依次选通,共8-1=7次。
多路译码器
电路描述
- 纯粹的组合逻辑电路
- 使用case 语句实现,注意,一定要把case的情况写全,或者要加上default
- 电路随应用场景的变化
- 编码信号的位宽
- 编码的逻辑

这篇博客详细介绍了Verilog RTL设计中常见的组合逻辑电路,包括2选1、4选1多路选择器、交叉开关、优先编码器、多路译码器的实现和仿真分析。此外,还讨论了无符号和补码加法器、带流水线的加法器以及乘法器的特性。时序逻辑部分涵盖了计数器的设计,包括最简单的模4计数器和带有多种控制信号的计数器。最后,提到了状态机和序列信号检测器的实现,以及串入并出和并入串出移位寄存器的工作原理和仿真结果。
最低0.47元/天 解锁文章

4363

被折叠的 条评论
为什么被折叠?



