LogiSim中非常简单的CPU设计


8

我目前是一名高中生,对计算机/电气工程,特别是微处理器设计感兴趣。我已经阅读了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

1
您愿意共享您现有的Logisim CPU .circ文件吗?为了使生活变得更加复杂,您应该在“价值传播”标题下仔细阅读并了解Logisim帮助。如果还没有的话。(考虑到您已经完成的所有工作,您可能已经拥有了。很高兴听到您继续这样做!)
2016年

@jonk感谢您的好话。使用相关的.circ文件编辑帖子。
Will Hodges

那总共是6个文件吗?(我认为这是针对LogiSim 2.7.1,2011?)
2016年

@jonk是的,两个问题都存在
Will Hodges

您如何处理减法?您是否使用从输入锁存器到ALU的A / B输入之一的/ Q并修改进位?还是其他方法?
2016年

Answers:


3

讨厌发布“仅链接”之类的答案,但是我认为您应该了解Warren Toomey在Logisim中使用CPU的工作,因为它可能正是您要寻找的。

他有一些教程,在这里建立了一个相当简单的CPU。

http://minnie.tuhs.org/CompArch/Tutes/

如果这不能使您满意,那么他这里有一个更先进的CPU ...

http://minnie.tuhs.org/Programs/UcodeCPU/

...所有这些都有很好的解释,并且可以下载到.circ文件。


可在http://www.homebrewcpu.com/上找到的Magic-1是另一款出色且功能更强大的DIY CPU /计算机。尽管在Logisim中还没有完成,但是它有很好的文档记录,包括图片,示意图,说明。它还不仅仅是模拟器中的CPU。它具有ANSI C编译器,操作系统和某些软件。实际上,它还具有内置于硬件的独特优势。实际上,它目前已启动并正在运行并正在提供网页!


最终,《计算系统元素》和相关网站nand2tetris.org成为了我推荐的第一大信息资源,它使我每次从头开始构建自己的计算机。我相信很多(全部?)内容都是免费的。YouTube同意;许多人从这一来源开始进行项目。


1
观看Ben Eater的有关构建8位面包板计算机的Youtbue视频也非常有帮助!
弗朗西斯·库格勒

1

我认为您缺少ALU运作方式的关键方面。通常,累加器的每一位都通过多路分解器连接到各个功能块中的每一个。使用命令字节选择功能,并将累加器的每个位连接到功能块的正确输入。解复用器的大小决定了ALU可以处理多少个功能。在下面显示的非常简单的示例中,使用4位输入的ALU使用解复用器可以引用16种不同的功能:

将累加器连接到ALU中的各种功能块

请注意,在大多数CPU中,此设计已优化为一堆门,以减少晶体管数量。

通过具有更大的命令寄存器可以使用更多功能,但这也将需要更多时钟周期来加载命令。

如果您想了解有关数字设计的更多信息,我强烈建议您阅读以下书籍:逻辑设计基础第7版。


这种答案使指令与ALU操作混淆。具体而言,该解复用器将仅用于选择要为算术指令选择的算术运算。例如,您将从8位指令中给3多路信号输入多路分解器,以选择哪种算术运算。通常,您需要一种完全独立的机制来对指令进行解码和排序。顺便说一句,我看过的大多数CPU在ALU中都不使用像这样的多路分解器,而是使用优化的门混乱来执行正确的操作。
肯·希尔里夫

1
@KenShirriff为了清楚起见,我进行了一些更改。随意进行一些您认为合适的编辑。
Takide '17

1

看来您在正确的道路上。

当您计划微指令时,您将需要在自己的脑海中清楚地定义“流量”模式,以实现数据在各个块中的移动。执行ADD将需要多个步骤。如果您拥有两个ALU操作数的保持寄存器,则需要从RAM或某个寄存器或总线中加载这些寄存器。如果您使用共享的内部总线,则可能需要一次加载一个操作数。一旦知道了哪些字节(地址,立即数,RAM数据,指针)需要移至何处,就可以计划字节通过总线进入和移出各个寄存器的顺序。您可能会陷入困境,需要添加一个内部保持寄存器,因为必须保留一些中间值,直到下一个微指令步骤为止。

我认为您怀疑缺少的是,逻辑将指令或操作码转换为CPU内的多种状态所需的复杂性。它可能很复杂,但是可以创建一个稍微简单的状态机,然后使用基本逻辑概念对其进行扩展。

例如,假设您正在为MOVE操作创建微指令步骤。这可以通过3个步骤来大致描述:1)将源寄存器的内容声明到内部总线上; 2)选通目标寄存器的写时钟; 3)从内部总线上取消声明源寄存器内容。步骤1)到3)描述了寄存器输出使能(OE)和寄存器写使能(WE)的时序,它们可以有选择地分配给使用解复用器连接到共享内部总线的任何源寄存器和任何目标寄存器。

如果您没有太多实践来创建有限状态机,那么查看不同的方法可能会很有用,这可以为您提供另一个构建模块,以从您的微型序列发生器生成控制信号。

坚持下去。您获得的知识量将是惊人的。希望您会玩得开心。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.