【问题标题】:Synchronous vs Asynchronous Resets in FPGA systemFPGA系统中的同步与异步复位
【发布时间】:2015-12-07 07:50:39
【问题描述】:

我不熟悉使用各种不同的模块创建 FPGA 系统来驱动 I2C 总线(尽管我认为这个问题适用于任何 FPGA 系统),并且这些模块都使用同步复位。

使用时钟分频器模块为模块提供时钟,该模块获取系统时钟并向系统的其余部分输出较低的频率。

我遇到的问题是,当复位信号变低时,时钟分频器复位,因此其他模块依赖的时钟停止 - 因此其他模块不会注册复位

一个明显的解决方案是进行异步复位,但是,在 Xilinx ISE 中,它似乎不喜欢它们,并发出警告说这与 Spartan-6 FPGA 不兼容(尤其是当异步之后的代码代码是同步的,这是因为 I2C 总线使用总线时钟将位放入总线)。

另一个解决方案是时钟分频器根本无法重置,因此时钟永远不会停止,所有模块都会正确重置。然而,这意味着时钟分频器寄存器无法初始化/重新初始化为已知状态 - 我被告知这将是一个大问题,尽管我知道您可以在模拟中使用 := '0'/'1'; 运算符,但这不起作用一旦在实际的 FPGA 上编程(?)。

同步复位的约定是什么?时钟发生器一般不复位吗?还是它们只在复位信号的瞬时边缘复位?或者我的建议都不是真正的解决方案!

我已经放了一个时序图和我的代码来说明我的意思,并展示我一直在使用的代码。

非常感谢!

大卫

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
library UNISIM;
use UNISIM.VComponents.all;
ENTITY CLK_DIVIDER IS
    GENERIC(INPUT_FREQ : INTEGER;
            OUT1_FREQ  : INTEGER;
            OUT2_FREQ  : INTEGER
    );
    PORT(SYSCLK  : IN  STD_LOGIC;
         RESET_N : IN  STD_LOGIC;
         OUT1    : OUT STD_LOGIC;
         OUT2    : OUT STD_LOGIC);
END CLK_DIVIDER;
architecture Behavioral of Clk_Divider is
    constant divider1 : integer   := INPUT_FREQ / OUT1_FREQ / 2;
    constant divider2 : integer   := INPUT_FREQ / OUT2_FREQ / 2;
    signal counter1   : integer   := 0;
    signal counter2   : integer   := 0;
    signal output1    : std_logic := '0';
    signal output2    : std_logic := '0';
begin
    output1_proc : process(SYSCLK)
    begin
        if rising_edge(SYSCLK) then
            if RESET_N = '0' then
                counter1 <= 0;
                output1  <= '1';
            else
                if counter1 >= divider1 - 1 then
                    output1  <= not output1;
                    counter1 <= 0;
                else
                    counter1 <= counter1 + 1;
                end if;
            end if;
        end if;
    end process;
    output2_proc : process(SYSCLK)
    begin
        if rising_edge(SYSCLK) then
            if RESET_N = '0' then
                counter2 <= 0;
                output2  <= '1';
            else
                if counter2 >= divider2 - 1 then
                    output2  <= not output2;
                    counter2 <= 0;
                else
                    counter2 <= counter2 + 1;
                end if;
            end if;
        end if;
    end process;
    OUT1 <= output1;
    OUT2 <= output2;
end Behavioral;

【问题讨论】:

  • 异步重置为时钟分频器,并为其他所有内容进行同步重置(可能在 clkdiv 中从异步中创建)。
  • 好的 - 这是否意味着在异步复位期间有一个备用时钟频率输出,以便同步模块仍然注册复位?
  • 没有。重置 clkdiv 会启动一个进程(计数器或简单 SM),该进程会在 clkdiv 重置并再次运行后生成重置。
  • 啊,我明白了 - 太棒了 - 所以 clkdiv 被重置,并且在被释放后,断言它自己的重置输出,它可以保持任意数量的时钟周期?
  • 就是这样。它允许变化,例如等待几个周期,然后断言,然后保持几个周期。但如果您使用多个时钟,请认真考虑 Morten 的建议。

标签: asynchronous vhdl reset clock xilinx


【解决方案1】:

不要使用用户逻辑生成内部时钟,但如果确实需要多个时钟,请使用设备特定的 PLL/DCM。然后,在派生时钟上运行的所有用户逻辑都应保持在复位状态,直到时钟稳定,然后可以根据设计要求释放用户逻辑的复位。可以使用同步复位或异步复位。

但在这种情况下,可能会生成一个时钟使能信号,并在每次需要更新信号以生成所需的任何协议时,将这个使能信号断言一个周期,例如具有适当时序的 I2C 协议。

使用更少的时钟,结合同步时钟使能信号,使Static Timing Analysis (STA) 的设置更容易,并且还避免了重置同步和Clock Domain Crossing (CDC) 的问题。

【讨论】:

  • 我会这样做 - 但问题是,我需要在 200 MHz 和 10 Hz 之间切换这个频率 - 时钟向导 DCM 只低至 3 MHz
  • 对于 10 MHz 时钟的每 100 万个周期置位一次的时钟使能信号可提供 10 Hz 的有效更新速率。
  • 好的 - 但这是否意味着不再有 50% 的占空比?
  • I2C SCL 时钟只是像控制信号一样生成,使用高频基本时钟仍然可以使用适当的时钟使能更新来生成一个不错的 50% 占空比 SCL。
  • 您对我该如何做有什么建议吗?我环顾四周,但我看到的所有使用 CE 的示例都会生成脉冲序列,而不是 50% 的方波
【解决方案2】:

在这样的系统中处理重置的稳健方法如下:

在 Xilinx FPGA 中使用 DCM/PLL/MMCM 来处理输入系统时钟并生成您需要的所有输出时钟频率,请记住,对于非常低的频率,您应该使用时钟管理器规范内的时钟,并且生成一个时钟使能信号与它一起使用。这可以在启动时从主机系统重置,或者如果在任何时候输入时钟被删除然后重新应用。

当时钟管理器处于复位或锁定到输入的过程中时,反转来自时钟管理器的 LOCKED 信号以生成高电平有效复位。这应该通过 SRL16 或 SRL32 来延迟它。此 SRL 在通过 BUFG 放入全局时钟布线后,应与 PLL 的输出一起计时。在 SRL 之后使用额外的触发器来改进时序。然后,该信号可用作高电平有效同步复位,以在器件中需要它的其余逻辑中使用。

如果您在时钟使能信号上出现时序错误,因为它是高扇出网络,也可以通过 BUFG 访问快速全局时钟网络以改善时序。

【讨论】:

    【解决方案3】:

    @斯图尔特·维维安

    (这应该作为评论发布,但我没有足够的声誉点这样做,对此感到抱歉)

    考虑使用计数器而不是移位寄存器来延迟重置,因为如果在加载比特流后未清除 LUT 内容(某些 FPGA 系列具有这种行为),重置信号可能会反弹,从而导致不可预知的结果。

    【讨论】:

      猜你喜欢
      • 2017-11-30
      • 1970-01-01
      • 2014-01-05
      • 2023-04-07
      • 1970-01-01
      • 2015-02-23
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多