我有以下代码段:
SIGNAL ALU_hilo : STD_LOGIC_VECTOR(63 downto 0);
PROCESS ( ALU_ctl, Ainput, Binput )
BEGIN
-- Select ALU operation
CASE ALU_ctl IS
-- ALU performs ALUresult = A_input AND B_input
WHEN "0000" => ALU_Internal <= Ainput AND Binput;
-- ALU performs ALUresult = A_input OR B_input
WHEN "0001" => ALU_Internal <= Ainput OR Binput;
-- ALU performs ALUresult = A_input + B_input
WHEN "0010" => ALU_Internal <= Ainput + Binput;
-- ALU performs ?
WHEN "0011" => ALU_Internal <= X"00000000";
-- ALU performs ?
WHEN "0100" => ALU_Internal <= X"00000000";
-- ALU performs ?
WHEN "0101" => ALU_Internal <= X"00000000";
-- ALU performs ALUresult = A_input - B_input
WHEN "0110" => ALU_Internal <= Ainput - Binput;
-- ALU performs SLT
WHEN "0111" => ALU_Internal <= Ainput - Binput ;
-- ALU performs MFHI
WHEN "1101" => ALU_Internal <= ALU_hilo(63 downto 32);
-- ALU performs MFLO
WHEN "1100" => ALU_Internal <= ALU_hilo(31 downto 0);
-- ALU performs MULT
when "1000" => ALU_hilo <= Ainput * Binput;
WHEN "1001" => ALU_Internal <= Binput(15 downto 0) & X"0000";
WHEN OTHERS => ALU_Internal <= X"00000000";
END CASE;
END PROCESS;
这里的所有其他信号都是先前声明的并且正常工作。我的问题是在ALU_ctl不是“1000”的后续进程调用中,ALU_hilo被0x0覆盖。我如何解决这个问题,以便ALU_hilo保持其值,除非ALU_ctl为1000?
答案 0 :(得分:1)
您为仅为灵敏度列表中某个信号的特定条件指定的信号创建锁存器。
当Ainput
仍为Binput
时,您很可能会在ALU_ctl
或"1000"
(或两者)上看到某个活动。
如果不具体控制何时启用锁存器,则此过程可能无法合成您的预期功能。如果您打算在此处创建锁存器,则应使用仅在此过程中使用的所有其他信号不变的情况下才有效的启用。
您可以类似地使用时钟边沿并创建寄存器而不是锁存器,其中ALU_ctl
用作选择更新哪个寄存器的地址。这意味着Ainput
和Binput
出现在同一时钟上。
(并且没有调用进程,当他们的一个敏感列表元素有一个事件时,它们的执行会恢复。有一个隐含的wait on ALU_ctl, Ainput, Binput;
作为进程的最后一个语句。是一系列语句,除非停止,否则将重复。)