常用数字电路模块:计数器与分频器(一)

这篇具有很好参考价值的文章主要介绍了常用数字电路模块:计数器与分频器(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文介绍常见的电路——计数器,方便后续讲解分频电路。

分频器的原理就是计数,翻转,计数,翻转,所以我们先来了解一下计数器!

一、计数器

(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; //加法计数

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

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 任意进制加法计数器电路设计

    目录 一、题目 二、时钟发生电路 1、施密特触发电路 2、单稳态电路 3、多谐振荡电路 三、 N进制计数器 1、M的情形 2、MN的情形 2、1  193实现 2、2 192实现 四、设计的小bug 1、两个bug 2、bug的原因及解决 五、仿真源文件的获取 图一 题目要求         如题,我们要设计三部

    2024年02月09日
    浏览(38)
  • FPGA设计编程(三) 时序逻辑电路-计数器设计

    目录   【实验要求】  【实验软件工具】 【实验一】设计一个8位异步二进制计数器模块 1. 实验内容与原理说明 2. 实验模块程序代码和激励代码 (1)设计模块代码 (2)激励模块代码 3. 波形仿真图 4.门级电路图 【实验二】设计一个8位同步二进制计数器模块 1. 实验内容与原理说

    2024年02月02日
    浏览(129)
  • 【30-60s计数器电路设计】数电课设

    这是徐州工程学院2021年的电子工艺实习课程作业之一,我是20级计嵌专业的学生。电路方面的东西并不是我们的主修课程,所以在完成这项作业的过程中遇到了许多困难( 特别是在查不到样板的情况下 )。网上也找到过一位仁兄的案例,不过并没有详细的电路运行原理和操

    2024年02月08日
    浏览(37)
  • 【FPGA】Verilog:时序电路设计 | 自循环移位寄存器 | 环形计数 | 扭环计数 | 约翰逊计数器

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用IO:Switch :

    2024年02月10日
    浏览(59)
  • LR中监控ORACLE数据库常用计数器(如何自定义Oracle计数器)

    目录 一、添加自定义计数器的方法 1、要创建自定义查询,请执行以下操作: 2、配置文件示例对象 二、常用自定义计数器列表 三、LR中监控ORACLE数据库常用计数器遇到问题及处理 1. 在安装路径的Mercury LoadRunnerdatmonitors找到vmon.cfg文件,打开。 2. 在vmon.cfg文件的第三行中,

    2024年02月15日
    浏览(40)
  • 【FPGA】时序逻辑电路——基于计数器实现一个以1秒频率闪烁的LED灯

    1 D触发器 分析: 特性:输出端Q只在CK处于上升沿的时候变化 图中波形的形成过程: 当D处于高电平时,CK未处于上升沿时,Q仍处于低电平 当CK来到上升沿,Q需要根据D发生变化,由于D是高电平,所以Q要从低电平变化成高电平 D从高电平变化成低电平,但是此时CK未来到上升沿

    2024年02月09日
    浏览(33)
  • (数字逻辑笔记)用Verilog实现4位计数器。(时序逻辑)

    实验描述: 输入: Clock:如果计数器enable信号为1,那么在时钟上升沿,count加1 Enable:如果enable为1,那么在时钟上升沿,count加1;如果enable为0,count保持不变 Reset:重置信号,如果reset为0,count重置为0 输出: Count[3:0]:4位计数信号,范围:4‘b0000 – 4’b1111 实现代码: Tes

    2024年02月11日
    浏览(33)
  • Verilog数字系统设计——10进制计数器,具有异步复位功能

    编程实现10进制计数器,具有异步复位功能,十位和个位用8421BCD码表示,各端口定义如下图所示: 仔细考虑端口定义中每个端口的含义; 要求完成程序编辑、编译、时序仿真; 实验提交Verilog设计文件(.v文件)、仿真波形截图以及对于第3个步骤所提出问题的回答,文件打包

    2024年02月11日
    浏览(27)
  • 【LabVIEW FPGA入门】使用数字IO卡实现计数器输入功能

            1.首先需要用一个数字IO的输入FPGA端口,并将其拖入程序框图中,同时创建一个循环。                  2.如果想要在循环中实现累加功能,就可以使用移位寄存器。         数字输入的当前值和历史值进行比较,用于一个判断大于,来确定是否出现了上升沿

    2024年01月20日
    浏览(40)
  • OUC数字逻辑Verilog实验二 用Verilog实现4位计数器(时序逻辑)

    clk为模拟的脉冲,reset为重置信号,如果reset为0,则把init的值作为初始值赋值给out,enable为使能端,如果enable为1,则在上升沿根据mode的值,如果mode为1,为加计数,mode为0,为减计数。 仿真图像中, 第1个脉冲,reset为0,为out赋值输入的初始值0010。 第2~6个脉冲,enable为1,

    2024年01月17日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包