制作一个能做加法运算的计算机
上一节我们制作的计算机只能通过指令来控制“十六进制数码管”的显示。本节,我们来把电路稍稍改造成如下图所示的样子,增加一个加法器,并在“加法器”和“十六进制数码管”的输入端串联一个“触发器”用来缓存数据。同时我们增加了一根竖直的导线,把各种元件统一连接在一起,起到汇总的作用,所以它还有个名字,叫做“总线”。另外,由于加法器的输出和ROM数据的输出同时连接到总线上,所以我们使用了“断路控制器”通过信号控制来防止它们同时起作用而造成短路现象。
现在我们开始编写指令来实现2+3运算,并把结果显示在“十六进制数码管”上。在编写指令之前,我们先来看下“只读存储器”多出来的输出端都是做什么的。
- D3~D0和前一节相同,输出下一条指令的地址
- D7~D4和前一节相同,输出指令中携带的数据
- D8控制D7~D4是否连接到总线上
- D9控制总线数据是否传输到“十六进制数码管”的寄存器中。
- D10控制加法器的输出端是否连接到总线上
- D11控制总线数据是否传输到加法器的输入端1
- D12控制总线数据是否传输到加法器的输入端2
这次“只读存储器”多出来的输出端D12~D8全部都是控制信号,主要负责各个元件的输入输出端何时连接到总线,用以完成各种复杂功能。我把编写好的用以实现2+3运算的指令列在如下的表格中。
地址 | D3~D0 | D7~D4 | D8 | D9 | D10 | D11 | D12 | 十六进制 |
---|---|---|---|---|---|---|---|---|
0000 | 0001 | 0010 | 1 | 0 | 0 | 0 | 0 | 0x121 |
0001 | 0010 | 0010 | 1 | 0 | 0 | 1 | 0 | 0x922 |
0010 | 0011 | 0011 | 1 | 0 | 0 | 0 | 0 | 0x133 |
0011 | 0100 | 0011 | 1 | 0 | 0 | 0 | 1 | 0x1134 |
0100 | 0101 | 0000 | 0 | 0 | 1 | 0 | 0 | 0x405 |
0101 | 0000 | 0000 | 0 | 1 | 1 | 0 | 0 | 0x600 |
我们来逐条分析下这些指令是如何工作的:
地址0000:设置D8=1,使D7~D4的数据0010传送到总线
地址0001:设置D11=1使加法器的“输入端1”由0变成1,总线数据0010被保存到加法器的寄存器1里
地址0010:设置D8=1,使D7~D4的数据0011传送到总线
地址0011:设置D12=1使加法器的“输入端2”由0变成1,总线数据0011被传送到加法器的寄存器2里
地址0100:设置D10=1,使加法器输出的计算的结果传送到总线
地址0101:设置D9=1,把总线数据传送给“十六进制数码管”显示出来
最终它的演示动画如下图所示。