我一直在尝试用 VHDL 代码为我在 Altera DE1 板上实现的简单 16 位处理器编写有限状态机。在有限状态机中,我有一个CASE
处理不同 16 位指令的语句,这些指令由 16 位 STD_LOGIC_VECTOR 带入 FSM。但是,我在有限状态机解码指令的解码状态中遇到了一些麻烦。其中一条指令是 ADD,它采用两个寄存器作为操作数,第三个作为目标寄存器。不过,我还有一条 ADD 指令,它采用一个寄存器和一个 5 位立即值作为操作数,以及第二个寄存器作为目标。我的问题是在CASE
声明中,我需要能够区分两个不同的 ADD 指令。所以,我想如果我在中使用“-”或“X”等通配符值CASE
声明中,我将能够仅用两种情况来区分两者,而不是列出所有可能的寄存器/立即值组合。例如:
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 中使用通配符来最大限度地减少我必须定义的组合数量。
有人知道如何做到这一点吗?
Thanks
不幸的是,这是不可能的。对于大多数用户来说出乎意料的是,比较运算符=
和case
比较执行字面比较。这是因为std_logic
类型只是一组字符,由于其他函数的方式(例如and
and or
) 被定义。
VHDL-2008 引入了新的 case 语句case?
它按照您的预期执行 - 您需要告诉编译器在 VHDL 2008 模式下运行。此外,还有一个?=
VHDL 2008 中的运算符比较两个值,考虑到-
s.
如果你被一个编译器搞得一团糟still不支持VHDL 2008,向供应商投诉。还有一个std_match
函数允许您在较旧的 VHDL 版本中进行比较,但据我所知,没有什么可以使case
声明就是这样工作的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)