1

我有一个实现状态机的过程。在其中一个周期(状态)中,需要计算两个信号,其中一个是直接计算的,另一个是使用组件内已计算的信号进行的计算。第一次计算的结果需要放入一个指向组件的 MUX 中,并且所有这些都需要在同一个周期中完成(这足够长,足以让两个操作串行完成)。

我尝试的一种方法是使用变量来计算第一个信号,然后使用该信号来计算第二个信号,但它不会发生在同一个周期中,而是发生在 2 个周期中,因为对第一个信号的分配只发生在循环结束时,组件没有足够的时间来计算:

when st_cycle_5 =>                   

  vec_var(31 downto 0)  := dot_c_sig(31 downto 0)  - dot_a_sig(31 downto 0);
  vec_var(63 downto 32) := dot_c_sig(63 downto 32) - dot_a_sig(63 downto 32);
  vec_var(95 downto 64) := dot_c_sig(95 downto 64) - dot_a_sig(95 downto 64);

  c_minus_a_sig         <= vec_var;

...

end process cau_proc;

mult1_in1_sig           <= b_minus_a_sig(63 downto 32) when cau_state = st_cycle_5

如何计算信号b_minus_a_sig并通过 MUX 分配它以在同一周期获得组件的结果?

vec_var是一个变量,所有其他信号都是std_logic_vector

编辑:有解决方案

mult1_in1_sig <= dot_c_sig(63 downto 32) - dot_a_sig(63 downto 32) when cau_state = st_cycle_5

但我认为在这种情况下,布局和布线将不知道该操作已经完成并且结果可用并且执行两次而不是使用已知结果。

4

1 回答 1

1

也许您只需要使用适当的变量或变量的切片mult1_in1_sig 在您的流程中进行分配。

换句话说,您可以将计算和多路复用器打包在一个进程中。

这样做,注意不要描述一个锁存器,即你的目标信号mult1_in1_sig 必须为你进程中每个可能的执行路径分配一个值,而不仅仅是when st_cycle_5. 同样的评论适用于c_minus_a_sig每个信号。

于 2012-08-01T09:47:46.727 回答