Verilog时序逻辑硬件建模设计(三)同步计数器
-Synchronous Counters
没有任何寄存器逻辑,RTL设计是不完整的。RTL是寄存器传输级或逻辑,用于描述依赖于当前输入和过去输出的数字逻辑。
![c9d5bc58a101d3f0bb2c510367df41ec.png](https://i-blog.csdnimg.cn/blog_migrate/c59bad0e7c41383136091e9e44f97477.png)
如果所有存储元件均由相同的源时钟信号触发,则称该设计为同步设计。同步设计的优点是总体传播延迟等于触发器或存储元件的传播延迟。STA对于同步逻辑分析非常容易,甚至可以通过使用流水线来提高性能。大多数ASIC/FPGA实现都使用同步逻辑。本节介绍同步计数器的设计。
四位二进制计数器用于从“0000”到“1111”进行计数,四位BCD计数器用于从“0000”到“1001”进行计数。图5.14显示了四位二进制计数器,其中每个阶段被两计数器分割。
![d9642994a3cc2fa3a786edefbee7a3f7.png](https://i-blog.csdnimg.cn/blog_migrate/c2890e6ed3c89f46244183a5a9e8ab17.png)
如图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”触发的正边缘时钟指示。
![db246d3813f039ebd6f179e5c45c7684.png](https://i-blog.csdnimg.cn/blog_migrate/318ef2bef70373a14fa43dcac1c7d0ef.png)
![aa5b132094185d31c870142277931dba.png](https://i-blog.csdnimg.cn/blog_migrate/fba0aec66ab829022731ca455db99534.png)
三位递减计数器Three-Bit Down Counter
用Verilog描述了三位递减计数器的产生和综合设计。计数器从“111”计数到“000”,在时钟的正边缘触发,并在达到计数值“000”后在计数的下一个正边缘环回到“111”。三位递减计数器的时序如图5.16所示。
示例5.9中描述的计数器是可预设计数器,它具有同步激活的高“load_en”输入,用于采样三位所需的可预设值。数据输入为三位,表示为“data_in”。
![7b8bd20c05204f3ec20a341e87468b76.png](https://i-blog.csdnimg.cn/blog_migrate/d2dd13e51f514c30800558fc2b66cbf8.png)
![7e4a6c90f937f32ff4d2b5c6db5acd65.png](https://i-blog.csdnimg.cn/blog_migrate/6093da4c767f1ca2f8164c1095ec357b.png)
![6277c3662ed785fb746a0a054eb4e6be.png](https://i-blog.csdnimg.cn/blog_migrate/40fa3dba9c71de6b972088c10ba93745.png)
计数器具有低电平异步“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)。
![d854d3239bee6cf9d69186ee4d32ad05.png](https://i-blog.csdnimg.cn/blog_migrate/99a9282fc0bf7ebfe6d150f337c4c0ef.png)
可综合输出如图5.19所示,具有三位数据输入线“data_in”、有源高电平“load_en”和有源低电平复位输入“reset_n”。输出由“q_out”和“clk”触发的正边缘时钟指示,选择行为“up_down”。
![353ba3df0a37c37cdf04bbc88117e0da.png](https://i-blog.csdnimg.cn/blog_migrate/9d4f40bf42e7bd32a2f847eb8bf90a9f.png)
![f9ee49698f82baff4166fbfc3f988f85.png](https://i-blog.csdnimg.cn/blog_migrate/42fc1f1d03168770cc7968e5fb704a23.png)
格雷码计数器Gray Counters
格雷码计数器用于多时钟域设计中,因为时钟边沿上只有一位发生变化。同步器中也会使用格雷码。
该示例中描述了格雷码计数器,在该示例中,相对于计数器的先前输出,活动时钟边缘上只有一位发生变化。在这种情况下,高电平复位输入为“rst”。当“rst=1”时,计数器“out”的输出赋值给“0000”。
示例5.10中描述的计数器是可预设计数器,它具有同步激活的高“load_en”输入,用于采样四位所需的可预设值。数据输入为四位,表示为“data_in”。
计数器具有激活的高电平异步复位“rst”输入,当它处于激活的高电平时,输出行“out”上的状态为“0000”。正常运行期间,“rst”处于低电平状态。
![6287a42a3926b3d71704bc55da924731.png](https://i-blog.csdnimg.cn/blog_migrate/eb6b0db8fba37b2c6dab427750d12d20.png)
![8e68a83eba78b8bf065647e137eacbd6.png](https://i-blog.csdnimg.cn/blog_migrate/58f04c9f87b73bd4f1d02ffdad4eb4a6.png)
格雷码和二进制计数器
在大多数实际应用中,需要使用二进制和格雷码计数器。通过使用组合逻辑,可以从二进制计数器输出生成格雷码计数器。有关二进制到格雷码和格雷码到二进制代码转换器,请参阅前面文章。
示例中描述了参数化二进制和格雷码计数器,并描述了Verilog RTL以生成四位二进制和格雷码输出。对于“rst_n=0”,二进制和格雷码计数器输出赋值为“0000”。四位格雷码输出表示为“gray”(示例5.11)。
四位二进制计数器的模拟结果如下面的时序图5.20所示,并且对于时钟计数器的每个正边缘,输出增量为1。
![5ac525b470cb1fa9812d6183ca897048.png](https://i-blog.csdnimg.cn/blog_migrate/33d815e238bfaa7da404584edf1a4d8e.png)
![51adfaa3b4d6df81a6d3cb64847ce84b.png](https://i-blog.csdnimg.cn/blog_migrate/923d2f0ca215c84e2f33d35aa54ef4ad.png)
环形计数器Ring Counters
实际应用中使用环形计数器来提供预定义的延迟。这些计数器本质上是同步的,以引入一定量的预定义延迟,并用于实际应用中,如交通灯控制器、定时器。图5.21显示了四位环形计数器使用D触发器的内部逻辑结构,如图所示,MSB触发器的输出反馈到LSB触发器输入,计数器在时钟信号的每个活动边上移动数据。
示例5.12中描述了四位环形计数器的Verilog RTL,计数器具有“set_in”输入,以将输入初始化值设置为“1000”,并在时钟信号的正边缘工作。
综合逻辑如图5.22所示。
![2c78c884414e79784734d93e4bb29369.png](https://i-blog.csdnimg.cn/blog_migrate/44d96c1d48e197c62ed480c2e0fa9be1.png)
![fe2b7d6d3d9b82209cbf459a549b6b16.png](https://i-blog.csdnimg.cn/blog_migrate/199af226b29e8fb3f7192dcbe45176f7.png)
![9a3f6847a3b334cc8ef7f12c61144591.png](https://i-blog.csdnimg.cn/blog_migrate/bd9326450a09debc3d76d02382be4d10.png)
约翰逊计数器Johnson Counters
约翰逊计数器是一种特殊类型的同步计数器,采用移位寄存器设计。三位约翰逊计数器的内部结构如图5.23所示。
四位约翰逊计数器的Verilog RTL如例5.13所示。
综合逻辑如图5.24所示。
![3393a7418bf16113a0d6a63857dfb75e.png](https://i-blog.csdnimg.cn/blog_migrate/bb4a333fa67d4fbb6477ca5a96400eaf.png)
![0acbe81cedaae5d4486707b5e3b7b3c3.png](https://i-blog.csdnimg.cn/blog_migrate/7c30d5fcc9281bfcb166243f6106ad79.png)
![1179117912d51754db75c75bc7b3713d.png](https://i-blog.csdnimg.cn/blog_migrate/24578cc3286929afef961669bb0536c5.png)
参数化计数器
在实际应用中,为了提高计数器的可读性和可重用性,通过定义参数来设计计数器。参数整数值可用于定义计数器的位数。8位参数化计数器的Verilog RTL如图5.25所示。
参数化计数器的可综合顶层模块如图5.26所示。
![1236a98eac968f27d45d16cb9ae3c6a4.png](https://i-blog.csdnimg.cn/blog_migrate/400210188ab69ea4f663bc384bdf5426.png)
![b71715307b72e98907e627fcc4cc993a.png](https://i-blog.csdnimg.cn/blog_migrate/42910e91207859a5ac8a8bfc00b07454.png)
Verilog/SV代码检查器-Lint 建模规则检查器与 Verilator
Verilog时序逻辑硬件建模设计(一)锁存器D-latch和触发器Flip-Flop