CPU原理学习

发布时间 2023-11-28 14:09:30作者: cyhnanana

本文是对B站踌躇月光大佬的8位二进制CPU实现教程的学习记录 非常感谢这位大大能够提供这么好的教程!!!OvO

半加法器

  • 半加器是指对输入的两个一位二进制数相加(A与B),输出一个结果位(S)和进位(C),没有进位的输入加法器电路,是一个实现一位二进制数的加法电路。

计算公式:

S = A^B (A异或B)
C = A&B (A与B)

真值表

A B S C
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1

电路实现

全加法器

  • 全加器是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器。一位全加器可以处理低位进位,并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。

输入:
A:数值a
B:数值b
Cl: 进位输入
输出:
S:结果sum
C: 进位carry


真值表:

A B Cl S C
0 0 0 0 0
0 0 1 1 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

  • 用两个半加器实现全加器

电路实现:

8位加法器

  • 通过8个全加器级联来实现8位加发器

输入:
A:数值a
B:数值b
Cl: 进位输入
输出:
S:结果sum
C: 进位carry


电路实现:

LED数码管


  • 不同的位控制不同的发光部件,从第0位到第7位,通过控制不同的LED来组合出数字

  • 电路测试:下图是控制数码管的 0 1 2 位来点亮 下图的LED灯管 可以看到发光的LED灯管组成了数字"7"

七段十六进制数码管


  • 利用七段数码管来显示16进制的数字 \
  • 通过四位二进制的输入来显示 0 到 F 十六进制符号

可以通过 ROM 来映射数据 将0到7位的二进制数,转为16进制数写入ROM即可

符号 8位二进制 十六进制
0 0011 1111 3F
1 0011 0000 30
2 0101 1011 5B
3 0101 1111 4F
4 0110 0110 66
5 0110 1101 6D
6 0111 1101 7D
7 0000 0111 7
8 0111 1111 7F
9 0110 1111 6F
A 0111 0111 77
B 0111 1100 7C
C 0011 1001 39
D 0101 1100 5E
E 0111 1001 79
F 0111 0001 71

将上述的十六进制数字填入ROM储存单元中 结果如下图所示

双十六进制数码管译码电路

  • 将一个8位二进制数 用两个7段数码管来显示
  • 将两个十六进制数码管并联 即为十六进制数码管

将十六进制数码管放到之前的加法器中测试

七段数码管十进制显示

  • 将一个8位二进制数 用三个7段数码管来显示
  • 将 0到255 这256个数字写入到 ROM 储存单元中

  • 将这个数据表命名为:test.bin 另存到桌面 然后用VsCode打开 这个二进制文件 (需安装Hex Editor插件才能显示数据)

  • 用python脚本来写入数据 在桌面新建 test.py

import os

// 获得当前文件所在的目录
dirname = os.path.dirname(os.path.abspath(__file__)) 

// 将 0-255 以小端序的方式写入 test.bin 文件里
with open(os.path.join(dirname, 'test.bin'), 'wb') as file:
    for var in range(256):
        var = str(var)
        var = int(var, base=16)
        byte = var.to_bytes(2, byteorder='little') 
        file.write(byte)

运行 test.py 后可以看到数据写入了 test.bin 中 如下图

将十进制数码管放到加法器中测试 如下图