【问题标题】:Is this a valid way to code a VHDL async reset?这是编写 VHDL 异步复位的有效方法吗?
【发布时间】:2021-07-18 03:43:18
【问题描述】:

我收集了一些 VHDL 代码来维护它,其中包含以我不熟悉的方式编写的重置。我不确定它是否有效,而且我的模拟器(Modelsim)正在发出我没想到的警告。模式示例:

process(clk, reset_n)
begin
  if reset_n = '0' then
    counter <= (others=>'0');
  end if;
  if rising_edge(clk) then
    case state is
    when IDLE      =>
      if signal_a = signal_b then
        state <= DATA;
      end if;
    when DATA => 
      state <= IDLE;
    when others =>
    end case;
    if state = DATA then
      counter <= counter + 1;
    else
      counter <= (others => '0');
    end if;
  end if;
end process;

Modelsim 警告 statesignal_asignal_b“在进程中被读取但不在敏感列表中”。我不希望这样,因为它们在一个时钟块中,并且该过程对时钟很敏感。

这是异步重置的有效编码风格吗?我希望看到elsif rising_edge(clk),但请理解这会在此处与其他非重置信号(state)的混合导致问题。

【问题讨论】:

  • 与您的问题无关:变量状态未在您的代码中重置,这可能会导致将来出现问题。

标签: vhdl modelsim


【解决方案1】:

这种模式可能不会像您期望的那样运行,也可能不会合成(如果合成,它不会匹配代码)。

此代码具有覆盖重置的时钟。如果复位被置位('0'),那么计数器将被复位,但如果clk 正在运行,它将像reset_n'1' 一样运行。这是因为进程仅由敏感列表中的信号上的'event' 触发,因此仅当reset_n 更改为“0”时才会发生重置。这在 VHDL 中通常无关紧要,因为复位分支将具有比时钟更高的优先级。因此,如果它被计时,则采用复位分支。但是这里,因为复位的优先级较低,就好像reset_n 是一个下降沿时钟。

在实际硬件上,这是不同的。敏感度列表通常会被忽略,硬件是根据过程中的代码构建的。我希望这将无法构建,因为它会抱怨没有与模板匹配的逻辑,或者不允许双边触发器。

要解决此问题,请按照您的建议将时钟分支设为elsif,并且您还需要将state 添加到重置中以避免state 上的意外时钟启用,或者将重置移动到在进程的底部,它将正确覆盖时钟分配,并允许您在同一进程中混合使用重置和非重置寄存器。

【讨论】:

    猜你喜欢
    • 2014-12-17
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    相关资源
    最近更新 更多