我一直在尝试用VHDL代码为我在Altera DE1板上实现的简单16位处理器编写有限状态机。在有限状态机中,我有一个CASE语句,该语句处理不同的16位指令,这些指令由16位STD_LOGIC_VECTOR带到FSM中。但是,在有限状态机对指令进行解码的解码状态下,我遇到了一些麻烦。指令之一是ADD,它将两个寄存器作为操作数,第三个作为目标寄存器。但是,我还有一条ADD指令,该指令将一个寄存器和一个5位立即数作为操作数,并使用第二个寄存器作为目标地址。我的问题是,在CASE语句中,我需要能够区分两个不同的ADD指令。因此,我认为,如果我在CASE语句中使用通配符值(例如“-”或“X”),则仅用两种情况就可以区分两者,而不必列出所有可能的寄存器/立即值组合。例如:

    CASE IR IS --(IR stands for "Instruction Register")
      WHEN "0001------0-----" => (Go to 3-register add);
      WHEN "0001------1-----" => (Go to 2-register/immediate value add);
      WHEN OTHERS => (Do whatever);
    END CASE;

这些不是我仅有的两个说明,我只是将这两个说明放短了一些。当我编译并运行此代码时,处理器进入“解码”状态时将停止执行。此外,Quartus还给出了许多警告,例如“LC3FSM.vhd(37)上的VHDL选择警告:忽略了包含元值““0001 ------ 0 -----”“”的选择”
我对如何实现这一目标一无所知。我确实不需要,也可能不需要定义每个单独的16位组合,并且我希望有一种方法可以在STD_LOGIC_VECTOR中使用通配符以最小化我必须定义的组合数量。

有人知道如何做到这一点吗?

谢谢

最佳答案

假设您不需要指令中的其他位,则可以通过预检查过程掩盖其他位,从而解决该问题。 (或者只是确保在编写指令时将其他位复位?)

这确实有点hack。

假设IR被存储为变量

if IR(15 downto 12) == "0001" then
    IR := IR_in(15 downto 12) & "0000000" & IR_in(5) & "00000";
else
    IR := IR_in
end if;

CASE IR IS --(IR stands for "Instruction Register")
  WHEN "0001000000000000" => (Go to 3-register add);
  WHEN "0001000000100000" => (Go to 2-register/immediate value add);
  WHEN OTHERS => (Do whatever);
END CASE;

或者,假设您的指令被巧妙地考虑了(前四位是命令字还是沿行的东西?),您可以进行嵌套的case语句,并根据需要在这些子块中进行区分。

关于wildcard - VHDL STD_LOGIC_VECTOR通配符值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9205910/

10-15 16:56