标签: lc3

VHDL STD_LOGIC_VECTOR通配符值

我一直在尝试用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中使用通配符来最小化我必须定义的组合数.

有人知道怎么做到这一点吗?

谢谢

wildcard vhdl stdvector lc3

6
推荐指数
2
解决办法
3017
查看次数

LC3装配按位右移

我需要做的是使用LC-3组件实现按位左移和按位右移.基本上,每个位都必须在移位方向上移动一个空间,零填充所创建的空白空间.

例子:

右移:

 01001001
 00100100?
Run Code Online (Sandbox Code Playgroud)

左移:

 01001001
?10010010
Run Code Online (Sandbox Code Playgroud)

通过获取二进制字符串并将其添加到自身,我已成功实现了左移.

我很难理解如何进行正确的转变.任何想法将不胜感激.我有AND,NOT,ADD操作,数据移动操作,七个寄存器来存储值和整个存储器范围.我只需要一些基本的想法如何实现它.

如果您需要LC-3指令集参考,那么这里一个.

assembly bit-shift bitwise-operators lc3

6
推荐指数
2
解决办法
2万
查看次数

LC3 LEA 指令和存储的值

我对这个问题感到困惑:指令“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)

assembly load cpu-registers lc3

3
推荐指数
1
解决办法
1万
查看次数