APP下载

基于Verilog HDL 的同步双向计数器设计

2020-11-16刘景文

关键词:竞争

摘要:本文通过双向计数器的介绍,提出更具通用性的同步双向计数器设计要求。将设计分成同步信号甄别模块、计数模块;在同步信号竞争分析的基础上,提出设计思路,实现了基于 Verilog HDL的同步双向计数器设计。

关键词:同步双向计数器;状态机;竞争

现实世界广泛存在对同一对象实施正、反两种不同操作的实例。如某空间的人数,进入空间操作,空间内人数目加;走出空间操作,空间内人数减,这类操作反应在电路上就是双向计数器。这种计数器有两个计数时钟,能在正向计数时钟的有效沿计数增加,在逆向计数时钟的有效沿计数减少[1]。正、反两种操作各自发生的时间不定,同步双向计数器可以应对正、反两种操作同时操作的情况,具有更加广泛的通用性。

1 同步双向计数器设计的构成

将同步双向计数器设计分成同步信号甄别模块、计数模块两个主要部分。同步信号甄别模块通过对加、减时钟信号的甄别处理,输出时钟信号clk和加减标志信号 updn。updn等于 1,表示接收到加操作时钟信号;updn等于 0,表示接收到减操作时钟信号。计数模块接收到 clk信号时,根据updn值对计数器进行加、减操作。

同步信号甄别模块的输入信号由clkup、clkdown、rst和 chkclk构成;输出信号由 clk和 updn构成。clkup、clkdown分别表示加、减操作时钟信号,rst是甄别模块初始化信号,chkclk是甄别模块的工作时钟信号。

当clkup、clkdown同时有效时,由于对一个计数器操作,如何解决针对计数器的竞争操作是同步双向计数器设计重点。依据解决同步竞争策略不同,同步信号甄别模块有多种实现方式。当 clkup、clkdown同时有效时,优先处理固定(如 clkup)操作的固定优先级甄别策略;根据昀近时间内,两信号操作次数,优先处理频繁发生信号的基于统计优先级甄别策略;当clkup、clkdown同时有效时,昀终对计数器实施加、减各一次,计数器值不变,同时忽略加、减操作的基于结果甄别策略等形式。本设计采用固定优先级策略。

2 固定优先级同步信号甄别模块

2.1同步信号的竞争分析clkup、clkdown两个时钟信号,在下降沿进行计数器操作。按照时间次序,clkup、clkdown两个时钟信号有三种情况:情况 1:两个时钟信号中一个下降沿后,上升沿;后另一个信号也如此,即两信号异步。情况 2:两个时钟信号中一个下降沿,后另一个信号下降沿,在前一个信号输出过程中,另一个信号失效。情况 3:两个时钟信号同时检测到下降沿,处理其中一个信号,另一个信号失效。情况 2、3的竞争处理,是固定优先级同步信号甄别模块的设计核心。

2.2 固定优先级同步信号甄别模块设计

设计思路的核心是:通过clkup、clkdown两时钟的当前状态和前一个状态对比检测时钟信号变化;在固定时间内主动结束输出时钟;在有时钟信号变化时,保留另一个时钟信号的前一个状态,待主动结束输出时钟后处理。

2.3固定优先级的同步信号甄别模块实现

模块使用两位寄存器变量 clknow和clkage,保存clkup、clkdown的当前状态和前一个状态;寄存器变量 cptyn赋值为 1,表示正在输出时钟信号;寄存器 clk为输出的时钟信号;两位寄存器 cptcnt作为定时器;寄存器变量 clkdelay为 1,表示 clkdown变成下降沿;寄存器变量 clkdelay为 0,表示 clkup变成下降沿。

模块由四部分构成,通过clknow<={clkup,clkdn}获取两时钟信号的当前状态。

通过 case({clkago,clknow})语句判断下降沿是否发生,{clkago,clknow}值等于 4'b0100和 4'b0110时,说明 clkdown产生下降沿。在 cptyn不为 1情况下,执行 clk<=1'b0、cptyn<=1'b1、cptcnt<=2'b00、clkdelay<=1'b1、updn<=1'b0语句;开始输出时钟,并开启定时器。{clkago,clknow}值等于4'b1000、4'b1001和 4'b1101时,说明 clkup产生下降沿;等于 4'b1100时,说明clkup、clkdn同时产生下降沿;模块规定 clkup优先级高;在 cptyn不为 1情况下,执行clk<=1'b0、cptyn<=1'b1、cptcnt<=2'b00、clkdelay<=1'b0、updn<=1'b1。{clkago,clknow}為其他值时,不执行任何操作。

若 cptyn等于0,说明没有任何下降沿,执行clkago<=clknow;否则如果 clkdelay等于 1,执行 clkago[1]<=clknow[1];如果 clkdelay等于 0,执行clkago[0]<=clknow[0];完成不同情况下,时钟信号前一个状态的保存。

若 cptyn等于 1,计数器 cptcnt值加 1,当计数器 cptcnt值大于 2时,执行clk<=1'b1、cptyn<=0结束时钟输出,重新开启两信号的下降沿甄别。由于 cptcnt值大于 2,执行结束时钟输出,本设计要求 clkup,clkdn信号低电平的持续时间至少是 chkclk信号周期的 3.5倍,否则会有信号丢失。

3 计数模块设计

计数模块功能单一,结构简单。为方便观察效果,计数值为 2位 bcd码,计数范围为 00至59。当 updn等于 1时,时钟有效后,计数值加一,如果计数值等于 59,加一后,变为00。当 updn等于 0时,时钟有效后,计数值减一,如果计数值等于 00,减一后,变为 59。代码如下:

case(qout)//qout为计数值

8'h00:if(updn==1)qout<=8'h01;else qout<=8'h59;

。。。

8'h59:if(updn==1)qout<=8'h00;else qout<=8'h58;

default:qout<=8'h00;

endcase

综上所述,通过当前状态采集、当前状态和前一个状态比较、前一个状态保存、计数器调整四个部分,完成同步信号的甄别;再通过计数模块反应结果,圆满实现同步双向计数器设计。对 clkup、clkdn信号的时间要求是本设计的不足。

参考文献

[1]孙波,吴亮.用 Verilog设计实现异步双向计数器[J]. 软件导刊,2008年 10月.P118.

作者简介:刘景文(1968-)男,天津市人,天津滨海职业学院电子信息工程技术教研室主任,副教授,硕士。研究领域:嵌入式应用、计算机视觉。

猜你喜欢

竞争
竞争的合适位置
竞争、行为和脑
如何对孩子进行竞争教育
漫画哲理
感谢竞争
新加坡竞争委员会公布一系列修订版竞争指南
如何平衡友谊与学业竞争的关系?
让竞争与你同行
正确面对竞争
合理竞争,积极合作,保持共赢