//我们需要做的就是让sel_sclk1和sel_slck2信号不能同时有效。
module test(
input wire sclk1 ,
input wire sclk2 ,
input wire rst_n ,
input wire sel ,
output wire clk_out
);
reg sel_sclk1;
reg sel_sclk2;
//复位之后依据sel状态选择一个信号
always@(posedge sclk1 or negedge rst_n)//注意上升沿或者下降沿
if(rst_n ==1'b0)
sel_sclk1 <=1'b0;
else
sel_sclk1 <= sel &~sel_sclk2;//等待sel_sclk2无效再选择sel_sclk1
always@(posedge sclk2 or negedge rst_n)
if(rst_n ==1'b0)
sel_sclk2 <=1'b0;
else
sel_sclk2 <=~sel &~sel_sclk1;//等待sel_sclk1无效再选择sel_sclk2
assign clk_out =(sel_sclk1 & sclk1)|(sel_sclk2 & sclk2);
endmodule

我们可以观察到sel_sclk1信号在sclk1时钟域产生,需要取反后再和sel信号相与到sclk2时钟域,这样会出现跨时钟域问题产生亚稳态现象,所以我们可以在sclk2时钟域多加一级寄存器通过打拍的方式处理亚稳态问题(sel_sclk2信号同理)。
参考
时钟切换逻辑 glitch free_时钟信号的翻转和逻辑cell-CSDN博客
求职攻略| 异步电路中的时钟无毛刺切换(Glitch-Free)
glitch-free的两个时钟切换电路_两路时钟选择-CSDN博客
无毛刺的时钟切换电路(Glitch-free clock switching circuit)设计(Verilog)_verilog无毛刺时钟切换电路-CSDN博客
本文介绍了一种使用Verilog实现的无毛刺时钟切换电路设计方法。该设计通过控制两个选择信号sel_sclk1和sel_sclk2,确保在不同时钟源间进行平滑切换,避免了因信号竞争而产生的毛刺问题。此外,还讨论了如何通过增加额外的寄存器来解决跨时钟域问题导致的亚稳态现象。

1227

被折叠的 条评论
为什么被折叠?



