0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

时序逻辑电路设计之计数器

CHANBAEK 来源:通信情报工学算法学习 作者:syu ikko 2023-05-22 16:54 次阅读

前面已经学习了时序逻辑电路中的基本单元:触发器,这次就用其来整点活,实现计数器的设计,计数器可以说是任何和时序有关的设计都会用到他。

一. 计数器原理

计数器的功能主要就是计数,在数字系统中主要对脉冲的个数进行计数,以实现测量,计数和控制的功能,同时也可以做到分频等功能。 同时,其也是FPGA设计中最常用的一种时序逻辑电路,根据计数器的计数值可以精确控制各个信号的状态。

二. 实用

用计数器计数1s间隔,实现led灯每隔1s闪烁的结果。

本设计十分简单,用一个模块附带简单的输入输出便可以完成。 如下所示:

图片

sys_clk:输入时钟,为系统时钟

sys_rst_n:复位信号,低电平有效

led_out:输出信号,控制LED灯的亮灭

我们的逻辑是这样:计数器进行计数,计数到1s便给LED灯赋值,让其发亮,就可以达到1s亮灭的结果。 所以需要计算一下,计1s需要计数多少次,如果时钟是50MHz,也就是0.000_000_02s,计数一秒需要计数50_000_000个数才可以,不过在设计时刻视为从0开始计数,所以是49_999_999个。

接下来的设计时,为了节省寄存器资源,只计数24_999_999个,也就是1s内闪烁一次(0.5秒一次)。 这需要25位宽的计数器。

图片

下面介绍两种方式的计数器; 带标志位和不带标志位。

不带标志位 :设置一个cnt信号位,时钟的每个上升沿到来时刻,cnt便自动+1,当计数器计到24_999_999的时候,清0,led_out信号取反,只要不复位,变一直计数下去。

带标志位: 在上面方案的基础上,添加一个cnt_flag信号,当计数器计数到24_999_999的时候先不取反,而是让cnt_flag产生一个高脉冲,当led_out 的信号检测到cnt_flag拉高的时候取反。

关于标志位有什么用,先挖个坑,以后说。

图片

图1

图片

图2

注意一下上面两个图(取自野火教材),标志位拉高的时刻并不一样,下面的图在N-1时刻拉高,led_out的状态是刚刚好在0时刻转换(慢一拍),上面的图实际上到后来是计数计多了。 对于这种简单的设计这个问题不痛不痒,但是对于一些要求比较高的设计来说,一秒也不能差,所以这个地方需要注意。

下面给出代码(带信号标志位)

module counter
 #(
 parameter CNT_MAX = 25'd24_999_999
 )
 (
 input wire sys_clk , //系统时钟 50Mh
 input wire sys_rst_n , //全局复位


 output reg led_out //输出控制 led 灯
 );
 
 //reg define
 reg [24:0] cnt ; //经计算得需要 25 位宽的寄存器才够 500ms
 reg cnt_flag;
 
 //cnt:计数器计数,当计数到 CNT_MAX 的值时清零
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt <= 25'b0;
 else if(cnt == CNT_MAX)
 cnt <= 25'b0;
 else
 cnt <= cnt + 1'b1;
 
 //cnt_flag:计数到最大值产生的标志信号,每当计数满标志信号有效时取反
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 cnt_flag <= 1'b0;
 else if(cnt == CNT_MAX – 25'b1)
 cnt_flag <= 1'b1;
 else
 cnt_flag <= 1'b0;
 
 //led_out:输出控制一个 LED 灯
 always@(posedge sys_clk or negedge sys_rst_n)
 if(sys_rst_n == 1'b0)
 led_out <= 1'b0;
 else if(cnt_flag == 1'b1)
 led_out <= ~led_out;
 
 endmodule

测试平台:

module tb_counter(
    );


reg sys_clk;
reg sys_rst_n;


wire led_out;


initial begin
    sys_clk = 1'b1;
    sys_rst_n <= 1'b0;
    #20
    sys_rst_n <= 1'b1;
end




always #10 sys_clk = ~sys_clk;


counter
#(
    .CNT_MAX (25'd24) //实例化带参数的模块时候,当我们想要修改常数在此模块的值的时候,直接实例化参数名后面的括号中修改即可
)
counter_inst(
.sys_clk(sys_clk),
.sys_rst_n(sys_rst_n),


.led_out(led_out)
);




endmodule

仿真波形:

图片

到这里,问题还没解决,在7系列的FPGA的板上,并不输出单端口的时钟,其是200MHz的差分时钟。

图片

AD11和AD12差分时钟输出

经过查阅,调用PLL锁相环的IP核进行差分时钟的单端口时钟输出。

图片

调用时钟IP核,并且选择PLL,在下面选择差分时钟接口。 output时钟设置50MHz。

重新写顶层代码,例化时钟。

module counter




(
//input wire sys_clk,


input wire sys_rst_n,
input clk_p,
input clk_n,


output  reg led_out
    );


reg [24:0] cnt;
reg        cnt_flag;
parameter CNT_MAX = 25'd24_999_999;


wire locked;
wire sys_clk;


clk_wiz_0 diff_2_single
(
    .clk_out1(sys_clk),


    .reset(1'b0),
    .locked(locked),
    .clk_in1_p(clk_p),
    .clk_in1_n(clk_n)
);








//cnt:计数器计数,当计数到cnt_max的时候值清0
always @(posedge sys_clk or negedge sys_rst_n) 
    if (sys_rst_n == 1'b0) 
        cnt <= 25'b0;
    else if(cnt == CNT_MAX)
        cnt <= 25'b0;
    else
        cnt <= cnt+1'b1;


//cnt_flag:计数到最大值产生的标志位信号,每当计数满标志信号有效时取反
always @(posedge sys_clk or negedge sys_rst_n) 
    if(sys_rst_n == 1'b0)
    cnt_flag <= 1'b0;
    else if (cnt == CNT_MAX - 25'b1)
        cnt_flag <= 1'b1;
    else
        cnt_flag <= 1'b0; 




always @(posedge sys_clk or negedge sys_rst_n)
    if (sys_rst_n == 1'b0)
        led_out <= 1'b0;
    else if (cnt_flag == 1'b1)
        led_out <= ~led_out;    


endmodule

RTL电路如下所示:

图片

关于kintex7差分时钟引脚约束的问题需要注意:

这个地方只需要约束其中之一即可,另外一个不用管,如果是不清楚电平标准可以在Tcl控制台输入指令查询:

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1626

    文章

    21665

    浏览量

    601793
  • led
    led
    +关注

    关注

    240

    文章

    23134

    浏览量

    658401
  • 计数器
    +关注

    关注

    32

    文章

    2253

    浏览量

    94351
  • 触发器
    +关注

    关注

    14

    文章

    1995

    浏览量

    61047
  • 时序逻辑电路

    关注

    2

    文章

    94

    浏览量

    16527
收藏 人收藏

    评论

    相关推荐

    时序逻辑电路的精华——计数器

    时序逻辑电路的精华——计数器
    的头像 发表于 12-29 09:23 1316次阅读

    时序逻辑电路设计

    时序逻辑电路设计6.1 基本D触发的设计6.2 JK触发6.3 带异步复位/置位端的使能T触发6.4 基本
    发表于 03-20 10:04

    【FPGA开源教程连载】第三章 时序逻辑电路设计之计数器

    本帖最后由 芯航线跑堂 于 2016-12-25 01:52 编辑 时序逻辑电路设计之计数器实验目的:以计数器为例学会简单的时序
    发表于 12-21 19:15

    时序电路设计计数器详解

    时序逻辑电路设计之计数器实验目的:以计数器为例学会简单的时序逻辑电路设计实验平台:芯航线FPGA
    发表于 01-24 06:35

    移位型计数器中反馈逻辑电路的设计

    摘要:移位型计数器是以移位寄存为主体构成的同步计数器。这类计数器具有电路连接简单,编码别具特色的特点,用途十分广泛。文中介绍了移位型
    发表于 04-26 11:16 29次下载

    时序逻辑电路

    实验十六  时序逻辑电路? 实验(1) 计数器?一、实验目的?⒈ 熟悉计数器的设计方法及工作原理。?⒉ 了解同步计数器与异步
    发表于 09-24 22:17 3311次阅读
    <b class='flag-5'>时序</b><b class='flag-5'>逻辑电路</b>

    Multisim的时序逻辑电路设计仿真

    通过介绍Multisim软件的功能和特点,结合格雷玛计数器的设计实例,叙述了在Multisim软件平台进行时序逻辑电路的设计原理及构成方法,并利用软件对设计进行仿真。
    发表于 02-10 16:43 133次下载
    Multisim的<b class='flag-5'>时序</b><b class='flag-5'>逻辑电路设计</b>仿真

    计数器时序电路

    1、了解时序电路的经典设计方法(D触发、JK触发和一般逻辑门组成的时序逻辑电路)。 2、
    发表于 07-10 14:37 15次下载

    时序逻辑电路的主要故障分析

    时序逻辑电路其任一时刻的输出不仅取决于该时刻的输入,而且还与过去各时刻的输入有关。常见的时序逻辑电路有触发
    发表于 04-09 16:00 6240次阅读
    <b class='flag-5'>时序</b><b class='flag-5'>逻辑电路</b>的主要故障分析

    时序逻辑电路分为几类

    时序逻辑电路是由组合逻辑电路与记忆电路(又称存储电路) 组合而成的。 常见时序
    的头像 发表于 02-26 15:25 5.1w次阅读

    组合逻辑电路时序逻辑电路的学习课件免费下载

    本文档的主要内容详细介绍的是组合逻辑电路时序逻辑电路的学习课件免费下载包括了:任务一 组合逻辑电路,任务二 编码,任务三 译码
    发表于 10-27 15:58 31次下载
    组合<b class='flag-5'>逻辑电路</b>和<b class='flag-5'>时序</b><b class='flag-5'>逻辑电路</b>的学习课件免费下载

    时序逻辑电路设计之同步计数器

    时序电路的考察主要涉及分析与设计两个部分,上文介绍了时序逻辑电路的一些分析方法,重点介绍了同步时序电路分析的步骤与注意事项。 本文就时序
    的头像 发表于 05-22 17:01 3139次阅读
    <b class='flag-5'>时序</b><b class='flag-5'>逻辑电路设计</b>之同步<b class='flag-5'>计数器</b>

    时序逻辑电路设计之异步计数器

    上文介绍了同步计数器的设计原则以及各注意事项,本文承接上文继续介绍异步计数器以及三种常用的集成计数器的相关内容。
    的头像 发表于 05-22 17:07 4495次阅读
    <b class='flag-5'>时序</b><b class='flag-5'>逻辑电路设计</b>之异步<b class='flag-5'>计数器</b>

    时序逻辑电路有哪些 时序逻辑电路和组合逻辑电路区别

    产生相应的输出信号。本文将详细介绍时序逻辑电路的分类、基本原理、设计方法以及与组合逻辑电路的区别。 一、时序逻辑电路的分类
    的头像 发表于 02-06 11:18 9035次阅读

    时序逻辑电路包括什么器件组成

    当前的输入信号,还取决于电路的历史状态。与组合逻辑电路不同,组合逻辑电路的输出仅取决于当前的输入信号,而时序逻辑电路的输出则受到
    的头像 发表于 07-30 15:02 587次阅读