我一直在尝试用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;
Run Code Online (Sandbox Code Playgroud)
这些并不是我唯一的两条指令,我只是将这两条指令缩短了一点.当我编译并运行此代码时,处理器在进入"解码"状态时停止执行.此外,Quartus给出了许多警告,说"LC3FSM.vhd(37)中的VHDL选择警告:忽略包含元值的选择""0001 ------ 0 -----"""我在关于如何实现这一目标的损失.我真的不需要也可能不需要定义每个16位组合,我希望有一种方法可以在STD_LOGIC_VECTOR中使用通配符来最小化我必须定义的组合数.
有人知道怎么做到这一点吗?
谢谢
我需要做的是使用LC-3组件实现按位左移和按位右移.基本上,每个位都必须在移位方向上移动一个空间,零填充所创建的空白空间.
例子:
右移:
01001001
00100100?
Run Code Online (Sandbox Code Playgroud)
左移:
01001001
?10010010
Run Code Online (Sandbox Code Playgroud)
通过获取二进制字符串并将其添加到自身,我已成功实现了左移.
我很难理解如何进行正确的转变.任何想法将不胜感激.我有AND,NOT,ADD操作,数据移动操作,七个寄存器来存储值和整个存储器范围.我只需要一些基本的想法如何实现它.
我对这个问题感到困惑:指令“LEA R0,A"执行后寄存器 0 中存储的值是多少?为什么答案是 x370C?我认为它应该将A的地址加载到R0中?如果是这样,我们如何知道地址?有人可以帮忙吗?非常感谢!
.ORIG X3700
LEA R0, A
LDI R2, C LDR R3, R0, 2
AND R1, R1, #0
IN
ST R0, D
JSR F
HALT
F LD R1, B
ADD R1, R1, #1
BRp F
RET
A .FILL X1234
B .FILL X370B
C .FILL X370C
D .BLKW 2
E .STRINGZ "ABCD"
G .FILL X1234
.END
Run Code Online (Sandbox Code Playgroud)