【问题标题】:How to detect the posedge of two clocks (asynchronous to each other) at the same time in verilog?如何在verilog中同时检测两个时钟(彼此异步)的位姿?
【发布时间】:2013-06-22 03:25:59
【问题描述】:

我正在研究一种设计,该设计应该检测两个不同频率的异步时钟的两个上升沿的第一次匹配。

类似这样的代码可能适用于模拟。

fork 
@posedge clkA 
begin 
    a=$time 
end 
@posedge clkB 
begin 
    b=$time 
end 
join 

if (a=b) then some code.

此代码可能适用于模拟,但如果我想要一些可综合的硬件逻辑 我还能用什么?

【问题讨论】:

  • 这在我看来是个糟糕的设计,你能说为什么你需要做这样的事情吗?可能有一种更好、更可靠的方法可以到达您想去的任何地方。

标签: verilog digital-design


【解决方案1】:

这有点棘手,但是如果您可以获得第三个时钟,其速度是您需要检测的两者之间最快时钟的两倍,并且可以接受一个周期的检测延迟(一个周期是参考到第三个时钟域)那么它是可能的。

您需要做的是为每个 clk 域设置寄存器,如下所示:

input clk1, clk2'

...

reg clk1_in, clk1_out;
reg clk2_in, clk2_out;

wire clk1_posedge, clk2_posedge;

//take in the clock value, you should register this so that way jitter on the line does not mess with it 
always@(posedge clk3)begin 
    clk1_in <= clk1;
    clk2_in <= clk2;
end 

always@(posedge clk3)begin
    clk1_out <= clk1_in;
    clk2_out <= clk2_in;
end 

//now you need to detect the posedge for each signal independently, you can use and and gate for this 
assign clk1_posedge = (~clk1_out && clk1_in);
assign clk2_posedge = (~clk2_out && clk2_in);

// now just and the two together 
assign pulse_detected = clk1_posedge && clk2_posedge

你需要 clk 3 的速度是两倍,否则你会得到混叠(查找 nyquist 频率)

所以发生的情况是时钟域的第一个寄存器将是高电平,如果它刚刚变高,那么第二个寄存器在该周期内仍将是低电平。

【讨论】:

    【解决方案2】:

    不可能在硬件中重现您描述的行为。原因是您比较时间准确

    首先,您需要解释“检测两个上升沿的第一个匹配”是什么意思。鉴于两个异步时钟具有可变(且不可预测)的相位关系,检测同时边缘的任务(通常)将根据“同时”的时间来说明。

    例如:检测上升沿何时间隔最多 5ns。

    顺便说一句,我在这里假设所讨论的两个频率都是已知的。

    请详细描述您的问题。

    编辑: 这个问题变成了硬件问题,与 Verilog 无关。目前尚不清楚这里提出的任何解决方案是否可行(我个人认为它们不会)。我在EE Stack Exchange 提交了同样的问题 - 这是一个硬件问题的地方,在那里得到回答的机会更高。

    【讨论】:

    • 他(或她)想知道两者何时同时走高,当然在一定的容忍范围内。而且你不需要知道频率只要你能说你可以有一个独立的频率至少是最快频率的两倍
    • 由于您没有提供答案,因此最好在 cmets 部分询问这些问题。
    • 我在原始问题中没有看到任何关于容忍的提及。我看到他(或她)准确地比较了时间。我建议在问题中添加更多细节并提供指导,但与此同时,答案是“不可能”。为什么这不是一个答案?
    • @VasiliyZukanov 是正确的。正如被问到的那样,不可能做原始海报想要做的事情。说边缘必须同时升高“当然有一定的公差”是不正确的,根本不明显存在任何公差,更不用说合理的公差了。当有人问这样的问题时,最好的建议是这样的事情是不可能的。
    • 感谢大家的回复。
    【解决方案3】:

    太扯了,先做双边双时钟触发器。从双时钟 D 触发器 Patent US6320442 B1 开始。现在用双边 D 触发器 Patent US5793236 APatent US5327019 A 替换子触发器。每项专利都有电路设计图。

    使用自定义触发器,创建一个对时钟历史进行采样的小型管道。寻找从零到一的过渡。

    例子:

    wire [1:0] historyA, historyB;
    // dualedge_dualclock_dff     ( output Q, input D, clkA, clkB, rst_n)
    dualedge_dualclock_dff dedc_histA1( .Q(historyA[1]), .D(historyA[0]), .* );
    dualedge_dualclock_dff dedc_histA0( .Q(historyA[0]), .D(clkA), .* );
    dualedge_dualclock_dff dedc_histB1( .Q(historyB[1]), .D(historyB[0]), .* );
    dualedge_dualclock_dff dedc_histB0( .Q(historyB[0]), .D(clkB), .* );
    
    wire dual_posedge_match = ({historyA,historyB} == 4'b0101);
    

    双沿触发器和双时钟触发器不是常见的设计实践。需要进行过多的时序分析,并且工具可能会抱怨该单元。此外,需要采取措施使专利使用符合法律规定。

    【讨论】:

    • 非常有趣的技术,谢谢。没有过多的(模拟)仿真就无法分析这些方案,然而,有一点似乎可疑:专利US6320442 B1电路的输出需要同步,这是显而易见的,但同步值反馈到内部翻牌(通过组合逻辑)。无论您的同步器使用哪个时钟,都会有异步反馈路径到内部触发器之一,这可能会进入亚稳态。这种亚稳态不会通过输出同步器传播,但会导致电路丢失边沿。我错过了什么吗?
    • 嗯,我想我并没有真正关注这个,你介意再解释一下吗。谢谢!
    • 老实说,我并没有深入研究可能的亚稳态。我看到了抗亚稳态电路和对Patent US6531905 的题为“降低亚稳态的触发器”的引用。第 4 段到最后一段讨论了如何为亚稳态采取额外的预防措施。设计中存在需要解决的风险。我什至建议回顾一下为什么在异步时钟上检测匹配的上升沿是设计要求。
    • @user2484982,我认为我们可能同意这是硬件问题,与 Verilog 严格无关。我在 EE Stack Exchange 上问过同样的问题。如果您有兴趣进一步讨论,可以点击我回答中的链接。
    猜你喜欢
    • 2013-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    相关资源
    最近更新 更多