FPGA QuartusII时钟约束Word文件下载.docx
《FPGA QuartusII时钟约束Word文件下载.docx》由会员分享,可在线阅读,更多相关《FPGA QuartusII时钟约束Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
![FPGA QuartusII时钟约束Word文件下载.docx](https://file1.bdocx.com/fileroot1/2022-11/23/d12001ab-4bca-4c46-bda2-dea025411168/d12001ab-4bca-4c46-bda2-dea0254111681.gif)
指定时钟上升沿/下降沿
可以对一个时钟节点进行多个时钟约束
指定你要约束的时钟(目标节点)
Example6–3约束时钟频率100MHz,占空比50%,0ns上升沿,5ns下降沿。
Example6–3.100MHzClockCreation
create_clock–period10–waveform{05}clk
Example6–4和上例相差90度的相位。
Example6–4.100MHzShiftedby90DegreesClockCreation
create_clock–period10–waveform{2.57.5}clk_sys
使用create_clock命令约束时钟缺省的sourceLatency值为0。
QuartusIITimeQuestTimingAnalyzer自动为非虚拟时钟(non-virtualclocks)计算时钟网络延时(clock’snetworklatency)。
QuartusIIHandbook,Volume36-29
生成时钟(GeneratedClocks)
QuartusIITimeQuestTimingAnalyzer可以把修改或改变主时钟(或者引入时钟)特性的分频时钟、波纹时钟和电路作为生成时钟。
你可以定义这些电路的输出作为生成时钟。
这些定义可以让QuartusIITimeQuestTimingAnalyzer分析这些时钟以及关联的时钟网络延时(networklatency)。
使用create_generated_clock命令定义生成时钟。
Example6–5.create_generated_clockCommand
create_generated_clock
-source<
masterpin>
[-edges<
[-edge_shift<
shiftlist>
[-divide_by<
factor>
[-multiply_by<
[-duty_cycle<
percent>
[-invert]
[-master_clock<
clock>
[-phase<
phase>
[-offset<
offset>
Table6–7.create_generated_clockCommandOptions
-name<
生成时钟名
指定被设定的时钟节点
-edges<
|
-edge_shift<
-edges指定和主时钟的上升沿和下降沿有关的新的上升沿和下降沿
-divide_by<
-multiply_by<
-divide_by和-multiply_by要素是基于第一个时钟上升沿,通过<
设定来延长或者缩短指定要素的波形
-duty_cycle<
指定生成时钟的占空比
-add
允许你对同一个管脚添加多个时钟约束
-invert
-master_clock<
用于主管脚上有多个时钟存在时指定一个主时钟
-phase<
指定生成时钟的相位
-offset<
指定生成时钟的偏移
指定被分配到的目标管脚
源延时是由于从主时钟(不一定是主管脚)开始的时钟网络延时所致。
你可以使用set_clock_latency–source命令约束源延时。
Figure6–17展示了如何产生一个基于10ns时钟的反向生成时钟:
Figure6–17.GeneratinganInvertedClock
create_clock-period10[get_portsclk]
create_generated_clock-divide_by1-invert-source[get_registersclk]\
[get_registersgen|clkreg]
Figure6–18展示了如何使用-edges和-edge_shift选项以改变生成时钟。
Figure6–18.EdgesandEdgeShiftingaGeneratedClock
create_clock-period10-waveform{05}[get_portsclk]
#Createsadivide-by-tclock
create_generated_clock-source[get_portsclk]-edges{135}[get_registers\
clkdivA|clkreg]
#Createsadivide-by-2clockindependentofthemasterclocks’dutycycle(now50%)
create_generated_clock-source[get_portsclk]-edges{115}-edge_shift{02.50}\
Figure6–19展示了-multiply_by选项对生成时钟的影响。
Figure6–19.MultiplyingaGeneratedClock
create_clock-period10-waveform{05}[get_portsclk]
#Createsamultiply-by-2clock
create_generated_clock-source[get_portsclk]-multiply_by2[get_registers\
QuartusIIHandbook,Volume36-32
虚拟时钟VirtualClocks
虚拟时钟是一个在设计中没有真正源或者说与设计没有直接关系的一个时钟。
例如,如果一个时钟不是设计中的时钟,而仅仅作为一个外部器件的时钟源,并且外部器件和该设计有输入或者输出的管脚,那么就认为这个时钟是虚拟时钟。
使用create_clock命令创造一个虚拟时钟,对源选项没有指定值。
你可以使用set_input_delay和set_output_delay约束虚拟时钟。
Figure6–20展示了QuartusIITimeQuestTimingAnalyzer若要正确的分析外部寄存器和内部设计逻辑之间的关系,在何处需要设置虚拟时钟的实例。
虽然名为virt_clk的晶振没有和Altera器件直接相互作用,但是担当起了外部寄存器的源时钟的角色,所以时钟virt_clk必须申明。
Example6–6展示了定义一个周期10ns,名为virt_clk,50%占空比,上升沿在0ns的虚拟时钟的命令。
虚拟时钟用于作为输出延时约束的时钟源。
在你产生虚拟时钟之后,你可以执行register-to-register的分析报告(在Altera器件和外部器件的寄存器之间)。
Example6–6.虚拟时钟Example1
#createbaseclockforthedesign
create_clock-period5[get_portssystem_clk]
#createthevirtualclockfortheexternalregister
create_clock-period10-namevirt_clk-waveform{05}
#settheoutputdelayreferencingthevirtualclock
set_output_delay-clockvirt_clk-max1.5[get_portsdataout]
Example6–7展示了产生一个周期为10ns,占空比为50%,相移90度虚拟时钟的命令。
Example6–7.VirtualClockExample2
create_clock-namevirt_clk–period10–waveform{2.57.5}
QuartusIIHandbook,Volume36-33
多频时钟Multi-FrequencyClocks
某些情况下在设计中会有很多个时钟源提供时钟信号。
增加的时钟也许扮演一个低频率低功耗时钟的角色。
在分析这种设计时,create_clock命令提供了–add选项让你添加多个时钟节点。
Example6–8展示了时钟周期为10ns的节点clk,然后对同一个节点添加时钟周期为15ns的时钟。
QuartusIITimeQuestTimingAnalyzer在执行时序分析时两个时钟都用到了。
Example6–8.Multi-FrequencyExample
create_clock–period10–nameclock_primary–waveform{05}[get_portsclk]
create_clock–period15–nameclock_secondary–waveform{07.5}[get_portsclk]-add
QuartusIIHandbook,Volume36-34
自动时钟检测AutomaticClockDetection
想要为你的设计中所有的时钟节点自动添加时钟约束,那么就使用derive_clocks命令。
这个命令从管脚或者寄存器生成时钟以确保设计中的每个寄存器都有时钟。
Example6–9展示了derive_clocks命令选项。
Example6–9.derive_clocksCommand
derive_clocks
[-period<
Table6–8describestheoptionsforthederive_clockscommand.
指定时钟周期,你也可以指定时钟频率如下:
num>
MHz
-waveform<
指定沿变化时刻
derive_clocks命令不能为PLLs输出时钟进行约束。
derive_clocks命令相当于使用create_clock命令为每个寄存器或者管脚产生时钟。
QuartusIIHandbook,Volume36-35
锁相环时钟DerivePLLClocks
PLLs(锁相环)在Altera器件中被用于时钟管理和综合。
你可以定制基于你设计需要的PLL输出时钟约束。
因为所有的时钟节点应该有一个共同的时钟基准,故所有的PLL输出应该有一个关联时钟。
你可以使用create_generated_clock命令手动添加一个作为PLL输出的基准时钟,或者你也可以使用derive_pll_clocks命令自动搜寻时序网表并通过设置指定PLL输出来产生时钟。
使用derive_pll_clocks命令为PLL输出自动产生时钟的实例如下:
derive_pll_clocks[-use_tan_name]
Table6–9.derive_pll_clocksCommandOptions
-use_tan_name
缺省下,时钟名为输出时钟名字。
这个选项使用的网络名字类似于在QuartusIIClassicTimingAnalyzer中使用的。
derive_pll_clocks命令调用create_generated_clock命令以产生PLL输出的生成时钟。
create_generated_clock命令的source是PLL的输入时钟。
derive_pll_clocks命令的前后已固定,你必须手动为PLL生成一个输入时钟节点。
如果PLL的输入时钟节点未被定义好,报告中不会出现PLL输出的时钟。
取而代之的,当时序网表更新后,QuartusIITimeQuestTimingAnalyzer发出一个类似于Figure6–10的警告信息。
Example6–10.WarningMessage
Warning:
Themasterclockforthisclockassignmentcouldnotbederived.
Clock:
<
nameofPLLoutputclockpinname>
wasnotcreated.
你可以把derive_pll_clocks命令添加到你的SDC文件中,以使得derive_pll_clocks命令可以自动检测PLL的任何变化。
derive_pll_clocks在你的SDC文件中,每次读取该文件,PLL输出时钟脚的create_generated_clock命令就将生成。
如果在derive_pll_clock命令后使用write_sdc命令,新的SDC文件包含了独立的PLL输出时钟管脚的create_generated_clock命令,并且不是derive_pll_clocks命令。
任何PLL属性的变化不会自动的反应到新的SDC文件中。
你必须通过写入derive_pll_clocks命令手动更新新的SDC文件中的create_generated_clock命令(反映PLL的变化)。
通过添加适当的multicycle约束计算不确定因素,derive_pll_clocks将约束设计中的任何LVDS传送和LVDS接收。
例如,Figure6–21展示了一个寄存器到寄存器路径的单一PLL设计。
使用derive_pll_clocks命令自动约束PLL。
当Figure6–21的设计中使用到这个命令,将产生Example6–11的信息。
Example6–11.derive_pll_clocksGeneratedMessages
Info:
DerivingPLLClocks:
create_generated_clock-sourcepll_inst|altpll_component|pll|inclk[0]-divide_by2-name
pll_inst|altpll_component|pll|CLK[0]pll_inst|altpll_component|pll|clk[0]
名为pll_inst|altpll_component|pll|inclk[0]的节点用于作为PLL输入时钟脚的源参考选项。
此外,PLL输出时钟的名字是PLL输出时钟节点pll_inst|altpll_component|pll|clk[0]。
如果PLL处于时钟替换模式,PLL输出时钟将产生多时钟;
一个是主要输入时钟(例如inclk[0]),另一个是次要输入时钟(例如inclk[1])。
假若那样的话,你可以使用set_cock_groups命令加上-exclusive选项以削减主要和次要输出时钟。
在你可以为这个设计产生任何报告之前,你必须为PLL输入时钟管脚产生一个基本时钟,使用类似下面的命令:
create_clock-period5[get_portspll_inclk]
你不用在PLL的输入时钟管脚pll_inst|altpll_component|pll|inclk[0]上产生基本时钟。
PLL输入时钟管脚产生所有的扇出时钟管脚,包括PLL输入时钟管脚。
QuartusIIHandbook,Volume36-37
缺省时钟约束DefaultClockConstraints
为了提供彻底的时钟分析,如果你的设计中没有基本时钟约束,QuartusIITimeQuestTimingAnalyzer在缺省时会自动的检测所有未被约束的时钟节点。
QuartusIITimeQuestTimingAnalyzer使用以下命令产生1GHz的时钟约束你的未约束时钟:
derive_clocks-period1
独立的时钟约束(例如,create_clock,create_generated_clock)可能会出现在设计中。
这将导致不切实际的分析设计中的时序要求。
derive_clocks的使用应该避免出现在最终的时序里。
缺省时钟约束仅仅被用于QuartusIITimeQuestTimingAnalyzer检测所有没有时钟连接的同步单元。
例如,如果一个设计约束两个时钟,而仅有一个时钟已经约束了,这将不会使用缺省时钟约束。
然而,如果两个时钟都未被约束,那么将会启动缺省时钟约束。
ClockGroups
设计中存在着许多时钟,然而,并非所有时钟都相互关联,况且某些时钟间相互关联是没有必要的。
异步时钟就是不相关时钟(异步时钟有不同的理想时钟源)。
专用时钟也不一定在同一时刻激活(例如,多元时钟)。
必须向QuartusIITimeQuestTimingAnalyzer指明相互排斥的时钟,从而阻止其把这些时钟作为关联时钟进行分析。
使用set_clock_groups命令指明相互排斥或者异步的时钟。
Example6–12展示了set_clock_groups命令及选项。
Example6–12.set_clock_groupsCommand
set_clock_groups
[-asynchronous|-exclusive]
-group<
[-group<
]...
Table6–10describestheoptionsfortheset_clock_groupscommand.
-asynchronous
异步时钟——两个时钟没有相位关系并且不在同一时刻激活
-exclusive
专有时钟——两个时钟中仅有一个在特定时间激活。
2选1时钟就是专有时钟的一个实例
指定相互独有的时钟名。
用于指定时钟名
Example6–13展示了set_clock_groups命令和等价命令set_false_path的用法。
Example6–13.set_clock_groupsExample
#ClocksAandCareneveractivewhenclocksBandDareactive
set_clock_groups-exclusive-group{AC}-group{BD}
#Equivalentspecificationusingfalsepaths
set_false_path-from[get_clocksA]-to[get_clocksB]
set_false_path-from[get_clocksA]-to[get_clocksD]
set_false_path-from[get_clocksC]-to[get_clocksB]
set_false_path-from[get_clocksC]-to[get_clocksD]
set_false_path-from[get_clocksB]-to[get_clocksA]
set_false_path-from[get_clocksB]-to[get_clocksC]
set_false_path-from[get_clocksD]-to[get_clocksA]
set_false_path-from[get_clocksD]-to[get_clocksC]
QuartusIIHandbook,Volume36-39
影响时钟特性ClockEffectCharacteristics
create_clock和create_generated_clock命令产生不涉及板级影响的理想时钟。
这个章节描述如何计算影响时钟特性的时钟延时(clocklatency)和时钟不确定时间(clockuncertainty)。
时钟延时ClockLatency
时钟延时(clocklatency)由两部分组成:
源(source)和网络(network)。
源延时(Sourcelatency),是指从源时钟到目的时钟端的传播延时(例如,一个时钟端口),而网络延时(networklatency)是指从一个定义点时钟到一个寄存器时钟端口的传播延时。
寄存器时钟节点总的延时是时钟路径上源和网络延时之和。
set_clock_latency命令仅仅支持源延时。
当使用该命令时,-source选项需指定。
使用set_clock_latency命令指定设计中的任意时钟端口的源延时Example6–14展示了set_clock_latency命令选项。
Example6–14.set_clock_latencyCommand
set_clock_latency
-source
[-clock<
clock_list>
[-rise|-fall]
[-late|-early]
delay>
QuartusI