【问题标题】:Detecting rising edge synchronization of 2 different clocks检测 2 个不同时钟的上升沿同步
【发布时间】:2016-06-03 08:24:46
【问题描述】:

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

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

而且我们无法在 vhdl 中的 IFWAIT 等语句中比较 2 个不同时钟的上升沿,所以这是毫无疑问的。

我们正在尝试使用计数器对脉冲进行计数。为此,我们需要在边匹配发生时停止计数。我们正在尝试实现一种称为“游标插值”的方法。

  1. 最初,我们使用以下语句代码,但由于无法在 IF 语句中比较 2 个不同时钟(clk0、clk1)的上升沿,我们不得不放弃它。

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

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

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

【问题讨论】:

  • 您的总体目标是什么,时钟的频率范围是多少。
  • 有一个频率为 31.845 Mhz 的主时钟和另一个频率为 29.972 Mhz 的时钟。因此,基本目标是在 2 个时钟的上升沿之间存在同步时触发动作。我们尝试使用触发器来实现它,但我们只能实现 Level 同步,不能实现 Edge 同步。
  • 而且我们无法在 vhdl 中的 IF 和 WAIT 等语句中比较 2 个不同时钟的上升沿,所以这是没有问题的。
  • 当你说你正在寻找同步时,这里一定有一些宽容。您打算如何处理生成的信号?它是某种锁相环吗?这是问题本身真正应该包含的所有信息。
  • 我想不出一个明显的答案,但如果你编辑你的问题以包含来自你的 cmets 的信息,它可能会让其他人更容易理解问题,也许会出现有一个解决方案。

标签: vhdl edge-detection xilinx-ise


【解决方案1】:

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

执行此操作的正确方法是使用另一个时钟对两个时钟进行采样,该时钟至少是最高预期输入频率的两倍。您可以使用设备中的一个 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;

【讨论】:

  • ...可能存在相位偏移,需要确定;)否则你是对的。 :P 查找游标插值器。
【解决方案2】:

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

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

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

也许可以为此使用 GT 收发器,但由于这种收发器的非标准使用,可能很难实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2012-05-27
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多