本文介绍常见的电路——计数器,方便后续讲解分频电路。
分频器的原理就是计数,翻转,计数,翻转,所以我们先来了解一下计数器!
一、计数器
(1)计数器代码
计数器,顾名思义就是在时钟的节拍下进行计数,一个简单的N位计数器的代码如下所示,这个计数器从0计数到2N -1(共计数了2N个数,也就是N位计数器。例如0,1,2,3,计数到2的2次方-1,共计2的2次方个数,是一个2位计数器)
module count#(parameter N=8)(
input clk,
input clear,
output[N-1:0] cnt_Q
);
reg[N-1:0] cnt;
assign cnt_Q = cnt;//傀儡8位寄存器
always@(posedge clk)
if(clear)
cnt <= 'h0; //同步清 0,高电平有效
else
cnt <= cnt+1'b1; //加法计数
endmodule
上述代码中,有一行很不起眼,always@(posedge clk):同步复位。
当复位信号发生变化时,并不立即生效,而是等到有效时钟沿采集到复位信号的变化后,才会对寄存器进行复位操作。 同步复位的过程是依赖于时钟信号的,所以称之为同步。由于在现有的大多数逻辑器件库中,触发器DFF都是只包含有异步复位端口,所以同步复位的使用会造成冗余组合逻辑的使用,浪费资源将同步复位改为异步复位:
always@(posedge clk or negedge reset) //异步复位
if(!reset) begin
out1 <= 0 ;
else
out1 <= in1 ;
异步复位则不依赖于系统时钟,一旦信号发生变化,就会立即对寄存器进行复位操作。 异步复位信号一般会持续相对较长的时间,保证寄存器能复位完成。但是由于复位信号是异步的,我们不知道它会在什么时刻被释放。如果异步复位信号撤销时,不满足recovery time和removal time时,可能会造成亚稳态。
为减少亚稳态的产生,采用傀儡寄存器寄存,进行异步复位同步释放
module sync_async_reset(clock,reset_n,rst_n);
input clock, reset_n;
output rst_n;
reg rst_nr1,
always @(posedge clock or negedge reset_n) begin
if(!reset_n) begin
rst_nr1 <= 1'b0;
rst_n <= 1'b0; //异步复位
end
else begin
rst_nr1 <= 1'b1;
rst_n <= rst_nr1; //同步释放
end
end
//新的系统复位信号rst_n
//信号rst_n作为新的系统复位信号,后续可以用来直接“异步复位”
endmodule
上述描述的计数器通过 clear 信号清除计数值,然后下一周期开始加 1 计数;当计数器计到能够存储的最大数值时, 例如本例为 8 个 1,即 8’hff 就会自动回到 0,然后开始下一轮计数。
改进计数器实现0~k范围内计数,其中k不等于2N:
always@(posedge clk)
if(clear)
cnt <= 'h0; //同步清 0,高电平有效
else if(cnt==K)
cnt <= 'h0;
else
cnt <= cnt+1'b1; //加法计数
前面是累加计数,下面是一个既可以递增也能递减,且具备初始值装载和复位的计数器,代码如下所示:文章来源:https://www.toymoban.com/news/detail-559495.html
module updown_count#(parameter N=8)(
input clk,
input clear,
input load,
input up_down,
input [N-1:0] preset_D,
output[N-1:0] cnt_Q
);
reg[N-1:0] cnt;
assign cnt_Q = cnt;
always@(posedge clk)
if(clear)
cnt <= 'h0; //同步清 0,高电平有效
else if(load)
cnt <= preset_D; //同步预置
else if(up_down)
cnt <= cnt+1; //加法计数
else
cnt <= cnt-1; //减法计数
endmodule
二、计数器的用途
(1)基本的计数功能与分频
计数器的基本功能顾名思义就是计数了,用来计数,产生某个信号等等。利用这个功能,可以实现信号的分频,具体会在后面的分频电路中进行描述。
(2)看门狗
计数器其实就可以设计成看门狗。在初始状态时,看门狗电路首先装载一个大数;当状态机或者程序开始运行后,看门狗开始倒计数。如果状态机或程序运行正常,每隔一段时间应发出指令或信号让看门狗重新装载一个大的初始值,并再次开始倒计数。如果看门狗减到 0 就认为程序或状态机没有正常工作,就需要强制整个系统复位。
上面的第二处改进的计数器电路描述就是一个看门狗电路,只要加上 cnt==0 作为看门复位状态即可;而 load 信号则是状态机或软件给出的喂狗动作。
(3)特殊的有限状态机
当状态机要求没有那么严格的时候,这个时候就可以用计数器的计数值当做状态机的状态,计数增加或者减少就是改变状态。文章来源地址https://www.toymoban.com/news/detail-559495.html
到了这里,关于常用数字电路模块:计数器与分频器(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!