芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 10687|回复: 3

【个人笔记】小梅哥FPGA时序约束学习笔记

[复制链接]
  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 428

    主题

    811

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    16107
    QQ
    发表于 2019-4-13 14:20:14 | 显示全部楼层 |阅读模式
    时序约束的主要内容包括:
    时钟约束
    1、创建一个50M时钟的约束
    1. create_clock -name clk50 -period 20.000 [get_ports {Clk}]
    复制代码
    2、创建PLL的时钟
    1. create_generated_clock -name {TFT_test_pll|altpll_component|auto_generated|pll1|clk[0]} -source [get_pins {TFT_test_pll|altpll_component|auto_generated|pll1|inclk[0]}] -duty_cycle 50.000 -multiply_by 9 -divide_by 50 -master_clock {Clk} [get_pins {TFT_test_pll|altpll_component|auto_generated|pll1|clk[0]}]
    复制代码
    上面的方法,是在timequest timing analyzer中使用derive_pll_clocks命令创建的pll的时钟,该命令会被timequest timing analyzer使用create_generated_clock命令展开,以完成对所有PLL时钟信号的约束,该方法有以下弊端:
    • 生成的时钟命名太长,不易手动写命令方式进行某些约束时使用
    • 每次更改了PLL的输出设置之后,需要修改约束命令中的参数(乘除法因子,相位等)

    针对上述问题,根据不同的使用需求,可以有以下几种解决办法:
    • 如果整个系统只是需要约束时钟信号,没有其他约束(io约束、多时钟域分组约束等)需求,可以接受上述方式,因为后续基本不会用到这些时钟的名称,没有影响

    • 如果对这些时钟信号的命名有要求,希望尽量简洁,或者能够代表一定的物理意义,建议采用timequest timing analyzer先生成约束,再手动修改sdc文件修改时钟命名的方式来实现。例如,对于上述命令,生成的TFT屏的驱动时钟信号,可以手动修改时钟名称。修改后的名称如下所示:
    1. create_generated_clock -name {Clk_TFT} -source [get_pins {TFT_test_pll|altpll_component|auto_generated|pll1|inclk[0]}] -duty_cycle 50.000 -multiply_by 9 -divide_by 50 -master_clock {Clk} [get_pins {TFT_test_pll|altpll_component|auto_generated|pll1|clk[0]}]
    复制代码

    生成时钟的名称为Clk_TFT、虽然生成时钟的命令还是很长,但是最起码生成的时钟的命名短了,而且也能代表一定的物理意义,知道是用于TFT屏驱动的时钟。

    • 上述方法还是不能很好的解决PLL参数变化之后,需要手动修改约束文件的问题,同a,如果对于pll的命名并没有太高要求,可以直接在SDC文件中使用derive_pll_clocks命令来完成所有时钟的约束,该命令在Quartus进行编译时会自动重新展开,创建每一个时钟信号。因此可以使用非常简单的命令直接创建所有pll的所有输出时钟约束。该命令如下:
    1. derive_pll_clocks
    复制代码


    IO约束












    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 428

    主题

    811

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    16107
    QQ
     楼主| 发表于 2019-9-1 18:43:47 | 显示全部楼层
    时钟约束
    生成时钟约束,约束sdram_clk这个引脚。
    create_generated_clock -name {clk_sdram} -source [get_pins {pll|altpll_component|auto_generated|pll1|clk[1]}] -master_clock {pll|altpll_component|auto_generated|pll1|clk[1]} [get_ports {sdram_clk}]


    输出延迟
    输出延迟,Latch clock为上面创建好的clk_sdram,模型为源同步模型。因此
    最大输出延迟,值为SDRAM的Tsu,不同的sdram器件这个值不一样,对于W9812G6KH-6,这个值为:1.5,见w9812g6kh-6.pdf的15页的Tas、Tds值。
    最小输出延迟,值为SDRAM的-Th,不同的sdram器件这个值不一样,对于W9812G6KH-6,这个值为:0.8,见w9812g6kh-6.pdf的15页的Tah、Tdh值。

    所以,对于SDRAM。输出最大延迟和最小延迟值分别为1.5和-0.8


    输入延迟

    输入延迟,Launch clock为上面创建好的clk_sdram,模型为非源同步模型。因此
    最大输入延迟,值为SDRAM的Tco(max) + 2*Tpcb = Tac + 2*Tpcb = 5.4+0.5*2=6.4
    最小输入延迟,值为SDRAM的Tco(min) + 2*Tpcb = Toh + 2*Tpcb = 3 + 0.5*2 = 4

    所以,对于SDRAM。输入最大延迟和最小延迟值分别为6.4和4

    多周期约束

    另外由于输入时,Launch clock edge 实际上是比Latch clock edge提前了-90度,因此如果不加多周期约束,软件会默认relationship只有Tclk * 0.25,既四分之一个周期,因此需要对从clk_sdram到fpga内部的SDRAM控制器工作时钟clk加入一个2周期的多周期约束,以使软件能够正确处理这个相位值。



    SDRAM建立时间和保持时间.jpg
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    9

    帖子

    65

    积分

    初级会员

    Rank: 3Rank: 3

    积分
    65
    发表于 2020-5-3 10:45:28 | 显示全部楼层
    为什么有时进行时序约束,加一个寄存器最大时钟运行频率反而会降低呢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-9-2 10:14
  • 0

    主题

    8

    帖子

    600

    积分

    高级会员

    Rank: 6Rank: 6

    积分
    600
    发表于 2023-12-28 09:07:47 | 显示全部楼层
    学习学习学习学习学习学习学习学习学习学习学习学习
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-11-21 22:27 , Processed in 0.172914 second(s), 37 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表