本文是对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 中 如下图
将十进制数码管放到加法器中测试 如下图
标签:十六进制,0111,二进制,学习,数码管,全加器,原理,CPU,进位 From: https://www.cnblogs.com/cyhnanana/p/17801825.html