Verilog RTL基础模块代码设计学习笔记

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

组合逻辑电路

 

多路选择器

电路描述

  • 纯组合逻辑
  • 根据控制信号的值,把输入信号之一连接到输出信号上。
  • 可能的变化
    • 数据信号的宽度
    • 选通逻辑的变化,控制信号为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不支持中文,所以所有代码注释均为英文。如有离谱之处,敬请指出。(当然代码如有问题还望不吝赐教)

编译报告:
2选1的mux编译报告
编译报告要注意一些资源的消耗,主要有:

  • logic elements 逻辑单元
  • logic registers 逻辑寄存器,主要用于设置D触发器
  • memory bits 所用的内存单元,ram等
  • multiplier 所到的乘法器
  • PLLs 锁相环

仿真结果:
2选1的mux仿真波形
电路中的逻辑单元有延迟,故输出有延迟,所以时钟间隔应当大一些。我一般设置为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再填充内容,防止忘记。

编译报告:
4选1的mux编译报告
与2选1的mux编译报告对比可发现4选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:
2x2路交叉开关RTL视图
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:
4x4路交叉开关RTL视图
四个输出,分别用四个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

仿真结果:
4_2优先编码器仿真波形
RTL Viewer:
4_2优先编码器RTL视图
层级依次选通。

 

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

仿真结果:
8_3优先译码器仿真波形
RTL Viewer:
8_3优先编码器RTL视图
也是依次选通,共8-1=7次。

 

多路译码器

电路描述

  • 纯粹的组合逻辑电路
  • 使用case 语句实现,注意,一定要把case的情况写全,或者要加上default
  • 电路随应用场景的变化
    • 编码信号的位宽
    • 编码的逻辑

 

3_8译码器<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值