xilinx FPGA时钟二选一

通常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开发环境下,如果使用到时钟二选一的场景,如何对时钟进行约束有如下说明。

 

通常来讲,时钟二选一之后会驱动部分时序元件,也就是两个时钟具有重复时钟路径。如下图的例子。

xilinx FPGA时钟二选一_第1张图片

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 表示不可能同时
通过。按照我的理解,频率稍高的一路时钟需要约束为-master_clock

你可能感兴趣的:(FPGA,Xilinx)