电路

如何构建一个8位计算机:18个步骤(带图片)

不要嘲笑我們的性

不要嘲笑我們的性

目录:

Anonim

构建一个8位TTL计算机听起来像是一项艰巨而复杂的任务,或者至少在我开始了解基本CPU架构的过程中对我有所帮助。归根结底,一旦你了解了所有进程背后的基础知识,CPU就会非常简单。该项目旨在帮助任何有兴趣构建自己的计算机并获得该过程所带来的精彩知识的人。不要害怕尝试,你只能学习。
该项目将从描述电子学的基础知识开始。之后,将描述二进制和布尔逻辑的基本原理。最后,我们将转向一个简单的计算机的各个部分的功能(稍作修改),如Malvino的文本中所述。 数字计算机电子 。这意味着此Instructable的最终产品将是一台可以使用唯一指令集进行编程的计算机。该项目还将计算机的许多设计方面留给您,并作为构建您自己的计算机的指南。这是因为有很多方法可以实现这个项目。如果您已经对布尔逻辑有了充分的理解,那么二进制的工作可以随意跳到项目的内容。我希望你们都喜欢并从这样的构建中得到一些东西,我知道我确实做到了。
对于这个项目,您将需要:
1.)电源
2.)面包板+大量电线
3.)LED用于输出
4.)各种逻辑IC(稍后讨论)
5.)空闲时间
6.)愿意搞砸并从错误中吸取教训
7.)很耐心
可选(但非常有用):
1.)示波器
2.)数字万用表
3.)EEPROM编程器
4.)声波螺丝刀
像这样的项目的有用链接:
数字电脑电子:
http://www.amazon.com/Digital-computer-electronics-Albert-Malvino/dp/007039861
TTL食谱: http://www.amazon.com/TTL-Cookbook-Understanding-Transistor-Transistor-Integrated/dp/B0049UUV38

供应:

第1步:什么是计算机?

这似乎是一个非常简单的问题,不需要回答,事实上,这是一个许多人不知道真正答案的问题。计算机在机械和理论形式上比晶体管存在的时间长得多。计算机的实际定义是由一个非常聪明的人以阿兰·图灵的名字来思考的。他描述了一台被称为图灵机的机器。我们今天使用的每台计算机,从您正在阅读的计算机或手机到超级计算机,都可以被归类为最简单的图灵机。
什么是图灵机?图灵机由4部分组成:磁带,磁头,表和状态寄存器。为了使这种机器的操作可视化,您首先必须想象一个在每个方向上无限跨越的胶片条。现在想象这个电影片的每个单元格只能包含一组定义的符号(如字母表)。对于这个例子,让我们假设每个单元格只能包含“0”或“1”。这些单元格可以在无限长的时间内重写,但可以无限期地保留它们的信息,直到它们再次被更改为止。被称为头部的图灵机的部分可以将符号写入单元格,以及通过给定的整数(整数)单元增加或减少其在胶片条带上的位置。下一部分是表,其中包含一组给定的指令供头执行,例如“向右移动4个单元”和“将单元设置为1”。图灵机的第四部分也是最后一部分是状态寄存器,其目的是保持机器的当前状态。状态包括指令以及磁带上的当前数据。
这就是计算机操作的简单程度。当您的计算机运行时,它实际上是作为图灵机运行的。它通过一组给定的指令和算法处理计算机上保存的数据。这个Instructable中描述的计算机是一个非常简单的计算机模型,但它仍然可以运行,您可以使用它将遵循和执行的一组指令进行编程。
有用的链接:
维基百科图灵机:
http://en.wikipedia.org/wiki/Turing_machine

第2步:电子学概论

在构建8位计算机之前,掌握电力和模拟电路的基本属性非常有用。您将构建的计算机上有部件需要模拟组件。有许多电子自学教学指南可用于最低成本,提供电气工程的速成课程。我个人发现了 电子自学教学指南 作者:Harry Kybet和Earl Boysen是一本处理模拟电子世界的好书。
电子自学教学指南 :http://www.amazon.com/Electronics-Self-Teaching-Guide-Teaching-Guides/dp/0470289619/
常用组件:
电阻 - 限制电流,以欧姆为单位。
电容器 - 存储电荷,可以是极性的或非极性的(极性意味着必须将其放置在正确的工作方向)。用法拉德测量。
二极管 - 仅允许电流沿一个方向流动,当放置在错误的方向时会在一定电压下发生故障。
晶体管 - 由第三个引脚控制的电流门,用作中介。有许多类型的晶体管,但在这里我们将讨论BJT(双极结晶体管),它有两种类型:NPN和PNP。

电流,电压和电阻在电路中齐头并进。三者之间的关系可以用欧姆定律表示:V = IR。换句话说,电压等于以安培为单位的电流乘以以欧姆为单位的电阻。欧姆定律是电子学中最重要的公式之一,值得深入了解。
要应用欧姆定律,您需要知道电路的电阻。要找到电阻的值,您必须使用其颜色代码。电阻器颜色代码基于可见光谱,可以以许多不同的方式存储。对于那些不在乎记忆的人,有很多工具可以帮助您找到正确的电阻值。要计算电路中的总电阻,您需要两个不同配置的电阻配方:串联和并联。在串联中,一个电阻器跟随另一个电阻器,而在并联电阻器中它们彼此并排。在系列中,公式非常简单:
串联电阻:R(总)= R(1)+ R(2)+。 。 。 + R(N)
这意味着您只需要添加电阻的值。
并联电阻:R(总)= 1 / {1 / R(1)+ 1 / R(2)+。 。 。 + 1 / R(N)}
从颜色代码中找到阻力的好工具:http://www.csgnetwork.com/resistcolcalc.html
如果您认为电阻器像两个人一起工作在一起工作,那么更容易理解并联电阻的公式。同样的公式用于单词问题,其中给出了两个人操作的速率,并且如果一起工作,你必须知道他们的项目完成的速度有多快。
要找到给定电阻值给定元件的电流量,您只需将电阻和电压值插入欧姆定律并求解I.例如:
一个灯在一个电路中,并且两个1K(一千欧姆)电阻器并联放置在它前面。电源电压为9伏时,灯的电流量是多少?
1.)计算R(总计):
R(总)= 1 /(1/1000 + 1/1000)= 1 /(2/1000)= 1000/2 = 500欧姆
2.)使用欧姆定律计算电流:
9 = I * 500
I = 9/500 = .018 A = 18 mA(毫安)
您也可以在电路中安排电阻来调节电压。这称为分压器,包括两个串联电阻。两个电阻的电压输出位于它们的结点。为了更好的主意,请查看我附上的图片。在这种安排中,电压输出的公式是:
V(out)= V(源)* R(2)/ {R(1)+ R(2)}
电容器将在您的计算机中用于构建时钟。时钟只是一个以恒定速率开启和关闭的电路。就像电阻一样,电容器有两个公式,用于查找串联和并联配置的总值。
系列:C(总)= 1 / {1 / C(1)+ 1 / C(2)+。 。 。 + 1 / C(N)}
平行:C(总)= C(1)+ C(2)+。 。 。 + C(N)

电容器充电的速率取决于电容器之前(或放电之后)电路的电阻以及电容。以时间常数测量电容器的充电。完全充电或放电电容需要5个时间常数。以秒为单位查找电容时间常数的公式为:
T(常数)=电阻*电容
二极管操作简单,在构建TTL计算机时派上用场。它们只允许电流在一个方向上流动。当它们被放置在正确的方向时,它们就是所谓的前向偏置。当它们反转时,它们会在一定电压下发生故障。当二极管逆流工作时,它会反向偏置。
晶体管的工作方式类似于由电流操作的阀门。 BJT有三个引脚:集电极,发射极和基极。为简单起见,在本步骤中,我将描述一种NPN晶体管,其中电流从集电极流向发射极。在基极施加的电流控制电流从集电极流向发射极的程度。晶体管因其放大信号的能力而成为许多应用的理想选择。这是因为施加在晶体管基极的电流可以远小于控制的电流。这种电流增益称为晶体管或β的电流增益。 beta的公式是:
Beta =当前(收集器)/当前(基准)
当晶体管完全导通时,它被认为是饱和的。布尔晶体管是处于饱和或关闭状态且从不在其间的晶体管。这是您将主要在数字电子产品中处理的晶体管类型。晶体管形成计算机运行所需的逻辑门。这些将在后面描述。
有用的链接:
http://en.wikipedia.org/wiki/Resistor
http://en.wikipedia.org/wiki/Capacitor
http://en.wikipedia.org/wiki/Diode
http://en.wikipedia.org/wiki/Transistor

第3步:二进制数

今天,我们已经习惯了基于十号的全球编号系统。我的意思是我们的数字系统中没有数值,价值10,因此我们的数字系统是十分之一。
将我们的数字系统视为里程表。里程表从最低位数到最高位数进行计数,然后依次强制下一个转子前进一个位置。例如:
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
1 0 < - 转到下一个数字
二进制是基数二,意味着它只有两个数字而没有数字2.二进制只有数字0和1或“关”和“开”。要计算二进制数,您只需应用里程表技术:
0001b - 1
0010b - 2
0011b - 3
0100b - 4
0101b - 5
0110b - 6
0111b - 7
1000b - 8
等等。 。 。
我们的数字系统有另一个因素使它成为十个基数;随着我们的数字移动越来越高,数字的重量会增加10倍。例如1 = 10 ^ 0,10 = 10 ^ 1,100 = 10 ^ 2等。 。 。在二进制中,事物当然是基础二,因此,每个连续数字是另一个2的幂。 1b = 1 = 2 ^ 0,10b = 2 = 2 ^ 1,100b = 4 = 2 ^ 2等。 。 。
要将十进制数转换为二进制数,有一个简单的技巧称为double-dabble,这使得该过程变得更加容易:
假设我们想要将13转换为二进制数,我们首先将13除以2然后写下余数。然后直接在它上面写下你得到的数字而没有余数(在这种情况下为6)并将其除以2并将剩余部分写在前一个数字之上。您继续此过程,直到达到1或0.最后,您从上到下阅读以获得结果。
1/2 = 0 R1 <从上到下读取。结果是1101或2 ^ 0 + 0 + 2 ^ 2 + 2 ^ 3 = 1 + 0 + 4 + 8 = 13.这称为二进制字。
3/2 = 1 R1 <
6/2 = 3 R0 <
13/2 = 6 R1 <
十六进制经常用于二进制。十六进制是16的基数,包含数字0-9和a-f。一个十六进制数字用于描述一个半字节或四个数据位。一位是单个1或0的二进制。半字节可以在下一个字节位于下一个半字节之前从0到15(0000到1111)计数。两个半字节一起是一个字节或8位。由于第一个数字是2 ^ 0,所以最后一个数字加权2 ^ 7。因此,一个字节可以是0到255之间的任何位置。要以十六进制表示字节00101110(十进制46),首先要将两个半字节分成0010和1110.第一个半字节的值为2,第二个半字节的值为一个的值为E(或十进制的14)。因此,十六进制的字节00101110将是2E。
有用的链接:
http://en.wikipedia.org/wiki/Binary_numeral_system
http://en.wikipedia.org/wiki/Hexadecimal

第4步:逻辑门

计算机由数千个逻辑门组成,用于执行某些功能。逻辑门是数字电子产品中的一个组件,其输出取决于其输入的状态。大多数逻辑门有两个输入和一个输出。您可以将逻辑门视为数字电子产品的决策者。数字电子设备中使用的六个主要逻辑门是:
AND门:如果输入为高电平,则输出为高电平。
或门:当任何输入为高电平时,输出为高电平。
NOT Gate:只有一个输入。输入低时输出高。
与非门:除非所有输入均为高电平,否则输出为高电平。
NOR门:当其输入均为高电平时,输出为高电平。
XOR门:当奇数个输入为高电平时,输出为高电平。

三态缓冲器:由第三个逻辑信号控制的缓冲器。
现在重要的是要提到高“1”信号和低“0”信号之间的差异。高信号可以是与正电压的连接,也可以是浮动输入。浮动输入是未连接到任何输出的输入。浮动输入的示例将是根本未连接的输入或者连接到未激活的3状态缓冲器的输出的输入。当输入接地时,存在低信号。
逻辑门可以相互馈送,以产生几乎任何可以想象的功能。例如,可以将两个NOR门相互馈送,以在RS_NOR锁存器中存储一位数据,同时向电路供电。

第5步:二进制计数(程序计数器)

计算机最重要的部分之一是它的程序计数器。程序计数器为计算机提供要执行的指令的当前地址。但是,为了使程序计数器起作用,它需要以二进制计数。为此,使用JK触发器。触发器是存储一位的逻辑门的布置(类似于逻辑门步骤中描述的RS_NOR锁存器)。 JK触发器在其时钟脉冲输入变为高电平然后再次变为低电平时改变其状态(其J和K输入也必须为高电平)。换句话说,每当JK触发器获得时钟脉冲的下降沿时,其状态从“0”变为“1”或从“1”变为“0”。
如果将一个JK触发器的输出连接到另一个并将它们级联,结果就是一个二进制计数器,其作用类似于里程表。这是因为当序列中的第一个JK触发器变为高电平然后变为低电平时,它会触发序列中的下一个触发器。每次连续添加一个JK触发器,时钟的频率(每秒打开和关闭的次数)减半。这就是JK触发器也被称为二分频电路的原因。四个JK触发器的结果模式将是0000,0001,0010,0011,0100等。 。 。
但是,对于本Instructable中描述的尽可能简单的计算机,还需要一些功能才能使计算机正常运行。为了使计算机能够重新启动其程序,它需要能够清除或将其所有输出设置为零。程序计数器还需要能够为JMP操作码加载二进制字,这允许计算机跳转到某个指令。逻辑门用于实现这一目标。幸运的是,对于我们来说,二进制计数器具有方便的芯片,具有您需要的所有功能。

第6步:注册

寄存器:

寄存器可能是计算机中最重要的部分。寄存器临时存储计算机操作期间的值。本Instructable中描述的8位计算机有两个连接到其ALU的寄存器,一个用于存储当前指令的寄存器和一个用于计算机输出的寄存器。

根据芯片的不同,寄存器将有2个或3个控制引脚。我们将使用的寄存器有两个控制引脚:输出使能和输入使能(低电平时都有效)。当输出使能引脚接地时,当前存储的二进制字通过输出引脚发送出去。当输入引脚接地时,输入引脚上的二进制字被加载到寄存器中。

在计算机上使用寄存器的一个例子是ALU上的累加器(执行数学运算的算术逻辑单元)。累加器就像存储ALU输出的计算机的暂存器。累加器也是ALU的第一个输入。 B寄存器是第二个输入。对于加法运算,第一个值被加载到累加器中。之后,将要添加到第一个值的第二个值加载到B寄存器中。累加器和B寄存器的输出熔断,并不断进入ALU。添加的最后一步是将操作的输出传送到累加器。

寄存器都在称为总线的共享数据线上运行。总线是一组与任何CPU的架构数量相等的线路。考虑到总线宽度是CPU架构的定义测量,这真的是把马放在推车前。由于数字1表示正电压,0表示接地,因此不可能让所有寄存器共用同一总线,而不能让它们有选择地连接和断开总线。幸运的是,对于我们来说,存在一个介于1和0之间的第三个状态,这个状态对于当前的输入非常有用。进入三态缓冲器:一个芯片,允许您有选择地将电线组连接到总线。使用这些三态缓冲器中的一些,您可以让整个需要通信的计算机上的每个寄存器和芯片共享与总线相同的线路。就我的电脑而言,它是一个8线宽的面包板插槽,横跨面包板的底部插针。试验公共汽车,因为它们在计算机中将所有信息从一个部分传递到另一个部分,故障的总线可能意味着错误的数据在线路上涟漪。

第7步:ALU

计算机的ALU(算术逻辑单元)是执行数学运算的部分。对于SAP计算机,它只需要有两个功能:加法和减法。二进制加法和减法与十进制加法和减法非常相似,例如:
1 < - Carry 1 1 < - Carry Bits
05 0101
+05 +0101
10 1010
要添加二进制文件,我们需要所谓的全加器。全加器通过进位和执行有效地将一位二进制加到另一位。全加器的进位就像加法过程的第三个输入。它们用于将多个完整加法器链接在一起。当在加法过程中存在一对1时,执行全加器的执行。全加器的执行被送入进位以添加多位二进制。要构建一个完整的加法器,您需要两个XOR门,两个AND门和一个OR门。
要减去二进制数,我们需要将数字转换为负数,并将其添加到我们减去的数字中。要做到这一点,我们使用所谓的2恭维。为了对二进制字进行2的补充,你将每个位反转(每0改为1,每1改为0)并加1。
5 = 0101, -5 = 1010+1 = 1011
未使用 - > 1 1
10 1010
+(-5) +1011
5 0101
为了控制位的反转,我们使用具有一个常低输入的XOR门。通常一个低输入,输出相当于另一个输入。将控制输入设置为高电平时,将反转另一个输入。如果我们将这个反转与发送到全加器的进位的位耦合,则结果是减法运算。

第8步:程序存储器和RAM

计算机的程序存储器将存储要执行的指令。它还可以充当可以在计算机运行期间存储值的RAM。程序存储器由三个主要部分组成:存储器,存储器地址寄存器(MAR)和多路复用器。内存是一个具有16字节存储空间的芯片。有一个四位地址被送入内存,告诉它应该读取或写入哪个字节。 MAR存储要从存储器读取或写入的字节的当前地址。除非计算机处于编程状态,否则它会不断地进入存储芯片。多路复用器允许您在两个输入之间进行选择并输出给定​​输入。我的计算机中使用的多路复用器允许您从两个四位输入(MAR和手动输入)中进行选择。当计算机处于编程状态时,手动地址将被送入内存,并允许您将字节编程到您定义的地址的计算机内存中。

第9步:指令寄存器

计算机的指令寄存器存储当前指令以及指令将操作的地址。它是一个非常简单的组件,具有非常重要的作用。在计算机运行期间,存储器中给定地址的内容被转移到指令寄存器中。在我的计算机中,最左边的fout位是要执行的OP代码或当前指令。右四位或最低四位告诉计算机用于操作的地址。前四位不断地将OP代码输入控制矩阵,该矩阵告诉计算机如何为给定指令做什么。最右边的四位反馈到计算机中,以便地址可以传输到MAR或程序计数器。

第10步:输出寄存器

如果计算机只是将总线的输出馈送给操作员,则读数几乎没有任何意义。这就是为什么有一个输出寄存器,其目的是存储用于输出的值。计算机的输出可以是显示原始二进制文件的简单LED,也可以是七段显示器上显示实际数字的显示器。这一切都取决于您想要将多少工作放入计算机。对于我的电脑,我使用一些IV-9俄罗斯Numitron电子管输出我的电脑和Arduino进行从二进制到十进制的转换。

第11步:时钟

计算机中的每个部件都必须完全同步才能正常运行。为了做到这一点,您的计算机需要一个时钟或电路,其输出以恒定速率打开和关闭。最简单的方法是使用555计时器。 555计时器是一个非常受欢迎的计时器,它是在计算机出现的时代发明的,这个计算机今天非常受到业余爱好者的欢迎。要构建555电路,您需要知道它是如何工作的。
首先,计算机的时钟应该相对较慢。 1Hz或每秒一个周期是一个很好的起始值。这允许您查看计算机的操作并检查是否有任何错误。 555芯片需要两个电阻和一个电容来运行。这两个电阻决定了高低脉冲的长度以及整个频率。电容器改变两者的脉冲长度。如果您对555计时器没有任何经验,我建议您尝试使用它们。
有用的链接:
http://en.wikipedia.org/wiki/555_timer_IC

第12步:架构

这是一切都在一起的步骤。是时候设计您的计算机的架构了。该体系结构是计算机的寄存器和不同组件的组织方式。设计方面完全取决于您,虽然它有助于牢记目标(您希望您的计算机做什么)和模型。如果您想在我的设计之后设计您的计算机,那就完全没问题了。我修改了SAP-1的体系结构 数字计算机电子 对于我的8位计算机。
要始终牢记的一个设计方面是如何在计算机的各个组件之间传输数据。最常见的方法是为计算机上的所有数据提供通用的“总线”。寄存器,ALU,程序计数器和RAM的输入和输出都连接到计算机的总线。导线按从最低有效位(1)到最高有效位(128)的顺序排列。
连接到总线的任何和所有输出必须在非活动状态下完全断开,否则它们将相互合并并导致错误输出。为此,我们使用三态缓冲区来控制默认输出的某些元素的输出,如累加器,ALU和计算机编程的实际输入。

步骤13:控制矩阵

计算机的控制矩阵告诉每个部件何时接受输入并输出其值。计算机中的每个操作都有多种状态。这些状态由一种称为环形计数器的计数器触发。环形计数器一次只有一位高,并连续循环其输出。例如,如果环形计数器有4个输出,它将首先使其第一个输出有效。在下一个时钟脉冲,它将第二个输出设置为高电平(和第一个低电平)。下一个时钟脉冲将使一位输出更高,依此类推。这些阶段称为T状态。此Instructable中的计算机使用6 T状态来操作一个命令。前三个T状态是所谓的取指周期,其中取出当前指令并将其置于指令寄存器中。程序计数器也加1。第二组三个T状态取决于从指令寄存器将OP代码馈送到控制矩阵中。 T州如下:
T1:程序计数器的内容被传送到存储器地址寄存器。 (地址状态)
Ť
2:程序计数器加1。 (增量状态)
T3:程序存储器中的寻址字节被转移到指令寄存器中。 (记忆状态)
T4:取决于正在执行的命令。
T5:取决于正在执行的命令。
T6:取决于正在执行的命令。
创建控制矩阵有两种主要方法:使用离散逻辑和使用ROM。 ROM方法是最简单,最有效的方法。使用离散逻辑涉及设计一个庞大的逻辑原理图,它将根据OP代码输入为您的计算机输出正确的控制字。 ROM代表只读存储器。您可以考虑在构建中使用几种类型的ROM。对于我的计算机,我最初使用EEPROM(电子可擦除可编程ROM),但在EEPROM芯片写入失败后转移到NVRAM(非易失性随机存取存储器)。我不建议使用NVRAM,因为它适用于随机存取存储器,而不是永久存储器。在我看来,EEPROM是最有效的解决方案。
控制矩阵将具有三个ROM芯片,每个芯片具有至少32个8位存储地址(以及定时和计数元件)。从控制矩阵发出的二进制字称为控制ROM,包含计算机每个组件的所有控制位。您希望确保组织控制位并了解它们的顺序。对于无操作,您需要一个控制字,使计算机的每个部分都处于非活动状态(当然除了时钟)。该Instructable中描述的计算机控制字长度为16位,存储在两个控制ROM芯片中。控制ROM芯片的前三个地址保存用于获取周期的控制字。芯片上的其余地址为每个OP代码保持三对控制字。第三ROM芯片保存用于每个OP代码的控制字序列的开始的存储器位置,并且由OP代码本身寻址。例如,在我的计算机中,如果给控件OP代码0110,它将输出二进制21,这是JMP命令启动的地址。 OP ROM和控制ROM之间有一个8位计数器,从0-2(前三个T状态)开始计数,然后在第三个T状态下加载OP ROM输出的地址,并从该位置开始计数直到T1州再次清理柜台。控制矩阵的环和二进制计数器由时钟脉冲的反转控制,以便当上升时钟脉冲到达计算机的元件时存在控制字。整个过程按顺序如下:
1.)T1状态将计数器清零,发送存储在0的控制字
2.)时钟变高并发生地址状态
3.)时钟变低,然后控制计数器递增,控制字1被发送出去
4.)时钟变高并且发生增量循环
5.)时钟变低,控制计数器增加到2,控制字2被发送出去
6.)时钟变为高电平且存储器状态发生,OP代码到达指令寄存器,T3也有效,这意味着在下一个低时钟脉冲时,OP控制地址将被加载
7.)时钟变为低电平,并为计数器加载给定OP代码的三个控制字中的第一个控制字的地址
8.)T4,T5和T6执行OP代码
9.)T1重置计数器,该过程继续,直到收到HLT OP。 HLT命令停止时钟。

步骤14:微程序设计

现在是您决定计算机能够使用哪些命令的部分。我给了我的计算机6个独特的操作,它将为我提供我需要的基本编程功能。您将在计算机中编程的命令就是所谓的汇编语言。汇编是最早的编程语言之一,至今仍可用于计算机。该语言中的命令包括加载累加器,添加,移动,输出和存储变量。每个命令在这个8位计算机中都有自己的4位OP代码。我为计算机选择的命令是:
NOP:没有操作。 (0000)
LDA:使用此地址处的值加载累加器。 (0001)
ADD:将指定地址的值添加到累加器中的值。 (0010)
SUB:从累加器中的值减去指定地址处的值。 (0011)
STO:将累加器的内容存储在指定的地址。 (0100)
OUT:将累加器的内容存储在输出寄存器中,以便操作员可以看到它。 (0101)
JMP:跳转到指定地址的内存中的某条指令。 (0110)
HLT:停止计算机的运行。 (0111)
要确定每个OP需要发送哪些控制字,您需要知道在每个T状态期间哪些位必须处于活动状态。对于我的计算机,我按如下方式组织了位(下划线表示低电平有效位):
CE CO J MI RO II IO OI BI EO SU AI AO RI HLT X.
CE - 计数使能(使能程序计数器的时钟输入)
CO - 时钟输出启用
J - 跳转启用
MI - MAR输入
RO - 程序内存输出
II - 指令寄存器
IO - 指令注册输出
OI - 输出寄存器
BI - B注册
EO - ALU输出使能
SU - 减去
AI - 累加器
AO - 累加器输出使能
RI - 程序存储器
HLT - 停止
X - 未使用
以下是给定指令的每个T状态应该激活的位以及它们应该在控制ROM中的地址:
取:
0:CO,MI - 程序计数器输出到MAR
1:CE - 计数器在下一个时钟脉冲时使能
2:RO,II - 寻址字节从RAM输出到指令寄存器
NOP:
3:X
4:X
5:X
LDA:
6:IO,MI - 指令寄存器中的地址被转移到MAR(最低4位)
7:RO,AI - 寻址的字节从存储器输出到累加器
8:X
加:
9:IO,MI - 指令寄存器中的地址被转移到MAR(最低4位)
10:RO,BI - 寻址的字节从存储器输出到累加器
11:EO,AI - 累加器和B寄存器的总和被加载到累加器中
SUB:
12:IO,MI - 指令寄存器中的地址被转移到MAR(最低4位)
13:RO,BI - 寻址的字节从存储器输出到累加器
14:AI,SU,EO - 累加器和B寄存器的差值被加载到累加器中
申通快递:
15:IO,MI - 指令寄存器中的地址被转移到MAR(最低4位)
16:AO,RO,RI - 累加器输出到寻址位置的程序存储器(RO和RI必须激活才能在我使用的芯片上写入)
17:X
OUT:
18:OI,AO - 累加器输出到输出寄存器
19:X
20:X
JMP:
21:J,IO - 指令寄存器以最低的4位加载程序计数器
22:X
23:X
HLT:
24:HLT - 暂停信号发送到时钟
25:X
26:X
您的OP ROM在每个存储位置包含三个的倍数。这当然是因为每个循环需要三个执行状态。因此,OP ROM的寻址数据将是:
0 - 3
1 - 6
2 - 9
3 - 12
4 - 15
5 - 18
6 - 21
7 - 24
要为您选择的芯片编程,您有许多不同的选择。您可以购买EEPROM和EPROM编程器,但它们通常需要花费相当多的钱。我为我的ROM构建了一个面包板编程器,它通过移动导线来操作,并通过按钮控制写入和读取启用引脚。后来我简化了这个过程,专门为我的NVRAM设计了一个Arduino程序员。我将附加代码,因为它可以很容易地修改,以编程几乎任何你将用于这个项目的并行内存芯片。

第15步:购买零件

构建一台8位计算机的好处在于,如果您从正确的位置购买它们,大多数部件将花费您不到一美元一块。我从Jameco Electronics购买了90%的零件,我对他们的服务非常满意。我从其他任何地方买到的唯一部件是面包板和面包板线(以及Numitron管)。在亚马逊这样的网站上可以发现这些便宜得多。务必确保您订购的零件是正确的。您购买的每个零件都应该有一份在线数据表,说明您购买的物品的所有功能和限制。确保将这些组织起来,因为您将在计算机构造中使用许多数据表。为了帮助您使用计算机,我将列出我用于我的部件:
4位计数器:
74161 - http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?freeText=74161&langId=-1&storeId=10001&productId=49664&search_type=jamecoall&catalogId=10001&ddkey=http:StoreCatalogDrillDownView
4位寄存器(每个8位寄存器使用2个):
74LS173 - http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?freeText=74LS173&langId=-1&storeId=10001&productId=46922&search_type=jamecoall&catalogId=10001&ddkey=http:StoreCatalogDrillDownView
2-1多路复用器:
74LS157 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_46771_-1
16x8 RAM(输出需要反转):
74189 - http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?freeText=74189&langId=-1&storeId=10001&productId=49883&search_type=jamecoall&catalogId=10001&ddkey=http:StoreCatalogDrillDownView
全加器:
74LS283 - http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?freeText=74LS283&langId=-1&storeId=10001&productId=47423&search_type=all&catalogId=10001&ddkey=http:StoreCatalogDrillDownView
三态缓冲器:
74S244 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_910750_-1

XOR盖茨:
74LS86 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_295751_-1
和盖茨:
74LS08 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_295401_-1
NOR Gates:
74LS02 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_283741_-1
逆变器:
74LS04 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_283792_-1
戒指柜台:
CD4029 - http://www.jameco.com/webapp/wcs/stores/servlet/ProductDisplay?freeText=4029&langId=-1&storeId=10001&productId=12925&search_type=jamecoall&catalogId=10001&ddkey=http:StoreCatalogDrillDownView
JK人字拖:
74LS10 - http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_295427_-1

第16步:构建

这里是耐心真正进入的地方。我选择在实际计算机上使用面包板,但是还有许多其他方法(例如绕线)也能正常工作。为了使事情变得更加简单,我在计算机的实际原理图中包含了一个框图。但我没有提供部件号或密码。我相信这会让事情变得更加简单和开放。 4位程序计数器输出,MAR输入和指令寄存器输出都连接到计算机总线的四个最低有效位。
显示的第二个图是计算机操作端的控制逻辑。控件的设计使得切换可以作为计算机的输入。 RS_NOR锁存器放置在拨动开关前面以对其进行去抖动。拨动开关通常具有脏连接,可能从开启状态反弹到关闭状态,并提供比您想要的脉冲更多的脉冲。将触发器添加到切换器的输出消除了额外的脉冲。这在使用手动时钟选项时非常有用。您不希望翻转开关并启动8个时钟脉冲。读/写按钮将有效输入字节写入已寻址的存储器。通过将输入到RAM的默认控制字更改为两个低RO和RI位来启动写周期。运行/程序开关改变存储器地址多路复用器上的哪个输入有效。 555之后的JK触发器意味着当计算机运行时,它不会在时钟脉冲的中间启动。低HLT信号将使时钟停止通过手动时钟或555.最后,运行/清除开关连接到计算机上的所有清除引脚,例如寄存器和计数器上的引脚。

第17步:编程

现在计算机已完成,可对其进行编程以执行指令。要做到这一点,首先必须将运行/程序切换开关转到程序位置,将计算机置于程序设置中。之后,您选择从0开始并转到15的地址,并为您的程序插入所需的数据。例如,从5开始并在每个输出中添加4,程序将如下所示:
地址 - 数据:
0000 - 00010111 LDA 7:使用存储器地址7(5)中存储的值装载累加器
0001 - 00101000 ADD 8:添加存储在存储器地址8(4)的值
0010 - 01010000 OUT:输出累加器
0011 - 01100001 JMP 1:跳转到指令1
0100 - X.
0101 - X.
0110 - X.
0111 - 00000101 5
1000 - 00000100 4
1001 - X.
1010 - X.
1011 - X.
1100 - X.
1101 - X.
1110 - X.
1111 - X.

第18步:继续前进

我希望你喜欢这个Instructable,最重要的是,我希望你能从中获得一些东西。您可以将所有这些艰苦的工作视为非常有价值的学习体验,让您更好地了解电子,计算机和编程。最后,您还将拥有一些非常酷的东西来展示您的所有辛勤工作。
构建完第一台8位计算机后,您可以进一步添加更多功能。这台计算机中使用的ALU操作非常简单,真正的ALU现在具有无数的功能,如位移和逻辑比较。进入的另一个重要方面是条件分支。条件分支意味着指令取决于ALU设置的标志的当前状态。当累加器的内容变为负数或等于零时,这些标志会发生变化。这为您的计算机应用提供了更广泛的可能性。
如果您对此项目有任何疑问,请随时对此Instructable或我的网站http://8-bitspaghetti.com发表评论。祝你在这个项目上好运。

3个人做了这个项目!

  • JamesP383成功了!

  • xdola成功了!

  • 真实的做到了!

你做这个项目了吗?与我们分享!

建议

  • 复古外观媒体电脑从旧笔记本电脑

  • Digi-Comp II副本

  • 物联网类

  • 彩虹比赛的颜色

  • 课堂科学竞赛

  • 粉丝竞赛

173讨论

0

AtomicFerryt

1年以前

你认为你可以为主板制作数字图吗?我以前从未使用过面包板,但对旧电脑很感兴趣。

0

FarsinHamza

1年以前

我见过的美丽教练之一….我感谢你的耐心…… :)

0

bob491

1年以前

这是一个非常好的书面和详细的instructables,也非常酷。谢谢。

0

champ12345

1年以前

看起来有点复杂

0

mkpeker

1年以前

很好的构建。你可能想检查我最简单的4位ttl cpu(MP-4)来理解基础知识:

http://www.instructables.com/id/Simplest-4-Bit-TTL-CPU/

0

mkpeker

2年前

好的项目可能是你想看看我的;

最后,我的监视器类型OS(带内联汇编器和反汇编器)已准备就绪
请设置并尝试此v1.0b
您可以在我的Efex页面中找到所有必要的信息;

http://mkpeker.wixsite.com/efex

请把你的意见发给我,而不是我可以改进软件
谢谢

0

TheMrCode

2年前

如果你用LED而不是电线制作它会怎么样?你能看到信号的去向吗?

0

GeorgeW134

2年前

你会如何编写if语句?

2回复 0

JuliaS87GeorgeW134

回复2年前

您不需要新的操作码。你需要的是一个表示true和false的值为1和0.你将该值加载到累加器中并减去1.然后你进行条件跳转。如果值为1(真),则减法将导致溢出并执行条件跳转。如果值为0(假),则不会发生溢出,因此不会发生跳转。

0

calebj20GeorgeW134

回复2年前

由于存在一个寄存器(累加器)存储来自ALU的前一个和,您可以检查结果是否给出负数,正数或零数,然后可以添加一个新的操作码来检查该状态并跳转,如果条件是真正。
例如

4 - 10 = -6 - > -6为负,因此任何N位设置为1的分支命令都会跳转

程序集:BRN RA这将分支负数存储在A中的位置

二进制假设操作码是1000:10001000

这是操作码的位分解

BR:1000

N:1 | 0

Z:1 | 0

P:1 | 0

0: 0 | 0

此外,如果你想让它更通用你可以尝试添加B设置总线值的能力,然后最后一位'0'可以分别为A或B为0或1。

0

T0BY

2年前

Crikey,你有一些耐心!

0

SuperNovaa41

2年前

我有一个问题。列表中的所有部分都在那里,但2除外。
三态缓冲器和jk触发器
有一个不同的网站与三态缓冲区具有相同的模型

没有JK触发器更换,我是否必须使用确切的
您列出的型号相同,或者我可以使用其他型号?如果是这样的话
我应该使用哪种型号?

0

SuperNovaa41

2年前

嘿!我知道这是一个较旧的帖子,但你能给我一些Tri State Buffers和JK Flip Flops的更新链接吗?我试过研究产品,但我不知道使用哪种型号。提前致谢!

0

BartH19

2年前

我有兴趣制作一个简单的CPU,我可以使用它在LED或甚至LCD屏幕上打字。这是我的项目还是你能指点我更好的方向吗?

我是一个完整的新手。我是一个试图制作某种木制电脑的木匠!

5个回复 0

FinnW3BartH19

回复2年前

而不是构建CPU,你应该建立一个木箱的计算机。计算机可能会花费相当多的钱,但实际上它可以低于300美元。尝试使用此站点:pcpartpicker.com

0

BartH19FinnW3

回复2年前

谢谢你。我希望有足够的零件。我希望它像一个单词的计算器。我会查看链接:D

0

KyleF45BartH19

回复2年前

如果你想要它做的只是充当计算器,你可能想看看Raspberry Pi。它会更小更便宜,Pi就像手机的大小。

0

KyleF45KyleF45

回复2年前

现在我想到了,Pi几乎可以做任何完整的台式电脑,它只是小得多。您可以使用某种软件。

0

BartH19KyleF45

回复2年前

谢谢你的回复:D

在我最初的评论之后不久,我发现了这个人:http://www.etsy.com/shop/writeotron?ref = unav_lis …

我们将合作开发一个新的。这是一个Pi!

0

bharathis

2年前

它很精彩,鼓励我自己做一个..

我肯定会按“我做到了”。我有点在建立它。嘻嘻它真棒的数字电子产品