检测2个不同时钟的上升沿同步

时间:2016-06-03 08:24:46

标签: vhdl edge-detection electronics xilinx-ise

如何使用Xilinx软件在VHDL编程中检测2个不同时钟(不同频率)的上升沿同步?

主时钟频率为31.845 Mhz,另一个时钟频率为29.972 Mhz。因此,基本目标是在2个时钟的上升沿之间存在同步时触发动作。我们尝试使用触发器实现它,但我们只能实现Level同步,而不是Edge同步。

我们无法比较vhdl中IFWAIT等语句中2个不同时钟的上升沿,所以这是不可能的。

我们正在尝试使用计数器计数脉冲。为此,我们需要在发生边缘匹配时停止计数。我们正在尝试实施一种名为“Vernier Interpolation”的方法。

  1. 最初,我们使用了以下语句代码,但由于无法在IF语句中比较2个不同时钟(clk0,clk1)的上升沿,因此我们不得不将其删除。

    if(rising_edge(clk0)=rising_edge(clk1)) then wait;

  2. 然后我们尝试使用WAIT语句(wait until),但失败了。

  3. 然后我们尝试使用触发器和延迟电路(D触发器),但它导致了电平同步,而不是边缘同步。

2 个答案:

答案 0 :(得分:0)

首先,我不确定你为什么要这样做。你会得到的是两个时钟之间拍频的新时钟。

正确的方法是使用另一个时钟对两个时钟进行采样,该时钟至少是最高预期输入频率的两倍。您可以使用器件中的一个PLL生成更高的时钟。 x2是最小值。理想情况下使用比两个采样时钟都高得多的时钟。

记住VHDL不是一种语言,它是对真实硬件综合的描述。所以只说Rising_Edge(clk1)= Rising_Edge(clk2)不会使'软件'检测边缘。 Rising_Edge的所有功能都是告诉硬件将clk信号连接到触发器的时钟输入。

正确的解决方案是在一个由采样时钟计时的过程中对“时钟”进行采样,寻找边缘(边缘是两个不同的后续采样)然后在需要时对结果和锁存进行采样。

示例代码(未经测试,暂时没有时间)。

entity twoclocks is
 port (
    op : out std_logic;
    clk1 : in std_logic;
    clk2 : in std_logic;
    sample_clk : in std_logic);
end entity;


architecture RTL of twoclocks is

begin

process sample(sample_clock, clk1, clk2):
begin
    if rising_edge(sample_clock):
      clk1_d <= clk1;
      clk2_d <= clk1;
      if clk1_d != clk1 and clk2_d != clk2 then
        op <= '1';
      else
        op <= '0';
      end if;
    end if;
end process;

end architecture;

答案 1 :(得分:0)

您需要使用非常严格的时序约束来构建所需的游标插补器,因此您可能无法单独使用VHDL。您需要(很多)设备特定的资源位置和时间限制。

请查看the work by A.Aloisio et al.。 Aloisio及其同事使用特定的Xilinx延迟元件构建了一个游标插值器。

标准VHDL综合主要适用于寄存器传输级别描述。即时钟/同步逻辑。但是要比较这两个输入,您需要以两个频率的最小公倍数的频率对它们进行采样。对于31.845 MHz和29.972 MHz,这是一个惊人的954.458340 MHz,这是很多。我已经在FPGA逻辑中看到过这种速度。 ......但是我想你甚至可能需要加倍,因为奈奎斯特。也许FPGA逻辑现在可以处理2 GHz的开关速率。但我不确定。

有可能为此使用GT收发器,但由于这将是非标准使用这种收发器,因此可能很难实现。