【问题标题】:How to handle control signals in multiple processes in VHDL如何在VHDL中处理多个进程中的控制信号
【发布时间】:2018-01-07 08:25:33
【问题描述】:

有时我们需要在某些来自 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 个源(在一个进程中),问题是:

当我们需要一些控制信号(如“重置”)时,处理这种情况的最佳综合方法是什么?

【问题讨论】:

  • 在您的第一个示例中,Process(SomeInputs) 块已经不正确。它可能在模拟中起作用,但不是适当的综合构造。你甚至可以推断出你绝对不想要的闩锁。但我不明白你的问题。你看到的问题在 HDL 中是很正常的。

标签: process signals vhdl


【解决方案1】:

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

假设重置是由另一个进程生成的,而不是由硬接线按钮生成的:在这种情况下,您必须“询问”驱动进程以解除重置信号。

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

通常,您有一个:

  • 频闪 -> 完成/有效
    • 输入:单频闪
    • 输出:表示操作已完成且结果在应用新选通之前有效的标志信号
  • strobe -> 忙(等于不空闲)
    • 输入:频闪信号
    • 输出:描述是否接受新频闪灯的状态
  • 频闪/完成
    • 输入:频闪信号
    • 输出:频闪信号
  • 有效 -> 确认
    • input:表示有效输入数据的标志信号
    • 输出:选通信号指示输入数据已被消耗
  • ...

还有更多的协议和名称。

【讨论】:

    【解决方案2】:

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

    • 首先,定义信号本身,以及设置和复位信号。例如。 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-19
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2017-09-15
      • 1970-01-01
      • 2011-10-19
      相关资源
      最近更新 更多