MENU

【歪门邪道】在Logisim中实现Ben Eater的8位计算机

February 14, 2018 • 瞎折腾

这个东西我是在两天前完成的,想到近来好久没有更新,有愧于诸位,所以就整理了一番,为大家展示一下我搭建的8位计算机。

关于Ben Eater

Ben Eater是youtube上的一个up主,曾经发布过一系列视频来展示如何利用面包板来搭建一个8位的计算机,并利用之完成一些简单的计算。详见如下截图和本段起始的超链接。
TIM截图20180213221701.png

搭建8位计算机

因为芯片难找,Ben使用的74系列芯片有些是在198X年生产的,比较难找,再加上我懒,所以我决定使用软件模拟。而AD、Multilism、Proteus这些软件都因为芯片库不全而无法模拟。然而一个只有不到7MB(windows下)、由Java写成的开源软件就足以胜任了。

Logisim

Logisim是使用Java写成的,其跨平台性很好,目前最后更新是2014年10月11日,最新版2.7.0。不过它只能模拟最基本的门电路,以及在其上构造的D锁存器、触发器等,详见下图:
1.png

2.png

3.png

搭建

如下是我搭建的8位计算机,其中Tunnel功能类似于Multilism这些仿真软件中的网络标签,极其好用,也令我的搭建方便、简洁了不少。
TIM截图20180202194502.png

我在每个部件旁边都加了标签,而跳线基本上是按照Ben Eater的来的。对于没有看过Ben Eater视频的,我将对部件进行详述。

总线 / BUS

顾名思义,总线是各个组件交换信息的媒介,根据逻辑控制部分的统一调度,同一时刻只能有一个组件往总线上写数据,否则多个数据将被混为一谈,读取的组件无法分辨。当然,你可以使用多了总线,将数据总线和地址总线分开。根据Ben的设计,总线的低四位是地址总线(XXXXYYYY中的Y),而全部8位又作为数据总线使用,因此需要额外的指令周期进行调度。总线不用时应当被下拉电阻拉至逻辑0的电平。在寄存器A、B和ALU处可见我已经将总线拉至0.

程序计数器 / Program Counter

正如其名字,他是负责记录程序运行到哪里的。程序需要依靠正确的顺序来执行,而每一条指令按照写入的位置拥有其指定的编号(地址)。Program Counter可以受逻辑控制部分按需将地址放入到总线的低四位以供其他组件读取。同时也可以接受逻辑控制单元的J信号,将总线上的地址读入,来完成JUP操作。

寄存器 / Register

寄存器用来储存数据的。就目前的设计而言,寄存器A可供写入读出,而寄存器B用于指令后面数据的寄存,只可写入。

ALU

ALU全名arithmetic and logic unit,中文名算术逻辑计算单元,用来计算的。Logisim中提供了加减乘除和位移,而我只用了加和减。我让它能够从寄存器A和B读取数据,计算后将结果写入总线。

时钟 / Clock

负责提供时钟信号。是所有组件行动的标准,各个组件按照时钟信号的上升沿和下降沿行动,逻辑控制单元也根据时钟信号执行对应的指令。同时时钟也接受逻辑控制单元的HLT信号来停止时钟输出,让电脑冻住。

输出 / OutPut

负责将总线上的数据转化成十进制数字显示出来。使用了三块EEPROM芯片,预先对其编程,将总线上的数据转化成对应的地址直接输入给ROM,令其读取对应地址上的数据,这里我们根据其所在位数和数码管连线预先设计好该如何显示,这样就充当了译码器的工作。
TIM截图20180214000039.png

这里使用了Java,其他编程语言都行,由于Java不支持二进制,所以我转化成了16进制并按照Logisim支持的格式输出成文件,以便直接导入Logisim作为ROM的数据。

内存 / RAM

我使用了ROM作为内存,因此只读。原因是Logisim在每次重置模拟后都会清空寄存器和内存里的数据,因此我试用了ROM来储存程序,以免去每次都要重新载入程序的麻烦。内存组件会接受逻辑控制单元的控制,从总线上读取地址,然后并且按需将内部储存的程序机械码或数据写入总线,供指令解释器或寄存器读取。

指令寄存器 / Instruction Reader

指令寄存器读取高四位总线,与指令周期计数器一起组成地址交给ROM,ROM里面根据不同的指令和不同的指令周期,按需让组件写入、读取总线以完成指令。这里你可以自定义每个机械码代表的指令,可以自定义每个指令都做什么。
TIM截图20180214000625.png

这里我定义了全部的16个机械码。其中1、2、3、E、F经过测试,其他的尚未经过测试。以LDA为例,首先是让程序计数器输出,内存输入,让内存定位到程序所在的地址;之后内存将数据写入总线,指令寄存器读入,程序计数器+1。这是每个指令都必须要做的,因为必须将机械码读入指令寄存器才能针对不同的指令做出不同的操作。随后指令寄存器可以将低四位输出到总线上,令内存读入以定位到要写入寄存器A的数据所在的地址;接着就是要让内存输出,寄存器A读入。最后一步可选,为了提高运行速度,我将跳过为用到的指令周期,直接结束当前的指令,让计算机继续执行下一个指令。

ROM编程代码如下:
TIM截图20180214001139.png

给电脑编程

我们设计一个简单的程序,就是经典的28+14。首先我们简单的设计一下要干啥:

程序地址指令地址
00LDA04
01ADD05
02OTA00
03HLT00
04数据28的高四位数据28的低四位
05数据14的高四位数据14的低四位

将其翻译成对应的机械码,就是

程序地址机械码
0014
0125
02E0
03F0
041C
050E

写入RAM,重置计算机,开始运行模拟即可。

总结

我搭建这个计算机,总共花费了3个小时。全程也没有查什么资料,看过Ben的视频之后就凭着感觉搭建调试了。欢迎各位也尝试动手做一做,然后留个评论什么的。

相关文件下载

这里Logisim就不提供了,只提供Logisim的工程文件,还有文中提到的Java代码。
谷歌云端硬盘


知识共享许可协议
【歪门邪道】在Logisim中实现Ben Eater的8位计算机天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。

Last Modified: March 31, 2023
Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

2 Comments
  1. 自制CPU群主 自制CPU群主

    还不错,不过你这里的仿真电路不全,还存在一点问题。我做了一个完整的仿真,布局也是按照视频面包板布局,LED灯也是一样的布局。等迟点做一个讲解视频

  2. xingxingRealzyx xingxingRealzyx

    来看大佬