使用Altera的altclkctrl可以实现时钟的动态切换或者降低局部时钟网络的功耗。生成altclkctrl IP核的过程简单,但是对时钟输入有一定的限制。如果需要切换多个时钟,那么inclk0x和inclk1x必须是FPGA的管脚直接输入,inclk2x和inclk3x必须是锁相环的输出作为输入,还必须是同一个锁相环的不同输出,如c0或c1。
my_altclkctrl my_altclkctrl_inst (
.clkselect( sync_clk_src_sel_r1[1:0] ),
.inclk0x( mfio0 ),//fpga_pin
.inclk1x( si5338_clk),//fpga_pin
.inclk2x( sys_clk100m),//inclk2和inclk3必须是同一个锁相环的输出
.inclk3x( sys_clk50m),
.outclk( clk_buf)
);
xilinx的原语如下:设计目的是在两个时钟输入之间切换而不会产生毛刺信号。
BUFGCTRL #(
.INIT_OUT(0), // Inital value of0 or 1 after configuration
.PRESELECT_I0("FALSE"), // "TRUE" or"FALSE" set the I0 input after configuration
.PRESELECT_I1("FALSE") // "TRUE" or "FALSE" set the I1 input afterconfiguration
)BUFGCTRL_inst (
.O(O), // 1-bit output
.CE0(CE0), // 1-bit clock enable 0
.CE1(CE1), // 1-bit clock enable 1
.I0(I0), // 1-bit clock 0 input
.I1(I1), // 1-bit clock 1 input
.IGNORE0(IGNORE0), // 1-bit ignore 0 input
.IGNORE1(IGNORE1), // 1-bit ignore 1 input
.S0(S0), // 1-bit select 0 input
.S1(S1) // 1-bit select 1 input
);