同步计数器设计与建模

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

概 述

(1) 计数器的逻辑功能

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

(2) 计数器的分类

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

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

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

计数器运行时,依次遍历规定的各状态后完成一次循环,它所经过的状态总数称为计数器的“模”(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个状态。

总体电路框图如下:

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

(2) 画出状态转换图

image-20230202160254624

(3)列出转换表

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

$$ \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} $$

同理, 得到

$$ \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]} $$

(5) 画出逻辑图

同步计数器的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)仿真结果:

六进制计数器的仿真波形

例 试用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*10^6$的二进制递增计数器,其计数范围是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的秒脉冲输出分频电路

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 

欢迎关注公众号【AIShareLab】,一起交流更多相关知识,前沿算法,Paper解读,项目源码,面经总结。

目录
相关文章
|
存储 数据安全/隐私保护 芯片
毕业设计 基于51单片机的指纹红外密码电子锁
毕业设计 基于51单片机的指纹红外密码电子锁
415 0
|
消息中间件 缓存 监控
GitHub上获赞上万的阿里亿级并发系统设计手册,让你吊打面试官
金九银十已经接近尾声,很多没有在这个时间段找到工作的小伙伴已经开始备战秋招了,在这里给大家分享一份阿里10亿级并发系统设计手册,专门给没有系统设计相关经验的小伙伴应对面试用的,下面将这么手册的内容以截图的形式展示给大家,有需要的小伙伴可以文末获取↓↓↓此份手册又份为六个部分,基础篇、数据库篇、缓存篇、消息队列篇、分布式服务篇、维护篇、实战篇共计328页 目录总览 基础篇 高并发代表着大流量,高并发系统设计的魅力就在于我们能够凭借自己的聪明才智设计巧妙的方案,从而抵抗巨大流量的冲击,带给用户更好的使用体验。这些方案好似能操纵流量,让流量更加平稳得被系统中的服务和组件处理。
GitHub上获赞上万的阿里亿级并发系统设计手册,让你吊打面试官
|
9月前
|
Java Maven 数据安全/隐私保护
小红书私信卡片一键生成,小红书链接生成器, 小红书跳转卡片免费【jar】
这是一个完整的小红书私信卡片生成器Java应用程序 使用Swing GUI框架创建用户界面
|
9月前
|
人工智能 文字识别 监控
抖音一键跳转微信加好友如何实现?
在2025年的移动互联网生态中,抖音日活用户已突破8亿,微信月活达13亿,两大平台间的用户导流
|
9月前
|
数据安全/隐私保护 Python
小红书私信卡片一键生成, 小红书卡片跳转生成器, 小红书跳转卡片免费【python】
就是可以通过代码实现小红书卡片的效果,这个办法非常的稳定,主要问题是因为小红书没有公开的接口
|
10月前
|
移动开发 PHP 数据安全/隐私保护
抖音一键跳转微信加好友
抖音跳转微信加好友的技术实现方案 1. 技术背景与需求分析
|
存储 缓存 前端开发
【数据结构/C语言】深入理解 双向链表
【数据结构/C语言】深入理解 双向链表
|
SQL 分布式计算 大数据
一张图,详解大数据技术架构
一张图,详解大数据技术架构
|
机器学习/深度学习 搜索推荐 数据挖掘
DocEE:一种用于文档级事件抽取的大规模细粒度基准 论文解读
事件抽取旨在识别一个事件,然后抽取参与该事件的论元。尽管在句子级事件抽取方面取得了巨大的成功,但事件更自然地以文档的形式呈现,事件论元分散在多个句子中。
607 0
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。

热门文章

最新文章