1.版本說明
日期 | 作者 | 版本說明 |
---|---|---|
2025xxxx | 風釋雪 | 初始版本 |
2.概述
基于VIVADO時序約束,BUFGMUX多路時鐘選擇原語的設計
3.原語介紹
7系列FPGA/UltraSCale/UltraSCale+
BUFGMUX_CTRL BUFGMUX_CTRL_inst (.O(O), // 1-bit output: Clock output.I0(I0), // 1-bit input: Clock input (S=0).I1(I1), // 1-bit input: Clock input (S=1).S(S) // 1-bit input: Clock select);BUFGMUX #(.CLK_SEL_TYPE("SYNC") // ASYNC, SYNC) BUFGMUX_inst (.O(O), // 1-bit output: Clock output.I0(I0), // 1-bit input: Clock input (S=0).I1(I1), // 1-bit input: Clock input (S=1).S(S) // 1-bit input: Clock select);
4.使用場景
- 簡單舉例
時鐘使用兩個固定頻率晶振產生,經過IO口進入FPGA內部,通過BUFGMUX選擇作為全局時鐘驅動邏輯;
- 復雜舉例
時鐘使用兩個固定頻率晶振產生,經過IO口進入FPGA內部,通過BUFGMUX選擇MMCM源,
MMCM產生三路時鐘, 74.25(74.1758)、148.5(148.3516)、297(296.703),
經過2個BUFGMUX實現3選1的功能,然后作為全局時鐘驅動邏輯;
5.時序問題
當使用BUFGMUX的時候,VIVADO會分析兩個輸入時鐘之間的關系,會導致大量的時序錯誤,
但是實際情況,兩個輸入時鐘,并不會同時工作,不需要分析兩個時鐘之間的
6.時序設計
- create_generated_clock + set_clock_groups
create_generated_clock -name CLKI0 \-divide_by 1 \-source [get_pins INST_BUFGMUX/I0] \-master_clock [get_clocks -of_objects [get_pins INST_BUFGMUX/I0]] \[get_pins INST_BUFGMUX/O] -addcreate_generated_clock -name CLKI1 \-divide_by 1 \-source [get_pins INST_BUFGMUX/I1] \-master_clock [get_clocks -of_objects [get_pins INST_BUFGMUX/I1]] \[get_pins INST_BUFGMUX/O] -addset_clock_groups -logically_exclusive \-group [get_clocks -include_generated_clocks {CLKI0}] \-group [get_clocks -include_generated_clocks {CLKI1}]
- set_case_analysis
時序分析時,選擇頻率最高的一路時鐘,進行分析,其余路不分析
set_case_analysis 1 [get_pins INST_BUFGMUX/S]
7.實戰
- 代碼
genlock_clkwiz inst_genlock_clkwiz
(.clk_in1 ( VID_SYNCCLK_148M5_148M3516),.clk_out1 ( VID_SYNCCLK_297M_296M7032 ),.clk_out2 ( VID_SYNCCLK_74M25_74M1758 )
);BUFGMUX #(.CLK_SEL_TYPE("ASYNC")) BUFGMUX_GENLOCK_0
(.O ( VID_SYNCCLK_148M5_148M3516),.I0 ( LMH1983_CLK3_148M3516 ),.I1 ( LMH1983_CLK2_148M5 ),.S ( select_freq_en[0] )
);BUFGMUX #(.CLK_SEL_TYPE("ASYNC")) BUFGMUX_GENLOCK_1
(.O ( VID_SYNCCLK_OUT1 ),.I0 ( VID_SYNCCLK_74M25_74M1758 ),.I1 ( VID_SYNCCLK_148M5_148M3516),.S ( select_freq_en[1] )
);BUFGMUX #(.CLK_SEL_TYPE("ASYNC")) BUFGMUX_GENLOCK_2
(.O ( SDI_SYNCCLK ),.I0 ( VID_SYNCCLK_OUT1 ),.I1 ( VID_SYNCCLK_297M_296M7032 ),.S ( select_freq_en[2] )
);
- 約束
set_case_analysis 1 [get_pins inst_core/inst_genlock/BUFGMUX_GENLOCK_0/S]
set_case_analysis 1 [get_pins inst_core/inst_genlock/BUFGMUX_GENLOCK_1/S]
set_case_analysis 1 [get_pins inst_core/inst_genlock/BUFGMUX_GENLOCK_2/S]
- 約束前
- 約束后
時序正常!!!