我目前正在读高中,我一直对计算机/电气工程感兴趣,特别是微处理器设计。我已经阅读了 Charles Petzold 的 Code,并开始阅读Microprocessor Design Wikibook(似乎不完整)。通过阅读Code,我了解了 CPU 背后的基本逻辑,并开始在 LogiSim 中构建一个。代码中的第 17 章详细介绍了我想要构建的 CPU,但电路缺少关键组件——时钟信号和指令解码。一些时钟信号似乎很明显(PC 似乎需要一个稳定的时钟信号)但其他的(比如如何锁存 RAM 值)我必须仔细考虑并尝试开始工作。
我可以构建一个工作累加器(我认为它不能准确地称为 ALU,因为它缺少 L 部分)通过单个输入在加法和减法之间切换,我知道这就是算术部分所需要的全部-- 一旦我让跳转操作码工作,我就可以在代码中实现乘法和除法。我正在努力的部分是指令解码。通过一些谷歌搜索,我看到每个操作码都需要被解释为多个微指令,但我不知道我需要如何工作。目前,我的指令解码器只是一个组合分析电路,每个操作码都有一个二进制输出——总共 13 个。
代码的工作方式是它有一个 8 位代码值(我只使用低端字节),然后是两个单独的 8 位地址值,然后我将它们组合为 RAM 的 16 位地址输入。为了锁存这些值,我有一个单独的计数器,最多计数 10b,然后重置为 00b。依次是每个锁存器的时钟输入(对于三个锁存器,有a、b和c。第二个时钟a为1,b&c为0,则b为1,1&c为0,则c 为 1 且 1 & b 为 0,然后重置)。但是在诸如 ADD 000Ah 之类的指令上,PC 会跳转到 000AH……这应该是添加到累加器中的,但实际上被锁到了代码锁存器中,然后被解释为下一个操作码,这使得整个事情顺利进行疯狂的。
我觉得我错过了一些关于指令解码以及我需要如何处理时钟信号的重要信息......
以下是 LogiSim .circ 文件: https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdder.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitAdderSubtractor.circ https:// dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitInverter.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/8BitLatch.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/ ID.circ https://dl.dropboxusercontent.com/u/61676438/PetzoldMk5/PetzoldMk5.circ
PetzoldMk5 是主 CPU,依赖于其他文件作为库导入。
以下是操作码列表(均为二进制):
Load 0001
Add 0010
Add w/ Carry 0011
Sub 0100
Sub w/ Borrow 0101
Jump 0110
Jump w/ Carry 0111
Jump W/ 0 1000
Jump w/o C 1001
Jump W/o 0 1010
Store 1011
Halt 1100
Reset 1101