码迷,mamicode.com
首页 > 其他好文 > 详细

从计数器到分频电路

时间:2017-07-20 01:04:35      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:输入   com   利用   http   分享   高电平   最大   inpu   等等   

  本文介绍常见的电路——计数器,然后我们由计数器电路讲解到分频电路。

一、计数器

  (1)计数器代码

  计数器,顾名思义就是在时钟的节拍下进行计数,一个简单的N位计数器的代码如下所示,这个计数器从0计数到2^N - 1(共计数了2^N个数,也就是N位计数器):

 1 module count#(parameter N=8)(
 2 input clk,
 3 input clear,
 4 output[N-1:0] cnt_Q
 5 );
 6 reg[N-1:0] cnt;
 7 assign cnt_Q = cnt;
 8 
 9 always@(posedge clk)
10   if(clear)
11     cnt <= h0;      //同步清 0,高电平有效
12   else
13     cnt <= cnt+1b1; //加法计数
14 
15 endmodule

上述描述的计数器通过 clear 信号清除计数值,然后下一周期开始加 1 计数;当计数器计到能够存储的最大数值时, 例如本例为 8 个 1,即 8‘hff 就会自动回到 0,然后开始下一轮计数。

综合得带的电路如下所示:

技术分享

 

  (2)计数器改进

  如果想要实现 0~k 范围内计数,其中k ≠ 2^N ,可以将 always 语句修改为:

always@(posedge clk)
    if(clear)
        cnt <=  h0;    //同步清 0,高电平有效
    else if(cnt==K)
        cnt <= h0;
    else
        cnt <= cnt+1b1; //减法计数            

 

  

  前面是累加计数,下面是一个既可以递增也能递减,且具备初始值装载和复位的计数器,代码如下所示:

 1 module updown_count#(parameter N=8)(
 2     input clk,
 3     input clear,
 4     input load,
 5     input up_down,
 6     input [N-1:0] preset_D,
 7     output[N-1:0] cnt_Q
 8 );
 9 reg[N-1:0] cnt;
10 assign cnt_Q = cnt;
11 
12 always@(posedge clk)
13   if(clear)
14     cnt <= h0;      //同步清 0,高电平有效
15   else if(load)
16     cnt <= preset_D; //同步预置
17   else if(up_down)
18     cnt <= cnt+1;    //加法计数
19   else
20     cnt <= cnt-1;    //减法计数
21 
22 endmodule

 

 

 

二、计数器的用途

  (1)基本的计数功能与分频

  计数器的基本功能顾名思义就是计数了,用来计数,产生某个信号等等。利用这个功能,可以实现信号的分频,具体会在后面的分频电路中进行描述。

  (2)看门狗

  计数器其实就可以设计成看门狗。在初始状态时,看门狗电路首先装载一个大数;当状态机或者程序开始运行后,看门狗开始倒计数。如果状态机或程序运行正常,每隔一段时间应发出指令或信号让看门狗重新装载一个大 初始值,并再次开始倒计数。如果看门狗减到 0 就认为程序或状态机没有正常工作,就需要强制整个系统复位。

  上面的第二处改进的计数器电路描述就是一个看门狗电路,只要加上 cnt==0 作为看门复位状态即可;而 load 信号则是状态机或软件给出的喂狗动作。

  (3)特殊的有限状态机

  当状态机要求没有那么严格的时候,这个时候就可以用计数器的计数值当做状态机的状态,计数增加或者减少就是改变状态。

 

 

三、分频电路

 

  计数器实质是对输入的驱动时钟进行计数,所以计数器在某种意义上讲,等同于对时钟进行分频。例如一个最大计数长度为 N 的计数器,将其最高位作为时钟输出(占空比不一定为 1:1),则工作频率为输入时钟的  1/(2N)。通常 ASIC 和 FPGA 中,时钟都是全局信号,都需要通过 PLL 处理才能使用,但某些简易场合,采用计数器输出时钟也是能够使用的,只是需要注意时序约束。

 

 

从计数器到分频电路

标签:输入   com   利用   http   分享   高电平   最大   inpu   等等   

原文地址:http://www.cnblogs.com/IClearner/p/7208871.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!