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

标签 verilog digital-design

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

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

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/

相关文章:

counter - "Warning C0007 : Architecture has unbound instances"问题!

module - verilog 看不到我的功能

SystemVerilog 中具有参数化元素数量的接口(interface)实例数组

verilog - vivado中工程模式和非工程模式的主要区别是什么?

verilog - 我可以在 verilog 中给零件选择有意义的名称吗?

verilog - 如何使用 don't cares 参数化 case 语句?

Verilog 在不改变内部状态的情况下对模块输出施加力

vhdl - 和 VHDL 中 n 位数组的所有元素