如何在VHDL中处理多个进程中的控制信号

时间:2017-07-31 16:52:03

标签: process signals vhdl

有时我们需要对一些来自Process之外的条件执行一些顺序过程。我们可以为这种情况声明一些控制信号,例如:

Architecture ...
 Signal C : std_logic;
begin
 Process(SomeInputs)
 begin
  C <= '1';
 end Process;

 Process(Clock)
  Variable Counter : Integer := 0;
 begin
  if (Clock'Event and Clock = '1') then
   if C = '1' then
    Counter := Counter + 1;

    if Counter = 10 then
     Counter := 0;
     C <= '0';
    end if;
   end if;  
  end if; 
 end Process;
end;

end ... ;

在这种情况下,信号C是多源的,无法合成。

另一个例子是复位信号,当复位来自进程外部或组件外部时,我们无法反转它。

一种方法是制作这样的状态机:

Process(Clock)
begin
 if (Clock'Event and Clock = '1') then
  case Current_State is
   when State_X =>
    Current_State <= State_Y;
   when State_Y =>
    if C = '1' then
     Current_State <= State_X;
    else
     Current_State <= State_Y;
    end if;
   ...
  end case;
 end if;
end Process;

或者处理这种情况的另一种方法是声明这样的临时信号:

Architecture ...
 Signal MySignal, MyTempSignal : std_logic_vector(N downto 0);
begin

 Process(Clock)
  Variable Counter : Integer := 0;
 begin
  if (Clock'Event and Clock = '1') then
   if MySignal /= MyTempSignal then
    Counter := Counter + 1;

    if Counter = 10 then
     Counter := 0;
     MyTempSignal <= MySignal;
    end if;
   end if;  
  end if; 
 end Process;

end ...;

对于临时信号,我们可以在某些信号发生变化时进行一些处理。

另一种方法是在过程的灵敏度列表中添加条件信号,但是当过程与时钟一致时,它很难处理它们。

主要问题是每个信号必须来自1个来源(在一个过程中),问题是:

当我们需要一些控制信号时,处理这种情况的最佳可合成方法是什么,例如重置&#39; ?

2 个答案:

答案 0 :(得分:2)

流程与责任有关。进程负责驱动一个或多个输出。如果一个进程遵守由另一个源(例如按钮)创建的复位信号,那么一个进程就不允许反转这样的复位,因为它不是它的责任!任何其他信号也是如此。

因此,假设重置是由另一个进程生成的,而不是由硬连线按钮生成的:在这种情况下,您必须“询问”驱动过程以使置位信号无效。

因此,让我们假设两个进程都实现了状态机,在这种情况下,我们现在处于以下领域:如何在状态机之间实现握手协议。

通常,你有一个:

  • 频闪 - &gt;做/有效
    • 输入:单频闪
    • 输出:标志信号表明操作已完成且结果有效,直到应用新选通
  • 频闪 - &gt;忙(等于没空闲)
    • 输入:选通信号
    • 输出:描述是否接受新选通的状态
  • 选通/成品
    • 输入:选通信号
    • 输出:选通信号
  • 有效 - &gt;确认
    • 输入:表示有效输入数据的标志信号
    • 输出:消耗选通信号指示输入数据
  • ...

还有更多的协议和名称。

答案 1 :(得分:1)

为了处理与同一信号交互的多个进程,我通常会这样做:

  • 首先,定义信号本身,以及设置和重置信号。例如。 sig,sig_reset和sig_set,
  • 然后,使用sig_set和sig_reset信号定义一个负责影响sig值的过程,
  • 最后,您可以影响来自不同进程的sig_set和sig_reset信号的值。

如果多个进程必须执行相同的操作(例如重置),则只需为每个进程声明一个信号,然后对它们进行OR或将它们全部置于条件中。

示例:

architecture ar of comp is
  signal sig, sig_rst1, sig_rst2, sig_set : std_logic;
begin
  sig_management:process(clk)
  begin
    if rising_edge(clk) then
      if sig_rst1 = '1' OR sig_rst2 = '1' then
        sig <= '0';
      elsif sig_set = '1' then
        sig <= '1';
      end if;
    end if;
  end process;

  set_proc:process(clk)
  begin
    if rising_edge(clk) then
      sig_set <= '0';
      if (condition) then
        sig_set <= '1';
      end if;
    end if;
  end process;

  -- Do the same for sig_rst signals

end architecture;