如何有效地设计 CPU 的操作码?

电器工程 中央处理器 计算机架构
2022-01-09 17:49:21

我正在 Logisim 中构建一个简单的 16 位 CPU,并准备好 ALU 和我想要的操作码。现在我发现很难为命令找到正确的编码,以便不同的子电路(例如逻辑、算术)不需要所有控制线(构建编码)作为输入,但尽可能少。是否有任何有助于高效操作码设计的策略或方法?

提前谢谢

4个回答

我认为这是学习其他一些指令集的好方法。

一个小的可能是 TI 的 MSP430,它是一个 16 位处理器,大约有 22 条指令。

http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf

您还可以查看 Atmel AVR,它们也有一个非常小的指令集。

在我的一个小项目中,我尝试用一​​个小指令集(14 条指令)用 VHDL 开发一个简单的 32 位处理器:

http://www.blog-tm.de/?p=80

由于我目前的空闲时间,它还没有完全完成。指令已实现,但有两个未测试,可能缺少一些状态标志。

研究(但不要复制)ARM 的指令编码方法。它高度以前缀为导向(如 Dzarda 推荐的 Huffman 树方法),并且在指令的寄存器选择部分的位置方面高度统一。

缺乏想象力但可靠的方法是枚举您拥有的所有控制信号,这些信号可能超过 16 位,然后尝试对它们进行卡诺图式逻辑最小化。

有一次我尝试在 Logisim 中使用 8 位指令长度的内核做一个 4 位 CPU。最终得到了一个简单的状态机,而不是一个 CPU,真的。

随机寻找的东西

  • 霍夫曼树
  • 固定长度还是可变编码?
  • 它是具有单一地址空间的冯诺依曼设计,还是具有独立数据/程序的哈佛风格?

关于 Huffman 树的 Computerphile 上的精彩视频:

https://www.youtube.com/watch?v=umTbivyJoiI

我为课堂编写的 ISA 曾经有一个 4 位操作码,如下所示: 1XXX ALU instructions 01XX jump, jump register, call etc 001X branch not equal, branch equal zero 000X 0 - load, 1 - store

这不是最佳的,而是一种更容易构建/设计门的样式,因为单个位的输入信号可以完全控制采用的逻辑路径。或者,您可以对您最常用的符号进行Huffman 编码并将它们补零以获得固定长度的操作码。