1. 引言
本教程将教你在手摇式计算机的基础上,完成硬布线计算机和冯·诺依曼体系结构的程序存储计算机的搭建:
硬布线计算机: 通过时序电路将固定的控制信号序列固化在硬件逻辑中,使计算机能够自动执行指令,实现从“手动控制”到“硬件自动控制”的跨越。
冯·诺依曼体系结构的程序存储计算机: 将指令以二进制代码预先存储在存储器中,由程序计数器依次取出并执行,真正体现了“存储程序”的核心思想,是现代计算机体系结构的基石。
本教程将使用Logisim Evolution 3.9.0和Logisim 2.7.1两个版本进行演示。
*注:如果出现连线正确却不知道什么原因报错,保存后重新打开即可。
2. 准备工作
在开始搭建之前,请确保你已经准备好以下电路:
RS 触发器版简单运算器(加法):【Logisim】手动版和RS触发器版简单运算器(加法)的详细教程
8 位 4-16 译码器:【Logisim】2-4,3-8与4-16译码器的详细教程
完成以上准备工作后,你已经拥有了一个结构清晰、组件就绪的项目框架。接下来,我们将在此基础上分别搭建硬布线计算机和冯·诺依曼体系结构的程序存储计算机。
3. 硬布线计算机
硬布线控制器的核心思想是:将加法运算所需的控制信号序列“固化”在时序电路(如 4-16 译码器)中。时钟信号驱动译码器依次输出 16 个节拍,每个节拍对应一组预定的控制信号,自动完成从取数、运算到输出的全部步骤。
3.1 核心原理
步骤整理:经过对RS触发器版简单运算器实验步骤的整理,我们可以得到以下 16 个控制节拍:
打开键盘三态门,允许当前键盘数据进入系统总线(step1=1)
打开显示寄存器,把当前系统总线数据传入数码管(step9=1);打开进三态门,允许数据进入线路1(step3=1)
关闭显示寄存器(step9=0);打开数码管显示(step10=1);打开累加器,把数据寄存到片内总线(step4=1),此时数码管显示“07”
关闭累加器(step4=0);打开暂存器2,把数据寄存到线路3(step6=1)
关闭暂存器2(step6=0),关闭键盘三态门(step1=0)
打开键盘寄存器三态门,允许键盘寄存器数据进入系统总线(step2=1)
打开显示寄存器,把当前系统总线数据传入数码管(step9=1),打开累加器,把数据存到片内总线(step4=1),此时数码管显示“5C”
关闭显示寄存器(step9=0),关闭累加器(step4=0)
打开暂存器1,把数据寄存到线路2(step5=1)
关闭暂存器1(step5=0),关闭进三态门(step3=0),关闭键盘寄存器三态门(step2=0)
打开传输结果三态门,允许结果数据进入线路1(step7=1)
打开累加器,结果寄存到片内总线(step4=1)
关闭累加器(step4=0),关闭传输结果三态门(step7=0)
打开出三态门,传输结果到总线(step8=1)
打开显示三态门,把当前系统总线数据传入数码管(step9=1),此时数码管显示“63”
关闭显示三态门(step9=0),关闭出三态门(step8=0),关闭数码管显示(step10=0)
控制思路:将这 16 个节拍固化为 16 个控制信号序列。用 4 位计数器依次产生 0~15 的二进制计数值,通过 4-16 译码器将二进制码转换为 16 个独热输出信号,依次激活对应隧道的 RS 触发器的“置1”端或“置0”端,来达到控制目的。
3.2 搭建步骤
新建一个电路,命名为 “Hardwired_Computer”。
把我们的 RS触发器版计算机“HandCrank_RS”复制到这个新电路中。
在 RS 触发器下方水平拉出 16 根导线,作为控制线。
Logisim Evolution:
Logisim:
按上述 16 个节拍,把对应 RS 触发器的“置1”输入端和“置0”输入端依次连接 16 根导线(高位在上,低位在下),一个输入端对应多根控制导线需用或门连接。
Logisim Evolution:
Logisim:
拖拽出一个 4-16 译码器,译码器的输出端分别连接这 16 根导线(高位在上,低位在下)。
从“线路(Wiring)”库拖拽出一个“分线器/分离器(Splitter)”,设置“支路/输出(Fan Out)”和“位宽(Bit Width In)”都为 4,并调整成高位在上,低位在下 。
Logisim Evolution:
Logisim:
分线器/分离器的 4 支路输出端连接译码器的 4 位输入端。
从“存储器(Memory)”库拖拽出一个“计数器(Counter)”,设置“数据位宽(Data Bits)”为 4。
计数器的“输出(Output)”端连接分线器/分离器的 1 支路输入端。
从“线路(Wiring)”库拖拽出一个“时钟(Clock)”,计数器的“时钟”端输入连接这个时钟按钮。
Logisim Evolution:
Logisim:
3.3 成果验证
我们可以尝试计算 5C + 07 = 63 ,步骤如下:
输入并寄存第一个加数:
在键盘中输入“5”和“C”(键盘输入寄存器模块 H5=1,L12=1)
打开键盘寄存器,给它一个上升沿,把这个数据存入寄存器(键盘输入寄存器模块 On_Reg=1)
关闭键盘寄存器(键盘输入寄存器模块 On_Reg=0)
输入第二个加数:
在键盘中输入“0”和“7”(键盘输入寄存器模块 H5=0,L12=0,H0=1,L7=1)
启动时钟模拟:
点击顶部菜单栏“模拟(Simulate)” →“启动时钟模拟(Ticks Enabled)” ,可以看到计数器依次激活信号。
结束时钟模拟:
再次点击顶部菜单栏“模拟(Simulate)” →“启动时钟模拟(Ticks Enabled)” ,可以关闭时钟模拟。
4. 冯·诺依曼体系结构的程序存储计算机
冯·诺依曼程序存储控制器的核心思想是:将运算所需的全部控制信号以二进制代码的形式预先写入 ROM,每条代码对应一个时钟周期内的控制信号组合,称为“微指令”。多条微指令按顺序执行,共同完成一条机器指令的操作。计算机启动后,程序计数器(PC)从 0 开始依次递增,逐条取出 ROM 中的微指令并执行,自动完成整个计算过程。
4.1 核心原理
控制思路:观察硬布线计算机的工作过程可以发现,4-16译码器输出的 16 个节拍实际上是“按顺序排列的控制信号序列”。如果我们把这个序列记录下来——即把每个节拍对应的 step1~step10 的组合整理成一条十六进制微指令——就可以将这些微指令预先存入 ROM 中。运行时,计数器依次递增,逐条读取 ROM 中的微指令并执行。这样,控制信号不再来自硬件译码器,而是来自 ROM 中存储的指令,实现了从“硬布线”到“程序存储”的演进。
指令整理:
| 步骤 |
step10 |
step9 |
step8 |
step7 |
step6 |
step5 |
step4 |
step3 |
step2 |
step1 |
指令 |
| 1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
001 |
| 2 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
105 |
| 3 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
20d |
| 4 |
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
225 |
| 5 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
204 |
| 6 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
206 |
| 7 |
1 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
0 |
30e |
| 8 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
206 |
| 9 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
216 |
| 10 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
200 |
| 11 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
240 |
| 12 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
248 |
| 13 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
200 |
| 14 |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
280 |
| 15 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
380 |
| 16 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
000 |
4.2 搭建步骤
新建一个电路,命名为 “StoredProgram_Computer”。
把我们的硬布线计算机“Hardwired_Computer”复制到这个新电路中。
删除硬布线控制器中的 4-16 译码器,译码器到各控制端的连线和 RS 触发器,仅保留 10 个隧道“step10~step1” 和 1 个计数器及时钟按钮。
从“线路(Wiring)”库拖拽出一个“分线器/分离器(Splitter)”,设置“支路/输出(Fan Out)”和“位宽(Bit Width In)”都为 10。
分线器/分离器的 10 支路输出端依次连接隧道“step1~step10”,注意高位连接高位,低位连接低位(第 9 位连接隧道 step10…第 0 位连接隧道 step1)。
Logisim Evolution:
Logisim:
从“存储器(Memory)”库拖拽出一个“只读存储器(ROM)”,设置“地址位宽(Address Bit Width)”为 4 ,“数据位宽(Data Bit Width)”为 10 。
Logisim Evolution:
Logisim:
只读存储器(ROM)的“数据(Data)”端连接分线器/分离器 1 支路输入端。
只读存储器(ROM)的“地址(Address)”端连接计数器的“输出(Output)”端。
Logisim Evolution:
Logisim:
右键只读存储器,点击“编辑内容(Edit Contents…)”,在表格中依次填写我们刚刚整理的 16 条十六进制指令,填写完后选择“关闭窗口(Close Window)”。
Logisim Evolution:
Logisim:
最终结果如下:
Logisim Evolution:
Logisim:
4.3 成果验证
我们可以尝试计算 5C + 07 = 63 ,步骤如下:
输入并寄存第一个加数:
在键盘中输入“5”和“C”(键盘输入寄存器模块 H5=1,L12=1)
打开键盘寄存器,给它一个上升沿,把这个数据存入寄存器(键盘输入寄存器模块 On_Reg=1)
关闭键盘寄存器(键盘输入寄存器模块 On_Reg=0)
输入第二个加数:
在键盘中输入“0”和“7”(键盘输入寄存器模块 H5=0,L12=0,H0=1,L7=1)
启动时钟模拟:
点击顶部菜单栏“模拟(Simulate)” →“启动时钟模拟(Ticks Enabled)” ,可以看到计数器依次激活信号。
结束时钟模拟:
再次点击顶部菜单栏“模拟(Simulate)” →“启动时钟模拟(Ticks Enabled)” ,可以关闭时钟模拟。
5. 总结
通过本教程的实践,你完成了从固定功能的硬布线计算机到具有“存储程序”能力的冯·诺依曼结构计算机的跨越。
这个简单的模型包含了真实CPU的诸多核心概念:状态机、时钟同步、总线、存储器分层、取指-执行周期。尽管它只能做加法,但其架构思想是通用的。你可以在此基础上继续探索,例如增加更多的指令(减法、移位)、实现条件跳转,甚至引入中断机制,从而让这个Logisim模型变得更加强大和有趣。
希望这次搭建之旅能帮助你夯实计算机组成原理的基础,并激发你进一步探索计算机系统奥秘的兴趣。