FPGA(Verilog)时钟无缝切换设计原理与验证
时钟切换基本模型,本文围绕“ 基本组合电路切换、解决前毛刺切换、解决后毛刺切换”三方面完成时钟无缝切换。
一、组合逻辑 时钟切换
组合逻辑切换,本质就是二选一多路器
如下图,CLK_SEL 0与1分别控制时钟CLK_A CLK_B输出。
组合逻辑输出只跟当前输入状态有关,CLK_SEL异步不可控导致输出毛刺或不可控亚稳态。
二、时序逻辑 时钟切换
时序逻辑能够去除亚稳态以及毛刺,那么,我们把CLK_SEL同步到对应时钟时域,看能否解决问题。
1.代码部分
module glitch_free(
CLK_A,
CLK_B,
RST_n,
CLK_SEL,
CLK_OUT
);
input CLK_A;
input CLK_B;
input RST_n;
input CLK_SEL;
output CLK_OUT;
//sync clk_sel to clka and clkb
reg sync_sel_a;
reg sync_sel_b;
always @(posedge CLK_A or negedge RST_n)
if(!RST_n)
sync_sel_a<=1'b1;
else
sync_sel_a<=CLK_SEL;
//sync clk_sel to clka and clkb
always @(posedge CLK_B or negedge RST_n)
if(!RST_n)
sync_sel_b<=1'b0;
else
sync_sel_b<=~CLK_SEL;
assign CLK_OUT