3

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

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

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

if (a=b) then some code.

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

4

3 回答 3

2

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

您需要做的是为每个 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 freq)

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

于 2013-06-14T08:43:57.073 回答
2

无法在硬件中重现您描述的行为。这样做的原因是您准确地比较了时间。

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

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

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

请更详细地描述您的问题。

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

于 2013-06-14T15:47:47.860 回答
1

太成功了,先做双边双时钟触发器。从双时钟 D 触发器专利 US6320442 B1开始。现在用双边 D 触发器专利 US5793236 A专利 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);

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

于 2013-06-20T00:02:50.830 回答