通常Xilinx FPGA时钟二选一用如下原语实现,其中S为时钟选择输入,I0和I1为两路时钟输入,O为一路时钟输出。
BUFGMUX #(
)
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
);
BUFGMUX类似assign clkout = sel ? clkin1 : clkin0;这样一个功能,但是为什么不直接用assign语句呢?
因为用assign作二选一的话,会用到逻辑资源里的选择器,时钟信号会偏离全局时钟树进入选择器,这样可能会造成一些问题。
对于低速时钟可以考虑使用assign作切换,但是不建议这么做。高速时钟切换需要使用原语。在Vivado开发环境下,如果使用到时钟二选一的场景,如何对时钟进行约束有如下说明。
通常来讲,时钟二选一之后会驱动部分时序元件,也就是两个时钟具有重复时钟路径。如下图的例子。
clk125 和 clk250 是 clkcore_buf 的两个输入时钟,这两个时钟经过BUFGCTRL(在Xilinx 7系列FPGA中,直接使用BUFGMUX会消耗一个BUFGCTRL资源)后有重复时钟路径,针对这两个时钟做如下约束:
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 clk250
set_clock_groups –physically_exclusive \
–group clk125_bufgctrl \
–group clk250_bufgctrl
在clkcore_buf 的输出端上创建两个重叠的衍生钟,并将其时钟关系约束为 -physically_exclusive 表示不可能同时
通过。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/dimples_Song/article/details/81216527