我需要同步两个信号的计算,这两个信号是在两个过程中生成的。
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_1
和PROCESS_2
执行单独的任务,但结果的总和是实体计算的结果。一般情况是期望PROCESS_1
和PROCESS_2
将花费不同的时钟周期来计算其结果。如何确保在第三个流程中不使用s1
或s2
的旧值?
如果我在这里采取错误的做法或误解,请随意提出其他想法或澄清我的错误。
答案 0 :(得分:1)
对于可变延迟计算,添加信号有时很有用
表示计算的准备结果,因此s1_rdy
和s2_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所做的那样,并且你在加法器前添加了一个额外的逻辑级别,这是不必要的