gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:38:17 25 4
gpt4 key购买 nike

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

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

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 的速度是原来的两倍,否则会出现混叠(查找奈奎斯特频率)

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

关于verilog - 如何在verilog中同时检测两个时钟(彼此异步)的posege?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17102701/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com