草庐IT

5.2 Verilog 时钟简介

runoob 2023-03-28 原文

关键词:时钟源,时钟偏移,时钟抖动,时钟转换时间,时钟延时,时钟树,双边沿时钟

几乎稍微复杂的数字设计都离不开时钟。时钟也是所有时序逻辑建立的基础。前面介绍建立时间和保持时间时也涉及过时钟偏移的概念。下面将总结下时钟的相关知识,以便更好的进行数字设计。

时钟源

根据时钟源在数字设计模块中位置的不同,可以将时钟源分为外部时钟源和内部时钟源。

外部时钟源:

RC/LC 振荡电路:利用正反馈或负反馈电路产生周期性变化时钟信号。此类时钟源电路简单,频率变化范围大,但工作频率较低,稳定度不高。

无源/有源晶体振荡器:利用石英晶体的压电效应(压力和电信号可以相互转换)产生谐振信号。此类时钟源频率精度高,稳定性好,噪声低,温漂小。有源晶振中,往往还加入了压控或温度补偿,时钟的相位和频率都有较好的特性。但电路实现相对复杂,频带较窄,频率基本不能调节。

调试特定电路时,往往也会使用一些搭建的特定电路(例如施密特触发器)或信号发生器设备产生的时钟源。

内部时钟源:

锁相环(PLL, Phase Locked Loop):

利用外部输入的参考信号控制环路内部振荡信号的频率和相位,实现输出信号频率对输入信号频率的自动跟踪,通过反馈通路将信号倍频到一个较高的固定频率。

一般晶振由于工艺与成本原因,做不到很高的频率,利用 PLL 电路就可以实现稳定且高频的时钟。PLL 集成到设计模块的内部,可以保证数字电路具有较好的延迟和稳定性。

时钟分频:有些模块工作频率会低于系统时钟频率,此时就需要对系统时钟进行一定的分频得到频率较低的时钟。

通过在 always 语句块中计数并输出时钟信号,是分频器常用的方法。任意分频比的实现逻辑详见下一节《5.3 时钟分频》。

时钟切换:系统或某些模块的工作频率有时候会在特定状况下改变,例如低功耗模式下需要降频,提高计算能力时需要升频。此时系统往往会有多个时钟源,以备有需求时进行时钟切换。

时钟切换逻辑如果不进行优化,在切换的过度时间内,大概率会出现尖峰脉冲干扰,对电路产生不利影响。安全的切换逻辑,详见后面章节:《5.4 时钟切换》。

数字系统往往会采用外部晶振输入、内部 PLL 进行倍频的方案。再根据设计需求进行时钟分频或时钟切换。

时钟特性

仿真时,所有同步的时钟都是理想的:时钟的翻转是在瞬间完成的,模块之间的时钟沿都是对齐的,没有延迟,没有抖动。实际电路中,时钟在传输、翻转时都会有延迟。完美的数字设计,也应该考虑这些不完美的时钟特性,否则也会造成设计时序不满足的状况。

下面对时钟的一些特性进行简单说明。

时钟偏移(skew)

由于线网的延迟,时钟信号在到达触发器端口时,不能保证不同触发器端口的时钟沿是对齐的,即不同触发器端口的时钟相位存在差异。这种差异称为时钟偏移。示意图如下:

一般时钟偏移与时钟频率没有直接的关系,与走线长度、负载电容、负载数量等因素有关。

时钟抖动(jitter)

相对于理想时钟沿,实际时钟中存在的不随时间积累的、时而超前、时而滞后的偏移称为时钟抖动。可以用抖动频率和抖动幅度对时钟抖动进行定量描述。数字设计中,时钟抖动都是用时间来描述,示意图如下。

时钟抖动可分为随机抖动和固定抖动。

随机抖动的来源为热噪声、半导体工艺等。

固定抖动的来源为开关电源、电磁干扰或其他不合理的布局布线等。

在综合工具 Design Compiler 中,时钟的偏移和抖动统一用不确定度 uncertainty 来统一表示。

转换时间(transition)

时钟从上升沿跳变到下降沿,或者从下降沿跳变到上升沿时,并不是"直上直下"不需要时间完成电平跳变,而是"斜坡式"需要一个过渡时间完成电平跳变。这个过渡时间称之为时钟的转换时间,示意图如下。

转换时间大小与单元库工艺、电容负载等有关。

时钟延时(lantency)

时钟从时钟源(例如晶振、PLL 或分频器输出端)出发到达触发器端口的延迟时间,称为时钟延时。时钟延时包括时钟源延迟(source latency)和时钟网络延迟(network latency),如下图所示。

时钟源延时,是时钟信号从实际时钟原点到设计模块时钟定义点的传输时间。上图所示为 3ns。

时钟网络延时,是从设计模块时钟定义点到模块内触发器时钟端的传输时间,传输路径上可能经过缓冲器(buffer)。上图所示为 1ns。

时钟源延时(source latency)是设计模块内所有触发器共有的延时,所以不会影响时钟偏移(skew)。

时钟树

数字设计时各个模块应当使用同步时钟电路,同步电路中被相同时钟信号驱动的触发器共同组成一个时钟域。理想电路中,时钟信号会同时到达同时钟域所有触发器的时钟端。但是实际中因为各种延迟的存在,这种无延迟的时钟特性是很难实现的。而且时钟信号的驱动能力有限,难以独立的为一个包含较多的触发器的时钟域提供有效扇出。为解决时钟延迟与驱动的问题,就需要采用时钟树系统对时钟信号进行管理,来确保良好的时序和驱动能力。

时钟树,是个由许多缓冲单元 (buffer cell) 平衡搭建的网状结构。一般由一个时钟源点,经一级一级的缓冲单元搭建而成。增加 clock buffer(图中橙色三角模块) 的实际时钟树结构如下所示。

蓝色的上升沿符号表示时钟的转换时间(transition),红色的实线则表示时钟延时 (latency),包含 network delay 和 source latency,绿色的虚线表示时钟不确定度(uncertainty),包括时钟偏移(skew)和时钟抖动(jitter)。

时钟树并不是来减少时钟信号到达各个触发器的时间,而是减少到达各个触发器之间的时间差异。一般是后端设计人员通过插入 clock buffer 完成时钟树的设计。前端设计人员,往往需要保证时钟方案与数字逻辑的功能正确性。

其他时钟分类:

同步、异步时钟

《4.1 同步与异步》中有详细说明,当时钟同源且满足整数倍关系是,一般可以认为时钟是同步的。数字设计中同步时钟的定义比较宽泛。同时钟域下的逻辑不需要进行同步处理。

下面从同步电路的角度来理解同步时钟的概念。

同步电路是由时序和组合逻辑电路构成的电路。同步电路的特点是各触发器的时钟端全部连接在一起,并接在系统时钟端。只有当时钟脉冲到来时,电路的状态才能改变。改变后的状态将一直保持到下一个时钟脉冲的到来。这期间无论外部输入 x 有无变化,状态表中的每个状态都是稳定的。

门控时钟

门控时钟的基本原理:使能信号有效的时候,打开时钟。使能信号无效的时候,关闭时钟。

由于门控时钟可以将工作时钟在适合的时间关闭,所以门控时钟在低功耗设计中有着广泛应用。门控时钟最简单是实现逻辑是将使能信号直接与时钟信号做"与"操作,但这样是不安全的,容易出现毛刺现象。详细门控时钟介绍请参考《6.4 RTL 级低功耗设计(下)》。

双边沿时钟

某些模块可以在时钟的上升沿和下降沿都进行数据传输,达到速率增倍的效果。

DDR (Double Data Rate) SDRAM 是典型的采用双边沿传输数据的例子。

典型 DDR 数据传输示意图如下。

下面对时钟双边沿传输数据的行为进行一个简单的仿真。

基本设计思路是,利用时钟双边沿对数据进行读取,然后通过与时钟相反的片选信号对数据进行选择输出,完成数据在时钟双边沿的传输。

Verilog 代码描述如下 。

实例


module double_rate(
    input               rstn ,
    input               clk,
    input               csn,

    input [7:0]         din,
    input               din_en,
    output [7:0]        dout,
    output              dout_en);

   //capture at posedge
   reg [7:0]            datap_r ;
   reg                  datap_en_r ;
   always @(posedge clk or negedge rstn) begin
      if (!rstn) begin
         datap_r        <= 'b0 ;
         datap_en_r     <= 1'b0 ;
      end
      else if (din_en) begin
         datap_r        <= din ;
         datap_en_r     <= 1'b1 ;
      end
      else begin
         datap_en_r     <= 1'b0 ;
      end
   end

   //capture at negedge
   reg [7:0]            datan_r ;
   reg                  datan_en_r ;
   always @(negedge clk or negedge rstn) begin
      if (!rstn) begin
         datan_r        <= 'b0 ;
         datan_en_r     <= 1'b0 ;
      end
      else if (din_en) begin
         datan_r        <= din ;
         datan_en_r     <= 1'b1 ;
      end
      else begin
         datan_en_r     <= 1'b0 ;
      end
   end

   assign dout = !csn ? datap_r : datan_r ;
   assign dout_en = datan_en_r | datap_en_r ;
endmodule

testbench 描述如下,其中双边沿数据传输模块的时钟频率为 100MHz,但输入的数据速率为 200MHz。

实例


`timescale 1ns/1ps

module test ;
   reg          clk_100mhz, clk_200mhz ;
   reg          rstn ;
   reg          csn ;
   reg [7:0]    din ;
   reg          din_en ;
   wire [7:0]   dout ;
   wire         dout_en ;

   always #(2.5)    clk_200mhz  = ~clk_200mhz ;
   always @(posedge clk_200mhz)
                    clk_100mhz  = ~clk_100mhz ;

   initial begin
      clk_100mhz  = 0 ;
      clk_200mhz  = 0 ;
      rstn        = 0 ;
      din         = 0 ;
      din_en      = 0 ;
      csn         = 0 ;
      //start work
      #11 rstn    = 1 ;
      @(negedge clk_100mhz) ;
      din_en      = 1 ;
      #0.2 ;
      csn         = 1 ; //csn=1 时输出下降沿采集的数据
      //generate csn
      forever begin
         @(posedge clk_100mhz) ;
         #0.2 ;         //增加些许延迟确保数据采集正确
         csn = 0 ;      //csn=0 时输出上升沿采集的数据
         @(negedge clk_100mhz) ;
         #0.2 ;
         csn = 1 ;      //csn=1 时输出下降沿采集的数据
      end
   end

   always @(negedge clk_200mhz) begin
      din <= {$random()} % 8'hFF ;  //产生传输的随机数据
   end

   double_rate u_double_rate(
     .rstn      (rstn),
     .clk       (clk_100mhz),
     .csn       (csn),
     .din       (din),
     .din_en    (din_en),
     .dout      (dout),
     .dout_en   (dout_en));

   initial begin
      forever begin
         #100;
         if ($time >= 10000)  $finish ;
      end
   end

endmodule // test

前几个数据的仿真结果如下。

由图可知,数据传输正常,且速率为时钟频率的 2 倍。

本次只是对时钟双边沿传输数据进行简单的仿真,并不是仿真 DDR 的工作原理。DDR 双倍速率传输数据的工作原理远比此次仿真复杂的多。

但是一般情况下,不建议使用双边沿时钟逻辑,主要有以下几点原因。

always 块中,不能同时使用上升沿和下降沿作为敏感列表,也不能在 2 个always 块中为同一个变量赋值,例如下列描述就是错误的。虽然 RTL 编译可能不会报错,但也不能综合成实际电路。这就导致了信号间通信的难度。

   always @(posedge clk or negedge clk) begin

数据传输速率是数据时钟频率的两倍,如果使用时钟上升沿和下降沿逻辑进行 RTL 建模,则还需要翻转速率和时钟一致的片选信号;如果不使用片选信号,模块内应该引入数据时钟频率 2 倍的同源时钟信号,才可以正常对数据进行选择。

当使用的双边沿时钟逻辑之后,需要对上升沿和下降沿都进行合理的约束。时钟约束就会变得复杂,布局布线要求更加严格,调试难度增加。

使用时钟双边沿进行设计,要求时钟的质量很高,设计时钟树时也需要考虑众多因素。

本章节源码下载

Download

有关5.2 Verilog 时钟简介的更多相关文章

  1. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  2. Verilog使用inout信号的方法 - 2

    目录一、inout在设计文件中的使用方法1.1、inout的第一种使用方法1.2、inout实现的第二种使用方法1.3、inout使用总结 二、inout在仿真测试中的使用方法一、inout在设计文件中的使用方法在FPGA的设计过程中,有时候会遇到双向信号(既能作为输出,也能作为输入的信号叫双向信号)。比如,IIC总线中的SDA信号就是一个双向信号,QSPIFlash的四线操作的时候四根信号线均为双向信号。在Verilog中用关键字inout定义双向信号,这里总结一下双向信号的处理方法。1.1、inout的第一种使用方法  实际上,双向信号的本质是由一个三态门组成的,三态门可以输出高电平,低电

  3. IDEA 2023.1 正式发布,新特性简介 - 2

     昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA

  4. FPGA 之 时钟,时钟域, 以及复位系统的设计 - 2

    FPGA时钟和时钟域时钟树所谓时钟树为FPGA内部资源,分:全局时钟树,区域时钟树,IO时钟树原则上优先使用全局时钟树,在GT接口上使用IO时钟树,一般工具也会对GT时钟加以限制;时钟树使用方式正确的物理连接FPGA会由物理管脚专门用于全局时钟设置,通过查询数据手册可以在PCB设计阶段进行确认,当外部时钟接入此管脚时,工具会自动占有全局时钟树资源,当接入普通信号时不会分配时钟树资源;恰当的代码描述原语的使用,即BUFG的使用,可以将PLL的输出等内部时钟进行全局时钟资源的分配;IO时钟资源需要参考相应接口手册,以ultrascale的GTH为例,其JESD204的时钟方案针对不同的子类会由不同

  5. pytest简介 - 2

    介绍pytest是一个非常成熟的全功能的Python测试框架,主要有以下几个特点:简单灵活,容易上手支持参数化能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytest+requests)pytest具有很多第三方插件,并且可以自定义扩展,比较好用的如pytest-selenium(集成selenium)、pytest-html(完美html测试报告生成)、pytest-rerunfailures(失败case重复执行)、pytest-xdist(多CPU分发)等测试用例的skip和xfail处理可以很好的和jenkins集成

  6. 基于51单片机、DS1302时钟模块的电子闹钟设计 - 2

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录一、设计原理1.DS1302介绍2.闹钟音乐播放原理二、程序设计1.DS1302.h2.ds1302.c3.music.h4.main.c三、电路图四、运行结果1.proteus仿真2.开发板实验五、总结六、附件提示:以下是本篇文章正文内容,下面案例可供参考一、设计原理1.DS1302介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。该芯片采用普通32.768kHz晶振,DS1302工作时功耗很

  7. SpringCloud入门实战(七)-Hystrix入门简介 - 2

    📝学技术、更要掌握学习的方法,一起学习,让进步发生👩🏻作者:一只IT攻城狮。💐学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。💐学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。❤️《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。项目demo:源码地址👉🏻SpringCloud入门实战系列不迷路👈🏻:SpringCloud入门实战(一)什么是SpringCloud?SpringCloud入门实战

  8. ruby-on-rails - 在 Rails 5.2 中分离 secret_key_base? - 2

    我刚刚从5.1升级到5.2,我对这种“更好”的secret存储方法感到很困惑...也许我不明白,但现在开发和生产似乎已经“合并”到一个单一的SECRET_KEY_BASE以及master.key中......这是正确的吗?如果没有,我如何在开发中使用单独的主key和SECRET_KEY_BASE?如果我有开发人员帮助我并且我不想让他们知道我在生产中使用的主key(或secret)怎么办? 最佳答案 Rails5.2对此做了很大的改变。对于开发和测试环境,secret_key_base是自动生成的,因此您可以将其从secrets.ym

  9. ESP32学习笔记(七) 复位和时钟 - 2

    ESP32学习笔记(七)复位和时钟目录:ESP32学习笔记(一)芯片型号介绍ESP32学习笔记(二)开发环境搭建VSCode+platformioESP32学习笔记(三)硬件资源介绍ESP32学习笔记(四)串口通信ESP32学习笔记(五)外部中断ESP32学习笔记(六)定时器ESP32学习笔记(七)复位和时钟1.复位2.系统时钟2.1时钟树2.2时钟源从时钟树可以看出时钟源共七种ESP32的时钟源分别来自外部晶振、内部PLL或振荡电路具体地说,这些时钟源为:2.2.1快速时钟PLL_CLK320MHz或480MHz内部PLL时钟XTL_CLK2~40MHz外部晶振时钟,模组板载的是40MHz晶

  10. 最新2023年Kali Purple,紫色的带防御kali,简介和安装(超详细) - 2

    文章目录一,什么是kaliPurle(卡利紫)二,如何安装kaliPurple。(有步骤没图片直接是默认)1,复制它的下载链接到迅雷可以让你下镜像变得更快。2,打开你的虚拟机创建新的虚拟机3,点击后面浏览然后找到镜像的所在地选中确定,下一步4,这里默认就可以,因为Ubuntu和这个差不多架构。5,然后,名字自己改一下,然后把他安到你想要装的盘,容量默认。之后一直下一步就可以**6,打开它,然后第一个图形界面安装,直接回车,然后选中文点continue之后没有图片的直接点继续。7,密码想设什么设什么。然后一直继续到我的图片那里改一下就可以了。8,软件默认就行。9,耐心等待。然后点手动配置dvc然

随机推荐