碎碎思 · 2022年02月28日

Verilog时序逻辑硬件建模设计(三)同步计数器

没有任何寄存器逻辑,RTL设计是不完整的。RTL是寄存器传输级或逻辑,用于描述依赖于当前输入和过去输出的数字逻辑。

image.png

如果所有存储元件均由相同的源时钟信号触发,则称该设计为同步设计。同步设计的优点是总体传播延迟等于触发器或存储元件的传播延迟。STA对于同步逻辑分析非常容易,甚至可以通过使用流水线来提高性能。大多数ASIC/FPGA实现都使用同步逻辑。本节介绍同步计数器的设计。

四位二进制计数器用于从“0000”到“1111”进行计数,四位BCD计数器用于从“0000”到“1001”进行计数。图5.14显示了四位二进制计数器,其中每个阶段被两计数器分割。
image.png

图5.14四位二进制计数器

如图5.14所示。计数器有四条输出线“QA、QB、QC、QD”,其中“QA”是LSB,“QD”是MSB。“QA”处的输出在每个时钟脉冲上切换,因此除以2。“QB”处的输出每两个时钟周期切换一次,因此可被四整除,“QC”处的输出每四个时钟周期切换一次,因此输出被八整除。类似地,“QD”处的输出每8个周期切换一次,因此“QD”处的输出除以输入时钟时间周期的16。在实际应用中,计数器被用作时钟分频器网络。在分频综合器中使用偶数计数器来产生可变频率输出。

三位递增计数器

计数器用于在时钟的活动边缘上生成预定义和所需的计数序列。在ASIC/FPGA设计中,使用可综合结构为计数器编写有效的RTL代码是至关重要的。用Verilog描述了三位向上计数器生成可综合设计。计数器在时钟的正边缘从“000”计数到“111”,在计数的下一个正边缘环回到“000”。示例5.7中描述的计数器是可预设的计数器,它具有同步激活的高“load_en”输入,以对所需的三位预设值进行采样。数据输入为三位,表示为“data_in”。

计数器具有有效的低电平异步“reset_n”输入,当其处于低电平时,输出到“q_out”上的状态为“000”。在正常操作期间,“reset_n”处于高电平状态。

可综合输出如图5.15所示,具有三位数据输入线“data_in”、有源高电平“load_en”和有源低电平复位输入“reset_n”。输出由“q_out”和“clk”触发的正边缘时钟指示。

image.png

示例5.7三位递增计数器的Verilog RTL
image.png

图5.15三位递增计数器综合顶层图

三位递减计数器Three-Bit Down Counter

用Verilog描述了三位递减计数器的产生和综合设计。计数器从“111”计数到“000”,在时钟的正边缘触发,并在达到计数值“000”后在计数的下一个正边缘环回到“111”。三位递减计数器的时序如图5.16所示。

示例5.9中描述的计数器是可预设计数器,它具有同步激活的高“load_en”输入,用于采样三位所需的可预设值。数据输入为三位,表示为“data_in”。
image.png

图5.16三位二进制递减计数器的时序

image.png

示例5.8三位递减计数器的Verilog RTL

image.png
图5.17综合三位递减计数器顶层图

计数器具有低电平异步“reset_n”输入,当其处于低电平时,输出“q_out”上的状态为“000”。在正常操作期间,“reset_n”处于高电平状态。

可综合输出如图5.17所示,具有三位数据输入线“data_in”、有源高电平“load_en”和有源低电平复位输入“reset_n”。输出由“q_out”和“clk”触发的正边缘时钟指示。

三位增、减计数器

用Verilog描述了三位增、减计数器产生的可综合时序设计。递减计数器计数从“111”到“000”,在时钟的正边缘触发,并在达到计数值“000”后,在计数的下一个正边缘环回到“111”。递增计数器从“000”计数到“111”,在时钟的正边缘触发,并在达到计数值“000”后在计数的下一个正边缘环回到“000”。

图5.18给出了三位二进制增、减计数器的内部结构。对于UP/DOWN等于逻辑“1”,计数器充当递增计数器,对于UP/DOWN等于“0”,计数器充当递减计数器。

示例5.9中描述的计数器是可预设计数器,它具有同步激活的高“load_en”输入,用于采样三位所需的可预设值。数据输入为三位,表示为“data_in”。递增或递减计数操作由输入“up_down”选择,“up_down=1”计数器用作向上/递减计数器,“up_down=0”计数器用作向下/递减计数器。

计数器具有有效的低电平异步“reset_n”输入,当其处于低电平时,输出“q_out”上的状态为“000”。在正常操作期间,“复位”处于高电平状态(示例5.9)。

image.png
图5.18三位递增、递减计数器

可综合输出如图5.19所示,具有三位数据输入线“data_in”、有源高电平“load_en”和有源低电平复位输入“reset_n”。输出由“q_out”和“clk”触发的正边缘时钟指示,选择行为“up_down”。

image.png
示例5.9三位递增、递减计数器的Verilog RTL

image.png

图5.19三位递增、递减计数器顶层综合模块

格雷码计数器Gray Counters

格雷码计数器用于多时钟域设计中,因为时钟边沿上只有一位发生变化。同步器中也会使用格雷码。

该示例中描述了格雷码计数器,在该示例中,相对于计数器的先前输出,活动时钟边缘上只有一位发生变化。在这种情况下,高电平复位输入为“rst”。当“rst=1”时,计数器“out”的输出赋值给“0000”。

示例5.10中描述的计数器是可预设计数器,它具有同步激活的高“load_en”输入,用于采样四位所需的可预设值。数据输入为四位,表示为“data_in”。

计数器具有激活的高电平异步复位“rst”输入,当它处于激活的高电平时,输出行“out”上的状态为“0000”。正常运行期间,“rst”处于低电平状态。

image.png
image.png

示例5.10四位Gray计数器

格雷码和二进制计数器

在大多数实际应用中,需要使用二进制和格雷码计数器。通过使用组合逻辑,可以从二进制计数器输出生成格雷码计数器。有关二进制到格雷码和格雷码到二进制代码转换器,请参阅前面文章。

示例中描述了参数化二进制和格雷码计数器,并描述了Verilog RTL以生成四位二进制和格雷码输出。对于“rst_n=0”,二进制和格雷码计数器输出赋值为“0000”。四位格雷码输出表示为“gray”(示例5.11)。

四位二进制计数器的模拟结果如下面的时序图5.20所示,并且对于时钟计数器的每个正边缘,输出增量为1。

image.png

示例5.11参数化二进制和格雷码计数器的Verilog RTL

image.png

图5.20四位二进制计数器的时序

环形计数器Ring Counters

实际应用中使用环形计数器来提供预定义的延迟。这些计数器本质上是同步的,以引入一定量的预定义延迟,并用于实际应用中,如交通灯控制器、定时器。图5.21显示了四位环形计数器使用D触发器的内部逻辑结构,如图所示,MSB触发器的输出反馈到LSB触发器输入,计数器在时钟信号的每个活动边上移动数据。

示例5.12中描述了四位环形计数器的Verilog RTL,计数器具有“set_in”输入,以将输入初始化值设置为“1000”,并在时钟信号的正边缘工作。

综合逻辑如图5.22所示。

image.png

图5.21环形计数器内部结构

image.png

示例5.12四位环形计数器的Verilog RTL

image.png

图5.22四位环形计数器的综合逻辑

约翰逊计数器Johnson Counters

约翰逊计数器是一种特殊类型的同步计数器,采用移位寄存器设计。三位约翰逊计数器的内部结构如图5.23所示。

四位约翰逊计数器的Verilog RTL如例5.13所示。

综合逻辑如图5.24所示。

image.png

图5.23三位约翰逊计数器

image.png

示例5.13四位约翰逊计数器的Verilog RTL

image.png

图5.24四位约翰逊计数器的综合逻辑

参数化计数器

在实际应用中,为了提高计数器的可读性和可重用性,通过定义参数来设计计数器。参数整数值可用于定义计数器的位数。8位参数化计数器的Verilog RTL如图5.25所示。

参数化计数器的可综合顶层模块如图5.26所示。

image.png

图5.25八位参数化计数器的Verilog RTL

image.png

图5.26参数化计数器的综合逻辑

原文:OpenFPGA
作者:碎碎思

相关文章推荐

更多FPGA技术干货请关注FPGA 的逻辑技术专栏。
推荐阅读
关注数
10605
内容数
562
FPGA Logic 二三事
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息