我一直在尝试用 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 中使用通配符来最小化我必须定义的组合数量。
有谁知道如何做到这一点?
谢谢