接着上篇的内容,继续设计剩余的功能
一、组合
1、通过PC计数器逐条读取内存中的数据进行计算
将前面几步做的所有电路单元进行组合,形成有PC寄存器 和内存单元的 计算单元
以上我们是通过点击的方式模拟时钟信号的,但真正的时钟信号是一个周期性循环的 震荡信号。如果我们将其换成震荡时钟信号后,会发现程序计数器会反复从 0,1,2,3,4,5,6,7 ,0,1,2,3,4,5,6,7….执行。,进而使得内存中的数据被反复的累加。而不是累加一遍就结束。
因此,我们需要对计算的过程,进行一定的控制。
2、添加控制信号、指令
数据RAM的地址和值
数据RAM里的8个数据,进行累加后,和为147,
如果没有halt信号控制,时钟信号上升到来,结果会继续累加地址为0的寄存器中的值 即 147+10 =157。此时,halt信号=0,clock信号 =0,累加中断。
所以我们要设计一个功能:初始计算时,halt =1; 当PC计数器计算到7时,halt =0,中断计算。
加一个比较器即可:
注意:此电路有个bug,无法加到最后一个地址块的数据,后面再修改
我们对时钟周期进行分析:
时钟周期 | PC输出(数据存储的地址) | RAM输出 | AC寄存器输出 | ALU-sel 控制信号 |
0 | 0 (0x000) | 10 | 0 | 00 |
1 | 1 (0x001) | 9 | 10 | 00 |
2 | 2 (0x010) | 21 | 19 | 00 |
3 | 3 (0x011) | 17 | 40 | 00 |
4 | 4 (0x100) | 30 | 57 | 00 |
5 | 5 (0x101) | 11 | 87 | 00 |
6 | 6 (0x110) | 8 | 98 | 00 |
7 | 7 (0x111) | 41 | 106 | 00 |
现在我们考虑,让ALU不仅仅可以做加法,还可以执行如 10+9+21-17 的操作。
因此,我们考虑添加一块指令存储器,用来存储ALU的操作模式。
3、添加一块指令存储器
指令寄存器中,存储着ALU的加减顺序,注意,它实际进行的操作顺序是:
0+10+9+21-17+30+11-8+41 ,一共8个操作符。
此电路中改进了上面提到的少算一位的问题,将输出结果接在了ALU计算单元之后,而不是AC存储的中间结果之后。
接下来,我们要对电路进行改造,把指令整合:
数据RAM 中的内容:
1)在第15位加入halt信号
实现 “10+9+21-17、 停止”
可以看到,结果多加了一次,正常结果应该是23。
出现这种情况的原因,上面也分析过,当En开关打开后,AC寄存器是一直工作的,每一次clock上升沿,都会把数据写入ALU的 输入口,相当于执行了一次 A+B,我们现在需要实现,在一个计算周期内,halt信号到来,寄存器关闭,或者说,寄存器Q给A输入一个 0 值,而不是上一次累加的结果。
2)实现ld
3)实现Str 写入功能
回忆一下,8位16bit寄存器的实现电路:
str是一个允许写入的使能信号,D 是将要被录入的数据,ld是允许从寄存器中读出数据