两个时钟域使能信号的同步,求助
always @(posedge clk2)
if()
begin
a1 <= 0;
a2 <= 0;
end
else begin
a1 <= en1;
a2 <= a1;
end
assign en2 = a1 & ~a2;
谢谢解答,但小弟不太明白,if()的控制信号是clk1还是?这里clk1和clk2的频率相差很大。
if() 里的是个复位信号,en1是你在CLK1产生的使能信号,en2是en1同步到CLK2的信号。CLK1,CLK2那个是高频?上面的适合于en1的脉冲宽度大于CLK2的周期的情况.
如果CLK1的频率是大于CLK2的话,完全做不了了
上述通过异步采样,然后生成脉冲的方式,至少保证CLK2的频率为CLK1的两倍
这种需求的确比较奇怪,按照2楼的做法确实只能保证高频采到低频的
你可以尝试一下把时钟ck1的数据收集起来,比如8个周期的EN信号寄存寄存到8bit寄存器里面,然后把寄存器同步到CK2时钟,最后用8bit寄存器控制产生EN2信号。
你可以考虑一下这个能否满足你的需求。
从CK1到CK1,由于频率不同,所以肯定无法保证时时的吧EN信号传过来
always @(posedge en1 or negedge reset)
if(reset)
q1 <= 0;
else q1 <= 1;
assign reset = ~en1 & q3;
assign en2 =q3;
always @(posedge clk2)
begin
q2 <= q1;
q3 <= q2;
end
这个适合en1的宽度小于clk2的情况,高频->低频
谢谢解答,目前也只能想出这样的办法了,一级D FF存储EN1,再经过一级同步到时钟CLK2,通过MUX, DEMUX输入输出时钟。但这样同步延时比较大,也想不出更有效的方法。
谢谢你耐心解答~ 这里CLK1和CLK2频率大小关系不定,所以比较纠结。
CLK1 和 CLK2的关系如何? 没看懂你的问题。如果 CLK1的en 是被同步到 CLK2 的话,肯定是相对 CLK2 要有延迟的
a1可能出现亚稳态?
q2可能出现亚稳态?
两个时钟都不定的东西无法做此类的同步吧
