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
    +关注

    关注

    1603

    文章

    21326

    浏览量

    593242
  • led
    led
    +关注

    关注

    237

    文章

    22450

    浏览量

    645893
  • 计数器
    +关注

    关注

    32

    文章

    2123

    浏览量

    92991
  • 触发器
    +关注

    关注

    14

    文章

    1681

    浏览量

    60412
  • 时序逻辑电路

    关注

    2

    文章

    78

    浏览量

    16402
收藏 人收藏

    评论

    相关推荐

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

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

    时序逻辑电路设计

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

    时序逻辑电路实验

    时序逻辑电路一、实验目的   1.掌握D、JK触发逻辑功能和使用   2.掌握中规模集成计数器7
    发表于 09-16 15:08

    【转】 时序逻辑电路的三种逻辑器件

    时序逻辑电路应用很广泛,根据所要求的逻辑功能不同进行划分,它的种类也比较繁多。在具体的授课环节中,主要选取了应用较广、具有典型时序逻辑电路
    发表于 10-25 23:03

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

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

    时序电路设计计数器详解

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

    时序逻辑电路设计

    时序逻辑电路的输出不但和当前输入有关,还与系统的原先状态有关,即时序电路的当前输出由输入变量与电路原先的状态共同决定。为达到这一目的,时序
    发表于 03-18 22:13 71次下载

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

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

    时序逻辑电路

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

    时序逻辑电路分为几类

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

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

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

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

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