1 简单累加器的设计
上述手动累加器的缺陷:
改进后使用RAM保存数据的累加器:
这个改进后的电路执行流程:
这个电路也存在缺点,如下所示:
2 引入指令集
1 设计要求
2 数据在 RAM 种的存储形式:
3 构建最简单的指令集(加载、累加、保存、退出):
指令执行流程:
指令代码的组成:
指令代码的存储:
将数据和指令分开存放,分别保存至两个RAM中(地址一一对应),在计数器轮询地址时,同时访问。如下所示:
构建指令数和电路:
每条指令,都对应着一部分电路,执行指令就是电路操作。
数据RAM和指令RAM的对比如下所示:
实现指令控制数据操作行为的电路设计:
继续增加功能(+减法运算):
3 多位数据计算
上面的电路已经比较完美了,能实现8位数据的加减法计算。如何实现16位数据的计算?
解决方案:高8位和低8位分别计算和分别存储。
数据RAM 和 操作指令RAM 如下所示:
如何处理低位字节向高位字节的进位?
在上面的自动累加加法器电路中,可以加一个进位位。因此可以将低字节的进位,保存至1位锁存器(进位锁存器),增加一条进位加法指令(Add with Carry),自动处理进位运算。
16位进位加法运算的数据RAM和指令RAM:
同理,可以增加借位减法指令。
上面的加点法自动操作电路仍然有缺陷,如下所示:
4 修改指令集 — 地址(指针)
1 新指令代码的构成:
注意,新指令集的数据RAM和代码RAM不再是同时访问的。
2 16位数据—新指令集运算:
3 电路实现过程:
这个电路,相对于原电路而言,数据RAM没变,但指令长度增加了很多,有什么影响?
5 数据和指令一起存放
根据上面的电路,其实完全可以将数据和代码放置在同一片RAM中,只要起始地址分开就可以。做法如下:
使用这种方式计算时,内存空间的布局如下所示:
这种方式的实现原理,就是代码段和数据段分开存放。但仍存在一个问题,如果再增加几次运算,如何修改?
修改后的RAM布局如下:
要从第一段代码的停止地址跳转到第二段代码的起始地址,如何实现?
6 JUMP跳转指令
JUMP跳转指令可以通过设置异步置位计数器的 设置/清除 位来实现:
JUMP指令对应的电路如下所示:
7 条件跳转
1 计算机如何执行乘法运算?
本质上计算机只能进行加法运算,而乘法其实就是将加法运算重复执行很多次。
乘法计算的过程:
加入 JUMP 指令:
需要增加的电路元件:
新增加的 JUMP 条件跳转指令:
条件跳转的程序设计:
考虑实际的电路实现,可以将零标志位的输出取反,连接到置位线上。当循环递减次数没到时,零标志位为0,取反结果为1,导致JUMP跳转执行;当循环完成时,零标志位置1,取反结果为0,置位线为低电平,计数器按顺序执行。
8 处理器设计
计算机组成结构:
上面设计构建的CPU说明:
9 汇编语言
指令集到汇编语言:
指令和数据在RAM中的存储地址:
之前的乘法过程使用汇编语言表述: