如何在VHDL中创建启动过程

如何在VHDL中创建启动过程,vhdl,fpga,xilinx,hdl,intel-fpga,Vhdl,Fpga,Xilinx,Hdl,Intel Fpga,如何使进程在通电时只执行一次? 按下重置按钮时执行的过程很容易,但如何在不触碰重置按钮的情况下插入电源时使其运行? 在我的示例中,我想在启动时初始化LCD,并且我需要在开始时向它发送一些命令,但在依赖于某些信号(如reset)的过程中,我不需要它(假设根本没有reset按钮)。只需使用一个没有敏感度列表的wait语句即可 process begin assignment <= "101"; wait; end process; 过程 开始 赋值状态(第一次运行)存储在单个FF

如何使进程在通电时只执行一次?
按下重置按钮时执行的过程很容易,但如何在不触碰重置按钮的情况下插入电源时使其运行?

在我的示例中,我想在启动时初始化LCD,并且我需要在开始时向它发送一些命令,但在依赖于某些信号(如reset)的过程中,我不需要它(假设根本没有reset按钮)。

只需使用一个没有敏感度列表的wait语句即可

process
begin
   assignment <= "101";
   wait;
end process;
过程
开始
赋值状态(第一次运行)存储在单个FF中,并用“1”初始化:

signal IsStartup : STD_LOGIC := '1';
无复位的FF过程:

process(clk)
begin
  if rising_edge(clk) then
    IsStartup <= '0';
  end if;
end process;
过程(clk)
开始
如果上升沿(clk),则

IsStartup您是否尝试使用默认值声明FSM的信号?我这里不使用FSM方式。。。至少是明确的。你只需要一个FF。它在每个时钟周期初始化为
1
,并清除为
0
。当您不将重置连接到此FF时,除非您重新编程FPGA,否则它将永远不会再次成为
1
。@Paebbels,但我在哪里检查它?在所有流程之外,即在架构内部?我是说。。。。它仍然会在每个循环上运行。我正确地理解,如果我们没有灵敏度列表,进程将具有时钟信号的“默认”灵敏度?等待声明会永远中止它吗?它在功耗方面有缺点吗(我想,我是说芯片内部的等待是以某种方式实现的)。是的,可能要做FSM,似乎比暂停进程更合乎逻辑,我想我还是需要学习一下:)灵敏度列表和“等待”语句只用于模拟,不用于测试synthesis@maxy,你可能会把等待和之后混淆。关于敏感度列表。。。什么意思?它们用于合成。@ScienceSamovar Nope。见下表;对于合成,灵敏度列表将被忽略,只是为了警告您,您的模拟可能与合成不同,因为您忘记了信号。(至少我是这样知道的,也许事情已经改变了。)@ScienceSamovar:通常,你应该只在启动时自动生成重置,并让重置信号触发所有其他初始化逻辑。请记住,上电重置不是与时钟同步的,因此逻辑越复杂,违反设置/保持要求的风险就越大。这并不能解决如何在不让流程循环到顶部的情况下运行一次流程的问题。OP特别要求没有敏感度列表。公平地说,这个问题将作者的设计问题与如何使VHDL进程只运行一次的具体问题混为一谈。@RaySalemi我不知道你读到了什么,但不是OPs问题。。。他的问题不是一个进程只运行一次,然后通过
wait从模拟运行中停用。此外,他还有一个综合问题,而不是模拟问题。
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;