同步计数器设计与建模

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

⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。
🔥文章和代码已归档至【Github仓库:hardware-tutorial】,需要的朋友们自取。或者公众号【AIShareLab】回复 FPGA 也可获取。

概 述

(1) 计数器的逻辑功能

计数器的基本功能是对输入时钟脉冲进行计数。它也可用于分频、定时、产生节拍脉冲和脉冲序列及进行数字运算等。

(2) 计数器的分类

按脉冲输入方式,分为同步和异步计数器

按进位体制,分为二进制、十进制和任意进制计数器

按逻辑功能,分为加法、减法和可逆计数器

用触发器设计一个自然态序六进制计数器,FPGA Tutorial,fpga开发

计数器运行时,依次遍历规定的各状态后完成一次循环,它所经过的状态总数称为计数器的“模”(Modulo),通常用M表示。

同步计数器的设计

例 用D触发器和逻辑门设计一个同步六进制计数器。要求有一个控制信号U,

  • 当U=1时,计数次序为递增计数0,1,2,3,4,5,0,1,2,…;
  • 当U=0时,计数次序为递减计数5,4,3,2,1,0,5,4,3,…。

另外,当递增计数到最大值5时,要求输出一个高电平CO=1;当递减计数到最小值0时,也要求输出一个高电平BO=1。

解:(1) 分析设计要求,画出总体框图。

根据要求,计数器共有6个状态,我们要用D触发器来表示或区分出这6个状态,需要多少个D触发器才够呢?由于3个D触发器能够存储3位二进制数,而3位2进制数能表示23=8个状态,即000,001,010,011,100,101,110,111,所以只需要3个触发器就能表示6个状态。

总体电路框图如下:

用触发器设计一个自然态序六进制计数器,FPGA Tutorial,fpga开发

左半部分是3个D触发器,用于记录计数器的当前状态。右半部分是组合逻辑,生成下一个状态信号并产生输出信号。由于下一个状态信号与触发器的D端相连接,因此,该信号也被称为触发器的激励信号。

(2) 画出状态转换图

用触发器设计一个自然态序六进制计数器,FPGA Tutorial,fpga开发

(3)列出转换表

用触发器设计一个自然态序六进制计数器,FPGA Tutorial,fpga开发

(4)确定下一个状态的逻辑表达式

用触发器设计一个自然态序六进制计数器,FPGA Tutorial,fpga开发

N S [ 0 ] = Q [ 1 ] ‾ ⋅ Q [ 0 ] ‾ + Q [ 2 ] ‾ ⋅ Q [ 0 ] ‾ N S [ 1 ] = U ˉ ⋅ Q [ 2 ] ‾ ⋅ Q [ 1 ] ‾ ⋅ Q [ 0 ] + U ˉ ⋅ Q [ 2 ] ‾ ⋅ Q [ 1 ] ⋅ Q [ 0 ] ‾ + U ⋅ Q [ 2 ] ‾ ⋅ Q [ 1 ] ⋅ Q [ 0 ] + U ⋅ Q [ 1 ] ⋅ Q [ 1 ] ‾ ⋅ Q [ 0 ] ‾ N S [ 2 ] = U ˉ ⋅ Q [ 2 ] ‾ ⋅ Q [ 1 ] ⋅ Q [ 0 ] + U ˉ ⋅ Q [ 2 ] ⋅ Q [ 1 ] ‾ ⋅ Q [ 0 ] ‾ + U ⋅ Q [ 2 ] ‾ ⋅ Q [ 1 ] ‾ ⋅ Q [ 0 ] ‾ + U ⋅ Q [ 2 ] ⋅ Q [ 1 ] ‾ ⋅ Q [ 0 ] \begin{array}{l} N S[0]=\overline{Q[1]} \cdot \overline{Q[0]}+\overline{Q[2]} \cdot \overline{Q[0]} \\ N S[1]=\bar{U} \cdot \overline{Q[2]} \cdot \overline{Q[1]} \cdot Q[0]+\bar{U} \cdot \overline{Q[2]} \cdot Q[1] \cdot \overline{Q[0]}+U \cdot \overline{Q[2]} \cdot Q[1] \cdot Q[0]+U \cdot Q[1] \cdot \overline{Q[1]} \cdot \overline{Q[0]} \\ N S[2]=\bar{U} \cdot \overline{Q[2]} \cdot Q[1] \cdot Q[0]+\bar{U} \cdot Q[2] \cdot \overline{Q[1]} \cdot \overline{Q[0]}+U \cdot \overline{Q[2]} \cdot \overline{Q[1]} \cdot \overline{Q[0]}+U \cdot Q[2] \cdot \overline{Q[1]} \cdot Q[0] \\ \end{array} NS[0]=Q[1]Q[0]+Q[2]Q[0]NS[1]=UˉQ[2]Q[1]Q[0]+UˉQ[2]Q[1]Q[0]+UQ[2]Q[1]Q[0]+UQ[1]Q[1]Q[0]NS[2]=UˉQ[2]Q[1]Q[0]+UˉQ[2]Q[1]Q[0]+UQ[2]Q[1]Q[0]+UQ[2]Q[1]Q[0]

同理, 得到
C O = U ˉ ⋅ Q [ 2 ] ⋅ Q [ 1 ] ‾ ⋅ Q [ 0 ] B O = U ⋅ Q [ 2 ] ‾ ⋅ Q ˉ [ 1 ] ⋅ Q [ 0 ] ‾ \quad C O=\bar{U} \cdot Q[2] \cdot \overline{Q[1]} \cdot Q[0] \\ \quad B O=U \cdot \overline{Q[2]} \cdot \bar{Q}[1] \cdot \overline{Q[0]} CO=UˉQ[2]Q[1]Q[0]BO=UQ[2]Qˉ[1]Q[0]
(5) 画出逻辑图

用触发器设计一个自然态序六进制计数器,FPGA Tutorial,fpga开发

同步计数器的Verilog HDL建模

例 试用Verilog HDL对图所示电路建模

(1)设计块:

module Counter6 (CP,CLR_,U,Q,CO,BO);
   input CP, CLR_, U;  
   output reg [2:0] Q;     //Data output
   output CO,BO;
 assign CO = U  & (Q == 3'd5);
 assign  BO = ~U & (Q == 3'd0) & (CLR_== 1 ' b1);
 always @ (posedge CP or negedge CLR_)
   if (~CLR_) Q <= 3'b000; //asynchronous clear
   else if (U==1)          //U=1,Up Counter
         Q <= (Q + 1'b1)%6; 
   else if (Q == 3'b000)
         Q <= 3'd5; 
   else                    //U=0,Down Counter
         Q <= (Q - 1'b1)%6;
endmodule

(2)激励块:给输入变量(CLR_、CLK和U)赋值,产生激励信号。

module Test_Counter6 ;
    reg  U;           //Up/Down inputs      
    reg  CLK, CLR_;   //Clock and Reset
    wire  CO,BO;      //output  
    wire [2:0]  Q;    //Register output

Counter6 U0(CLK,CLR_,U,Q,CO,BO); //实例引用设计块
  
initial begin         // CLR_
    CLR_ = 1'b0;
    CLR_ = #10 1'b1;
    #360 $stop;
    end 
always begin    // CLK
    CLK = 1'b0;
    CLK = #10 1'b1;
    #10;
    end 
initial begin   //U
    U = 1'b0;
    #190;
    U = 1'b1;
    end 
endmodule

(3)仿真结果:

六进制计数器的仿真波形

用触发器设计一个自然态序六进制计数器,FPGA Tutorial,fpga开发

例 试用Verilog HDL描述一个带有异步置零和具有使能功能的同步十进制递增计数器。

//Non-Binary counter with ENable 
module M10_counter (EN,CP,CLR_,Q); 
   input EN,CP,CLR_;
   output reg [3:0] Q;      //Data output
always @(posedge CP or negedge CLR_)
  if (!CLR_)                //异步清零
            Q <= 4'b0000; 
  else if (EN) begin 
       if (Q >= 4'b1001) 
            Q <= 4'b0000;   //出错处理
       else Q <= Q + 1'b1;  //递增计数
       end  
  else 
            Q <= Q;         //保持计数值不变
endmodule

例:请描述具有异步清零、同步置数的计数器,并要求具有可逆计数和保持的功能。

module cntr(q, aclr, clk, func, d);
input aclr, clk;
input [7:0] d;
//Controls the functionality 
input [1:0] func; 
output [7:0] q;
reg [7:0] q;
always @(posedge clk or posedge aclr) begin
  if (aclr)   q <= 8'h00;
  else  case (func)
     2'b00: q <= d; // Loads the counter
     2'b01: q <= q + 1; // Counts up
     2'b10: q <= q - 1; // Counts down
     2'b11: q <= q;
   endcase
end
endmodule

例:假设有一个50 MHz时钟信号源,试用Verilog HDL设计一个分频电路,以产生1Hz的秒脉冲输出,要求输出信号的占空比为50%。

解:设计一个模数为 25 ∗ 1 0 6 25*10^6 25106的二进制递增计数器,其计数范围是0~24999999,每当计数器计到最大值时,输出信号翻转一次,即可产生1Hz的秒脉冲。

module Divider50MHz(CR,CLK_50M, CLK_1HzOut);
  input	CR,CLK_50M; 
  output reg CLK_1HzOut;   
  reg [24:0] Count_DIV; //内部节点
parameter CLK_Freq = 50000000;
parameter OUT_Freq = 1;
always @(posedge CLK_50M or negedge CR)  begin
if(!CR)  begin
       CLK_1HzOut <= 0;
       Count_DIV     <= 0;
       end
else  begin
if( Count_DIV < (CLK_Freq/(2*OUT_Freq-1)) )
            Count_DIV <= Count_DIV+1'b1;  
 else begin
	 Count_DIV     <=	0; 		 CLK_1HzOut  <=  ~CLK_1HzOut; 
         end
 end
end
endmodule 

产生1Hz的秒脉冲输出分频电路文章来源地址https://www.toymoban.com/news/detail-789060.html

always @(posedge CLK_50M or negedge CR) 
begin
  if(!CR)  begin
      	       CLK_1HzOut <= 0;
                    Count_DIV     <= 0;
  	  end
  else  begin
           if( Count_DIV < (CLK_Freq/2*OUT_Freq-1) )
                     Count_DIV <= Count_DIV+1'b1;  
           else begin
                     Count_DIV      <=	0; 		 
                     CLK_1HzOut  <=  ~CLK_1HzOut; 
           	      end
           end
end
endmodule 

到了这里,关于同步计数器设计与建模的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【FPGA】Verilog:计数器 | 异步计数器 | 同步计数器 | 2位二进制计数器的实现 | 4位十进制计数器的实现

    目录 Ⅰ. 实践说明 0x00 计数器(Counter) 0x01 异步计数器(Asynchronous Counter)

    2024年02月05日
    浏览(46)
  • Canopen学习笔记——sync同步报文增加数据域(同步计数器)

    在OD表中的配置如下: 如果0x1006索引的同步报文循环周期时间设置为0则禁用同步报文,这里要注意的就是,上面第一张图也提到了,时间单位是us。第二张图,我的0x1006就设置为0xF4240,也就是1s发送一次同步报文。 关于同步桢(同步计数器)的问题可以参考这篇文章: 我这里

    2024年01月20日
    浏览(28)
  • ModuleAim Verilog同步置数、同步清零的计数器实验

    ModuleSim Verilog同步置数、同步清零的计数器实验 #全文复制可运行,经验证无错 你好! 这是你第一次使用 ModuleAim同步置数、同步清零的计数器实验 如果这是你第一次项目,推荐一个哔站10分钟的视频,手把手带你从建立到完成,看完后再复制我代码即可运行。 【【教学】m

    2024年02月11日
    浏览(41)
  • 4.2 同步计数器74x163 的实现

    74LS163计数器有5个控制端、4个数据输入端和5个输出端,其逻辑功能和对应的逻辑符号如下图1和图2所示:(该例子在教材《Xilinx FPGA原理与实践—基于Vivado和Verilog HDL——卢有亮》P95页) (CLR非)是异步清零端——低有效清零端 (LD非)是同步置数控制端——数据装载输入 ENT和EN

    2024年02月09日
    浏览(27)
  • 【verilog】含异步清零和同步使能的加/减法计数器

    实验目的 掌握二进制计数器的工作原理。 能使用verilog设计计数器。 3、进一步熟悉QUARTUSII软件的使用方法和verilog输入方式 实验原理与内容 实验原理 二进制计数器中应用最多、功能最全的计数器之一,是含异步清零和同步使能的具有并行载入功能的加/减法计数器。其具体工

    2024年02月02日
    浏览(43)
  • 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

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

    2024年02月02日
    浏览(49)
  • 用74LS73设计四位二进制加法计数器和8421BCD加法计数器

     (1)用2片74LS73实现该电路,由CP端输入单脉冲,设计并画出4位异步二进制加法计数器电路图。  (2)由CP端输入单脉冲,测试并记录Q1~Q4端状态及波形。 四位二进制加法计数器状态迁移表如下: Q 4n Q 3n Q 2n Q 1n Q 4n+1 Q 3n+1 Q 2n+1 Q 1n+1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0

    2024年02月10日
    浏览(71)
  • 数字电路13-任意进制计数器设计

    因为市面上的进制计数器的种类优先,所以需要特定进制时,只能自己在已有产品的基础上构成需要的特定进制。 十进制计数器也是通过4位二进制计数器,去掉多余状态所得 根据十进制计数器,可得M进制计数器的特点,即状态数、脉冲数、末状态 如前面的十进制计数器,

    2024年02月07日
    浏览(43)
  • 任意进制加法计数器电路设计

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

    2024年02月09日
    浏览(39)
  • 脉冲计数器 单片机课程设计

    利用单片机对单片机实验箱的按键S29发出的负脉冲个数进行加/减计数,计数结果(0~255)在8个LED数码管中的3位进行显示(使用8255进行动态驱动)。 利用拨动开关S26来选择计数的方式。S26接高电平时,进行加法计数。S26接低电平时,进行减法计数;利用拨动开关S27控制计数

    2024年02月04日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包