我有一个实现状态机的进程。在一个周期(状态)中,需要计算两个信号,其中一个是直接计算的,另一个是使用组件内已经计算的信号进行的计算。第一次计算的结果需要放入一个指向组件的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
但我认为在这种情况下,这个地方和route将不知道该操作已经完成并且结果可用并且执行两次而不是使用已知结果。
答案 0 :(得分:1)
也许你只需要使用适当的变量或变量切片在你的过程中分配mult1_in1_sig
。
换句话说,您可以在一个过程中打包计算和多路复用。
这样做,请注意不来描述 latch ,即必须为目标信号mult1_in1_sig
分配一个值流程中的每个可能的执行路径,而不仅仅是when st_cycle_5
。 c_minus_a_sig
和每个信号都有同样的说法。