我目前是一名高中生,对计算机/电气工程,特别是微处理器设计感兴趣。我已经阅读了Charles Petzold的Code,并且已经开始阅读Microchip Design Wikibook(这似乎是不完整的。)通过阅读Code,我了解了CPU背后的基本逻辑,并且已经开始在LogiSim中构建代码。代码中的第17章详细介绍了我要构建的CPU,但是电路缺少关键组件-时钟信号和指令解码。有些时钟信号似乎非常明显(PC似乎需要稳定的时钟信号),但是其他一些信号(例如如何锁存RAM值)我必须仔细考虑并尝试开始工作。
我可以构建一个工作累加器(我认为它不能准确地称为ALU,因为它缺少L部分),它可以通过一个输入在加减之间切换,而我知道这是我需要的算术部分-一旦跳转操作码起作用,就可以在代码中实现乘法和除法。我苦苦挣扎的部分是指令解码。通过一些Google搜索,我发现每个操作码都需要解释为多个微指令,但是我对如何使用它感到迷茫。目前,我的指令解码器只是一个组合分析电路,每个操作码都有一个二进制输出-总共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