VHDL门控时钟如何避免

VHDL Gated Clock how to avoid

我收到了避免门控时钟的建议,因为它可能会导致松弛和时序约束问题。但是我想问一下我可以考虑像门控时钟。 例如:

此代码已对时钟进行门控,因为 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

术语 "gated clock" 通常用于 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)(问题代码中缺少)。由于触发器改变值不需要时钟时钟,因此发生异步复位;唯一的要求是复位条件为真,然后值的变化与任何时钟异步发生。

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

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 器件中的实现是:

这表明触发器up实际上在时钟的每个上升沿更新,因此时钟使能是通过组合设计(LUT)实现的,其中当前数据反馈到触发器启用为假 (0),或者当启用为真 (1) 时 a 给出新数据。