• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

分频时钟、使能时钟、门控时钟的概念和使用

武飞扬头像
xsnl
帮助1

一.概述

        FPGA的时钟和时序以及功能息息相关,下面将介绍分频时钟,使能时钟以及门控时钟。

二.时钟设计介绍

1.分频时钟

        有些时候设计需要将主时钟进行分频以降低频率使用,对于有足够PLL和MMCM资源的FPGA,可以使用PLL或MMCM进行分频,但是没有这些资源的FPGA要想降低时钟频率就得靠逻辑来完成。以下是一个将主时钟4分频的代码。

  1.  
    module clock_div(
  2.  
    input clk_in,
  3.  
    input rst,
  4.  
    output clk_div_out
  5.  
    );
  6.  
     
  7.  
    reg [1:0] cnt;
  8.  
    always @(posedge clk_in or posedge rst) begin
  9.  
    if (rst) begin
  10.  
    // reset
  11.  
    cnt <= 2'b0;
  12.  
    end
  13.  
    else if (cnt == 1) begin
  14.  
    cnt <= 0;
  15.  
    end
  16.  
    else cnt <= cnt 1;
  17.  
    end
  18.  
     
  19.  
    reg clk_div;
  20.  
    always @(posedge clk_in or posedge rst)begin
  21.  
    if(rst)begin
  22.  
    clk_div <= 1'b0;
  23.  
    end
  24.  
    else if(cnt == 1)begin
  25.  
    clk_div <= ~clk_div;
  26.  
    end
  27.  
    else clk_div <= clk_div;
  28.  
    end
  29.  
     
  30.  
    assign clk_div_out = clk_div;
  31.  
    endmodule
学新通

         该代码块会产生一个4分频的时钟,但是不介意产生这样一个时钟给其他模块用。原因有以下两点。

(1)clk_div由逻辑门(反相器)产生,会有毛刺。

(2)clk_div这个触发器在clk_in时钟有效到输出clk_div信号是有着Tco的时间延迟,这样会让clk_div和clk_in产生较大的相移,然后让clk_div去驱动其他模块,这种做法在设计中会产生较大的问题。

(3)引入多时钟域问题。

2.使能时钟

        使能时钟以分频时钟为基础,只不过不产生反相器,生成的信号en不作为时钟去驱动其他模块,而是作为使能信号。如下图:

学新通

项目中也用到了使能时钟,比如288位的寄存器,由cpu通过localbus总线32位写下来,那么可以通过cnt计数,cnt为9时(288位被写完)产生一个使能信号,将此288位寄存器给到RAM的输入。网上找了个类似的代码如下:

        这是在某系统中,前级数据输入位宽为8位,而后级的数据输出位宽为32,我们需要将8bit数据转换为32bit,由于后级的处理位宽为前级的4倍,因此后级处理的时钟频率也将下降为前级的1/4,若不使用时钟使能,则要将前级的时钟进行4分频来作后级处理的时钟。这种设计方法会引入新的时钟域,处理上需要采取多时钟域处理的方式,因而在设计复杂度提高的同时系统的可靠性也将降低。为了避免以上问题,我们采用了时钟使能以减少设计复杂度。

  1.  
    module clk_en(clk, rst_n, data_indata_out);
  2.  
    input clk;
  3.  
    input rst_n;
  4.  
    input [7:0] data_in;
  5.  
    output [31:0] data_out;
  6.  
     
  7.  
    reg [31:0] data_out;
  8.  
    reg [31:0] data_shift;
  9.  
    reg [1:0] cnt;
  10.  
    reg clken;
  11.  
     
  12.  
    always @(posedge clk or negedge rst_n)
  13.  
    begin
  14.  
    if (!rst_n)
  15.  
    cnt <= 0;
  16.  
    else
  17.  
    cnt <= cnt 1;
  18.  
    end
  19.  
     
  20.  
    always @(posedge clk or negedge rst_n)
  21.  
    begin
  22.  
    if (!rst_n)
  23.  
    clken <= 0;
  24.  
    else if (cnt == 2'b01)
  25.  
    clken <= 1;
  26.  
    else
  27.  
    clken <= 0;
  28.  
    end
  29.  
     
  30.  
    always @(posedge clk or negedge rst_n)
  31.  
    begin
  32.  
    if (!rst_n)
  33.  
    data_shift <= 0;
  34.  
    else
  35.  
    data_shift <= {data_shift[23:0],data_in};
  36.  
    end
  37.  
     
  38.  
    always @(posedge clk or negedge rst_n)
  39.  
    begin
  40.  
    if (!rst_n)
  41.  
    data_out <= 0;
  42.  
    else if (clken == 1'b1)
  43.  
    data_out <= data_shift;
  44.  
    end
  45.  
     
  46.  
    endmodule
学新通

        可以看到,在上面代码中,也使用到了计数器,但是仅仅是用于产生一个时钟使能脉冲信号,只持续一个clk。而clk_en也没有直接用于驱动其他电路,在整个系统中,所有的时钟都是clk,这样就不会有相移过大以及多时钟域的问题存在了,而且也不会出现由于毛刺带来的影响。

3.门控时钟

        门控时钟是通过一个控制信号来控制时钟的开和关。

        如果单纯从功能实现来看,使用使能时钟替代门控时钟是一个不错的选择;但是使能时钟在使能信号关闭时,时钟信号仍在工作,它无法像门控时钟那样降低系统功耗。

学新通

        这样的门控时钟有两个问题:

        (1)由于门控信号是一个异步信号,会产生亚稳态的问题。具体见亚稳态的跨时钟处理(一)的什么情况下会产生亚稳态。

        (2)一般情况下,门控时钟只需要一个与门,但是如果有附加的组合逻辑,输出信号将会有毛刺。学新通

        用打拍的方式有效的抑制了亚稳态可能产生的危害。而且如果门控信号gating signal有附加的组合逻辑,也会因为D触发器的D输入端对毛刺信号不敏感的特点,将毛刺有效滤除掉。

Note:

        对于输出的时钟信号或复位信号,最好让它走全局时钟网络,从而减小时钟网络延时,提升系统时序性能。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhibhaff
系列文章
更多 icon
同类精品
更多 icon
继续加载