【问题标题】:How to make startup process in VHDL如何在VHDL中制作启动过程
【发布时间】:2015-10-03 21:26:36
【问题描述】:

如何让进程在开机时只执行一次?
做一个按下reset按钮时执行的进程很容易,但是在不触reset按钮的情况下插入电源时如何让它运行呢?
在我的示例中,我想在启动时初始化 LCD,并且我需要在开始时向它发送一些命令,但是在依赖于诸如重置之类的某些信号的过程中我不需要它(假设没有重置按钮)。

【问题讨论】:

  • 您是否尝试使用默认值声明 FSM 的信号?
  • 我在这里不使用 FSM 方式……至少是明确的。
  • 你只需要一个FF。它在每个时钟周期初始化为1 并清除为0。当您不将此 FF 连接到复位时,除非您重新编程 FPGA,否则它将永远不会再次为1
  • @Paebbels,但是我在哪里检查呢?在所有流程之外,即只是在架构内部?我的意思是......它仍然会在每个周期运行

标签: vhdl fpga xilinx hdl intel-fpga


【解决方案1】:

状态(第一次运行)存储在单个 FF 中,用 '1' 初始化:

signal IsStartup : STD_LOGIC := '1';

无复位的FF进程:

process(clk)
begin
  if rising_edge(clk) then
    IsStartup <= '0';
  end if;
end process;

使用示例(FSM):

process(clk)
begin
  if rising_edge(clk) then
    if (Reset = '1') then
      State <= ST_RESET;
    else
      State <= NextState;
    end if;
  end if;
end process;

process(State, IsStartup)
begin
  NextState <= State;

  case State is
    when ST_RESET =>
      if (IsStartup = '1') then
        NextState <= ST_STARTUP;
      else
        NextState <= ST_IDLE;
      end if;
  -- ...
  end case;
end process;

【讨论】:

  • @ScienceSamovar:通常,您应该使用此方法仅在启动时自动生成复位,并让您的所有其他初始化逻辑由该复位信号触发。请记住,上电复位与时钟不同步,因此逻辑越复杂,违反建立/保持要求的风险就越大。
  • 这确实不能回答如何在不循环到顶部的情况下运行一次进程的问题。 OP 特别要求没有敏感列表。公平地说,这个问题将作者的设计问题与如何让 VHDL 进程只运行一次的具体问题混为一谈。
  • @RaySalemi 我不知道你读了什么,但不是 OPs 的问题......他的问题不在于进程只运行一次并且通过wait; 从模拟运行中被停用。此外,他还有一个综合问题,而不是模拟问题。
【解决方案2】:

只需使用没有敏感度列表的等待语句。

process
begin
   assignment <= "101";
   wait;
end process;

话虽如此,我建议您改为将其构建为状态机。

【讨论】:

  • 我理解正确吗,如果我们没有灵敏度列表,进程将具有时钟信号的“默认”灵敏度?并且等待语句会永远暂停它吗?它在功耗方面是否有缺点(我的意思是我猜芯片内部的等待是以某种方式实现的)。
  • 是的,可能是做FSM,似乎比暂停进程更合乎逻辑,我想我还是需要学习它:)
  • 敏感性列表和“等待”语句仅用于模拟,不用于综合
  • @maxy,您可能会将等待与之后混淆。关于敏感度列表……你是什么意思?它们用于合成。
  • @ScienceSamovar 不。见底部ics.uci.edu/~jmoorkan/vhdlref/waits.html;并且灵敏度列表被忽略用于合成,除了警告您您的模拟可能与您的合成不同,因为您忘记了一个信号。 (至少我是这么学的,也许事情已经改变了。)
猜你喜欢
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2015-09-26
相关资源
最近更新 更多