我正在研究一种设计,它应该检测两个不同频率的异步时钟的两个上升沿的第一次匹配。
类似这样的代码可能适用于模拟。
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
你需要 clk 3 的两倍快,否则你会得到混叠(查找 nyquist freq)
所以发生的事情是时钟域的第一个寄存器将是高电平,如果它刚刚变高,那么第二个寄存器在那个周期内仍然是低电平。
无法在硬件中重现您描述的行为。这样做的原因是您准确地比较了时间。
首先,您需要解释“检测两个上升沿的第一个匹配”是什么意思。鉴于两个异步时钟具有可变(且不可预测)的相位关系,检测同时边缘的任务(通常)将根据“同时”的时间来说明。
例如:检测上升沿何时间隔最多 5ns。
顺便说一句,我在这里假设所讨论的两个频率都是已知的。
请更详细地描述您的问题。
编辑: 这个问题变成了硬件问题,与 Verilog 无关。目前尚不清楚这里提出的任何解决方案是否可行(我个人认为它们不会)。我在EE Stack Exchange上提交了同样的问题——这是一个 HW 问题的地方,在那里得到回答的可能性更高。
太成功了,先做双边双时钟触发器。从双时钟 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);
双沿触发器和双时钟触发器不是常见的设计实践。需要进行过多的时序分析,并且工具可能会抱怨该单元。此外,需要采取措施使专利使用符合法律规定。