FPGAVivadoXDC约束⽂件编写⽅式语法笔记
create_clock -name clk_in -period 10 -waveform{2.5 5} [get_ports clk_in]
# {2.5 5} 表⽰⼀个周期的波形中2.5ns - 5ns 为⾼。如果没有指定waveform默认为{0,period/2}为⾼
2.时钟clk_2由时钟clk_in衍⽣,clk_2频率为clk_in的频率除以2,clk_2表⽰modu_2模块的clk_out。
create_generated_clock -name clk_2 -source [get_port clk_in] -divide_by 2 [get_pins modu_2/clk_out]
# clk_in 0011001100110011001100
# clk_2 0011110000111100001111
3.时钟clk_3由时钟clk_in衍⽣,clk_3表⽰modu_3模块的clk_out。
create_generated_clock -name clk_3 -source [get_ports clk_in] -edges {1 3 5}[get_pins top/modu_3/clk_out]
# edges{1 3 5}表⽰从上升沿开始算起,在clk_in的第1、3、5时钟沿clk_3时钟沿变化。
# clk_in 001110011100111001110011100
# clk_3 001111100000111110000011111
4.设置clock group来确认各个时钟之间的关系。两个主时钟 clkin_1 和 clkin_2 进⼊ FPGA由不同的时钟⽹络传递,这两个时钟及他们的衍⽣时钟是⼀组异步时钟。
set_clock_groups -name async_clk -asynchronous \
-group [get_clocks -include_generated_clocks clkin_1] \
-group [get_clocks -include_generated_clocks clkin_2]
# -asynchronous 表⽰异步
# -include_generated_clocks 表⽰包括衍⽣时钟
5.有时同⼀模块在不同模式需要不同时钟来驱动。例如bufgctrl_i/O可由bufgctrl_i/I0和bufgctrl_i/I1衍⽣。
create_generated_clock -name clk125_bufgctrl \
-divide_by 1 [get_pins bufgctrl_i/O] \
-source [get_ports bufgctrl_i/I0]
create_generated_clock -name clk250_bufgctrl \
-divide_by 1 [get_pins bufgctrl_i/O] \
-source [get_ports bufgctrl_i/I1] \
-add -master_clock clk125_bufgctrl
# -add -master_clock表⽰添加时钟,否则是直接覆盖。
set_clock_groups –physically_exclusive \
–group clk125_bufgctrl \
–group clk250_bufgctrl
# -physically_exclusive 表⽰时钟物理意义上不会同时存在,如果为-logically_exclusive则是逻辑上独⽴。
⼆、引脚约束
1.将led1信号放在芯⽚的W13引脚
set_property PACKAGE_PIN W13 [get_port led1]
2.将led1所在引脚的电⽓标准设置为LVCMOS33:
set_property IOSTANDARD LVCMOS33 [get_ports led1]
3.将led1引脚上拉电阻约束为有效:
set_property PULLUP true [get_ports led1]
4.将led1引脚下拉电阻约束为有效:
set_property PULLDOWN true [get_ports led1]
5.IO的驱动能⼒不够导致线上的电平不能马上到达期望的波形,从⽽产⽣抖动。提⾼电源及时供给能⼒可以采⽤在芯⽚电源引脚周围加⼊较⼤电容储能。默认驱动能⼒为12mA。驱动能⼒有< 2 4 6 8 12 16 24 >mA。将led1所在管脚驱动能⼒设置为16mA:
set_property DRIVE 16 [get_ports led1]
6.输出(双向)引脚转换速率slew rate可以设置为快fast和慢slow。默认为slow。
将led1所在输出引脚转换速率设置为快:
set_property SLEW FAST [get_ports led1]
7.⾼速收发器通道位置约束
set_property LOC GTXE2_CHANNEL_X0Y8 [get_cells 例化路径/gtx_support_i/gtx_init_i/inst/gtx_i/gt0_gtx_i/gtxe2_i]
8.输⼊输出模块IOB的约束。(如果在FF输出Q除了到OBUF连线输出外还有其他连接,就⽆法实现IOB寄存器的布局,只能⽤CLB中的寄存器。需要将该信号再按时钟打⼀拍再单独输出。)
set_property IOB TRUE [get_ports led1]
# led1 输出使⽤IOB
set_property IOB TRUE [all_inputs]
# 所有输⼊使⽤IOB
generated三、注意事项
1.Vivado按照⾏序从上往下在约束⽂件中读取XDC的tcl指令,越后⾯的指令优先级越⾼,但描述越精确的指令优先级越⾼(与指令顺序⽆关)。相同⽬标属性的约束会向前覆盖。 因为synthesis and implementation algorithms are timing-driven⼀般把时钟约束放在前⾯物理位置约束放在后⾯。物理约束只在implementation时布局器与布线器会使⽤。
参考顺序:
Timing Assertions Section
Primary clocks
Virtual clocks
Generated clocks
Clock Groups
Input and output delay constraints
Timing Exceptions Section
False Paths
Max Delay / Min Delay
Multicycle Paths
Case Analysis
Disable Timing
Physical Constraints Section
2.⼀个Vivado⼯程中可以添加多个XDC⽂件,XDC⽂件也是有先后顺序的,可以在界⾯⽤⿏标拖拽来调整XDC⽂件的顺序。⼯程较⼤时⼀般把时钟约束和物理约束放到不同的⽂件当中,不同IP不同组放到不同⽂件。VIVADO也可以⽀持多组XDC⽂件集合,但是只有1个集合起作⽤(active)。如果我们⼀次create多个synthesis或者implementation,我们还可以为它们每⼀个分别制定⼀个约束⽂件。
3.每个XDC约束指令最好单独地完整地写⼀⾏(单个命令编写换⾏时⾏末加上"\")。 注释以“#”开头且与指令不写在同⼀⾏。否则指令可能会解析错误。
四、更多编写⽅式可查看Vivado的XDC编写模板
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论