如何等待多个信号

时间:2014-02-01 20:42:09

标签: vhdl

我需要同步两个信号的计算,这两个信号是在两个过程中生成的。

architecture sm1 of SubModule is
  signal s1, s2 : float (5 downto -11);
begin

  PROCESS_1 : process (N, j, CLK)
    ...
  begin
    ...
    s1 <= ...
  end process;

  PROCESS_2 : process (N, j, CLK)
    ...
  begin
    ...
    s2 <= ...
  end process;

  PROCESS_SUM : process
  begin
    wait on s1 and s2;  -- something like this 
    result <= s1 + s2;
  end process;
end sm1;

代码演示了这个想法,进程PROCESS_1PROCESS_2执行单独的任务,但结果的总和是实体计算的结果。一般情况是期望PROCESS_1PROCESS_2将花费不同的时钟周期来计算其结果。如何确保在第三个流程中不使用s1s2的旧值?

如果我在这里采取错误的做法或误解,请随意提出其他想法或澄清我的错误。

2 个答案:

答案 0 :(得分:1)

对于可变延迟计算,添加信号有时很有用 表示计算的准备结果,因此s1_rdys2_rdy,其中 如果结果准备就绪,这些准备好的指示是'1'

使用添加的就绪信号,代码可能具有如下结构:

architecture sm1 of SubModule is
  signal s1, s2 : float (5 downto -11);
  signal s1_rdy, s2_rdy, result_rdy : std_logic;
begin

  PROCESS_1 : process (N, j, CLK)
    ...
  begin
    ...
    s1 <= ...
    s1_rdy <= '1';  -- Assigned to '0' when not ready
  end process;

  PROCESS_2 : process (N, j, CLK)
    ...
  begin
    ...
    s2 <= ...
    s2_rdy <= '1';  -- Assigned to '0' when not ready
  end process;

  -- Combine s1 and s2 with combined ready indication
  result <= s1 + s2;
  result_rdy <= s1_rdy and s2_rdy;

end sm1;

答案 1 :(得分:0)

莫滕的回答很好,并展示了一个真实的解决方案。

就您的实际问题而言,如何等待两件事情做好准备,您的建议最“看起来像”的代码将是:

PROCESS_SUM : process(clk)
  begin
    if rising_edge(clk) then 
        if s1 = '1' and s2 = '1' then
           result <= s1 + s2;
        end if;
    end if;
  end process;

但你仍然需要传递一个带有总和的“有效”标志,正如Morten所做的那样,并且你在加法器前添加了一个额外的逻辑级别,这是不必要的