Skip to content

(实习准备)学习 FPGA 中如何进行时序约束。

问题建立

为什么需要时序约束?

满足电路的建立时间和保持时间,但是我们设计的RTL代码时不包含时序信息的。

如何分析电路的时序?

时序电路:建立时间、保持时间

组合逻辑:恢复时间、撤销时间

以下面的电路为例:

image-20230322203625779

访问的时序图如下:

image-20230322203752758

对于同步时钟连接到的两个触发器,由于布线的长短不同,时钟沿到达不同触发器的时间是有差异的。

符号定义 : 建立时间余量 Tsu_slack,保持时间余量Thd_slack,时钟周期T, 建立时间Tsu,保持时间Thd,组合逻辑延迟Tdelay,逻辑门传输延迟Tco,时钟偏斜1Tclk1,时钟偏斜2Tclk2

建立时间余量计算为:

Tsu_slack=T+Tclk2Tsu(Tclk1+Tco+TDelay)

保持时间余量为:

Thd_slack=T+Tclk1+Tco+Tdelay(T+Tclk2+Thd)=Tclk1+Tco+TdelayTclk2Thd

**建立时间余量Tsu_slack是和时钟周期有关的,保持时间余量Thd_slack和时钟周期没有关系。**也就是说时钟的频率会影响建立时间余量。

真正在设计中,我们能够影响的就是有组合逻辑延迟Tdelay

VIVADO约束

时序约束并不会对电路产生任何实质性的作用,只是可以辅助设计出正确的电路。

约束类型:

  1. 物理约束:I/O约束
  2. 时钟约束

VIVADO在做时序分析时,的默认条件:

  1. 默认所有时钟都是有关系的,都是同步的,都做时序分析。如果有异步时钟,则需要进行异步时钟约束

时钟类型的区分:如果使用到 DDR,PCI-E,GT接口,往往都需要多个时钟源

  1. 同步时钟:是指频率和相位有一定关系的时钟。大部分情况下来自同一个 时钟源
  2. 异步时钟:与同步时钟定义相反的时钟,来自不同的时钟源

在设计高速系统的时钟很容易发生时序违例(Timing Violation)。

时序违例指的是FPGA设计中某些信号到达目标寄存器或逻辑单元的时间超过了其允许的最大延迟,从而导致电路功能异常或无法正常工作。在FPGA设计过程中,时序违例通常是由时钟频率过高、复杂逻辑路径、布线不当等因素引起的。为避免时序违例,需要进行时序分析、时序约束设置、合理的优化布局等措施。

时钟约束的类型以及创建步骤

  1. 源时钟约束

    告诉VIVADO当前的系统的输入时钟,以便VIVADO 进行建立时间和保持时间余量的分析。

    创建源时钟约束步骤:

    • 综合并布局布线
    • 点击 IMPLEMENTATION下面的Edit timing Constraints在Clock 中选择 Create Clock
    • 创建时钟,制定时钟的周期、上升沿时钟、下降沿时间
    • 生成 时钟约束语句,并添加到XDC约束文件中
  2. 衍生时钟约束

    1. 自定义的时钟:例如自己写的倍频,分频,需要自己约束,选择创建时钟约束窗口中的Create Generated Clock
    2. 自动生成的时钟:使用自带的PLL 或者 MMCM IP 自动生成的时钟,这种情况是不需要自己进行约束的,VIVADO 会自动处理生成约束。
  3. 异步时钟约束

    在VIVADO中声明那些是异步时钟,创建步骤:

    • 选择Create Clock group
    • 有多少个异步时钟就有多少个 组
    • 选择 时钟的关系为 asyncchronous
  4. 互斥时钟

    两个不会同时使用的时钟, 跟创建异步时钟步骤一致,只是时钟关系选择为 Logic exclusive 或者 physically exclusive

进阶问题

  1. CDC跨时钟域约束

最新更新: