如何在verilog中同时检测两个时钟(彼此异步)的posedge?

如何在verilog中同时检测两个时钟(彼此异步)的posedge?,verilog,digital-design,Verilog,Digital Design,我正在研究一种设计,该设计应该能够检测两个不同频率的异步时钟的两个上升沿的第一次匹配 类似这样的代码可能适用于模拟 fork @posedge clkA begin a=$time end @posedge clkB begin b=$time end join if (a=b) then some code. 这段代码可以用于模拟,但如果我想要一些可合成的硬件逻辑 我还可以使用什么?这一个有点棘手,但是如果你可以得到第三个时钟,它的速度是你需要检测的两个

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

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

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

if (a=b) then some code.
这段代码可以用于模拟,但如果我想要一些可合成的硬件逻辑
我还可以使用什么?

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

您需要做的是设置每个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
输入clk1,clk2'
...
注册clk1_输入,clk1_输出;
注册clk2_输入,clk2_输出;
电线clk1_posedge、clk2_posedge;
//在时钟值,你应该注册这一点,这样就不会干扰线抖动
始终@(posedge clk3)开始

clk1_in不可能在HW中重现您描述的行为。这样做的原因是,您可以准确地比较时间

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

例如:检测上升沿在时间上的间隔不超过5ns

顺便说一句,我假设这两个频率都是已知的

请更详细地描述你的问题

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

也要完成这一点,首先制作双边缘、双时钟触发器。从双时钟D触发器开始。现在用双边缘D触发器或双边缘D触发器替换子触发器。每项专利都有电路设计图

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

例如:

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);

双边缘触发器和双时钟触发器不是常见的设计实践。需要进行过多的时间分析,工具可能会抱怨电池。此外,需要采取措施确保专利使用符合法律。

他(或她)想知道何时两者同时达到高位,当然,在一定的容忍度内。你不需要知道频率,只要你能说你可以有一个独立的频率,它至少是最快频率的两倍,而且这些事情最好在评论部分询问,因为你没有提供答案。我在最初的问题中没有提到容忍。我看到他(或她)准确地比较了时间。我建议为问题添加更多细节,并提供了指导方针,但与此同时,答案是“这是不可能的”。为什么这不是答案?@VasiliyZukanov是正确的。正如有人问的那样,不可能做到原始海报想要做的事情。说边缘必须同时升高“当然有一定的公差”是不正确的,根本不清楚是否存在任何公差,更不用说合理的公差了。当有人问这样的问题时,最好的建议是这样的事情是不可能的。谢谢你的回答。这对我来说是个糟糕的设计,你能告诉我为什么你需要做这样的事情吗?无论你想去哪里,都可能有一种更好、更健壮的方法。非常有趣的技术,谢谢。如果没有过多的(模拟)模拟,就无法分析这些方案,然而,有一点似乎是可疑的:专利US6320442 B1电路的输出需要同步,这是显而易见的,但同步值会反馈给两个内部触发器(通过组合逻辑)。无论同步器使用哪种时钟,都会有一条异步反馈路径指向其中一个内部触发器,这可能是亚稳态的。这种亚稳态不会通过输出同步器传播,但会导致电路失去边缘。我遗漏了什么吗?嗯,我想我不是真的明白了,你介意再解释一下吗。谢谢老实说,我没有深入研究可能的亚稳态。我看到了反亚稳态电路和标题为“亚稳态降低触发器”的参考资料。第4至最后一段讨论了如何采取额外的亚稳态预防措施。设计中存在需要解决的风险。我甚至建议回顾一下为什么在异步时钟上检测匹配的正边缘是一项设计要求。@user2484982,我认为我们可能同意这是硬件问题,与Verilog无关。我在EE Stack Exchange上问了同样的问题。如果你对进一步的讨论感兴趣,你可以按照我的答案中的链接。