【问题标题】:VHDL Gated Clock how to avoidVHDL门控时钟如何避免
【发布时间】:2015-06-22 20:47:11
【问题描述】:

我收到了避免使用门控时钟的建议,因为它可能会导致松弛和时序约束问题。但我想问一下我可以将什么视为门控时钟。 例如:

这个代码有门控时钟,因为 StopCount 门控它。

process(ModuleCLK)
begin
    if (rising_edge(ModuleCLK) and StopCount = '0') then
       if ModuleEN = '0' then
           RESET <= '0';
           POWER <= '1';
           EN <= '0';
           CLOCK <= '0';
           SERIAL <= '0';
       elsif

这段代码也有门控时钟?

    process(ModuleCLK)
    begin
        if ModuleEN = '0' then
               RESET <= '0';
               POWER <= '1';
               EN <= '0';
               CLOCK <= '0';
               SERIAL <= '0';
        elsif (rising_edge(ModuleCLK)) then

【问题讨论】:

    标签: vhdl clock fpga


    【解决方案1】:

    术语“门控时钟”通常用于 ASIC 技术中的时钟,其中时钟脉冲仅在条件为真 (1) 时生成,因此门控时钟是时钟源的属性。门控时钟可以用锁存器和与门制成,如下图所示,这种设计需要特别注意解决您提到的时序问题,因此不适合 FPGA 设计:

    您显示的代码使用触发器上的启用来根据启用更新触发器值,因此这是时钟启用,而不是门控时钟。

    第一个代码可以而且应该写成:

    process (ModuleCLK) is
    begin
        if rising_edge(ModuleCLK) then
            if StopCount = '0' then
                ...  -- Update at clock if StopCount = '0'
    

    这反映了设计在 FPGA 中的典型实现方式,其中触发器始终为时钟提供时钟 (ModuleCLK),但只有在条件 (StopCount = '0') 为真时才会更新输出。

    第二个代码示例看起来像异步重置,只是代码在敏感度列表中应该有重置条件(ModuleEN)(问题代码中缺少)。发生异步复位是因为触发器不需要时钟时钟来改变值;唯一的要求是复位条件为真,然后值的变化与任何时钟异步发生。

    因此,在 VHDL 中正确编写触发器,输入 a 和输出 z,如下所示:

    process (reset, clock) is
    begin
      if reset = '1' then
        z <= '0';
      elsif rising_edge(clock) then
        if enable = '1' then
          z <= a;
        end if;
      end if;
    end process;
    

    在 Altera Quartus II 中,这将创建 RTL 图:

    Arria II 器件中的实现如下:

    这表明触发器实际上在时钟的每个上升沿更新,因此时钟使能是通过组合设计(LUT)实现的,其中当前数据在使能时反馈给触发器false (0),或者当 enable 为 true (1) 时从 a 提供新数据。

    【讨论】:

    • 另外,第二个例子的敏感度列表中应该有ModuleEN
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    相关资源
    最近更新 更多