物理 关于如何尝试使用数电构建计算器
不讲我的世界和图灵完备!游戏仅为演示载体!!!
注:图灵完备现在可用于提交部分大学计算机系的作业,故只认为它是游戏而一棒子打死是不可取的。
更新日期:2026.7.27
更新内容:数显
U233核素の碎碎念:基本完结咯!
有问题可以在评论区提问,我看到了会回答的。
本贴是该贴的续集,由于本人的pad论坛被删,只能通过出续集改到O-box区。
警告:阅读本贴需要一定数电基础,建议先学习该贴再尝试理解本贴!
(我布线不是特别好,别杠,谢谢!)
Node02:输入
在基础计算单元完成的前提下,我们需要考虑将我们的数据输入计算器。
2.1:映射法
将每一个数字(左边的4个按键,这里以0~3,即使用分别表示1和2的两条信号线,下1上2适配上贴的加法器做范例)映射到每一条信号线上,随后锁存,防呆防傻,在计算完成后可以通过复位按钮(最右边按钮)取消锁存。(最左边的对应0的按钮只是占位,实际上并不接入电路)

全局俯视图
2.1.1:映射部分
很明显很简单,最上层是锁存信号线无需在意,俯视图中靠上的部分才是映射的核心,按下按钮时解锁放置于信号线(中间横穿的两根线)上方的红石火把向下激活信号线。

映射部分俯视图

映射部分前视图(懒不想再隔离一层了,其实前面隔一格再加一个墙,按钮位置不变,中间用中继器链接就可以了)
2.1.2:锁存区
该区域比较复杂,请量力而行。
俯视图左上角连接映射区的上层信号线,高电平意味着需要激活锁存。
左上角的两个红石中继器负责锁存锁存信号(套娃),左下的活塞(灰色和黄色的)和标靶(红白相间的)负责复位,活塞失去信号后拉开标靶,断开锁存锁存信号的信号(说明这其实是正反馈系统),上方深灰色方块下方的锁存模块(两组浅灰色红石中继器)失去锁存信号,停止锁存,信号归零;正中间的两个中继器中右边那个将左右两个信号线输出时间对齐,左边中继器传输锁存信号到显示器,灯亮代表正在锁存,灯灭代表未在锁存/复位已完成

锁存处理区俯视图

复位部分前视图(中间的是锁存指示灯)
2.2 拨号法
显然,上文的映射法无法满足4位十进制的“大数”的计算,这时我们就要考虑新的方法——存储法!
本区域只是看起来复杂,实际上受限于游戏空间单位大小才显得复杂,实际上就是将
1 2 3
4 5 6
7 8 9
0
映射到
0 1 2 3 4 5 6 7 8 9
的数据线上即可。

拨号盘正面

拨号盘区域俯视图
Node03:计算(此部分后线路复杂,改用图灵完备演示)
考虑一个计算器,上面是不是有一个显示屏(即缓存区)?本方法与它相同,通过输入十进制数字后将其转换为bcd码再转换为bin码计算(bcd就是每一个十进制的数字对应一个4位2进制的码,例如358对应0011 0101 1000。bin码就是二进制码)。
小贴士:S=1位开关 OR=或门 AND=与门 MUX=选通器
SHL=将输入左移n位 N=1位取反 ON=输出高电平 SWC=8/16/32/64位开关
模块左边有一个端口,右边有多个端口且有多个白色向右三角形的是分线器,
模块左边有多个端口,右边有一个端口且仅有一个白色向右三角形的是合线器
ADD=全加器 NEG=求其补码 MUL=乘法器 DIV=除法器
3.1:10进制数字线转bcd

如图。简单的映射关系。
3.2:bcd转bin

获得了bcd码之后,我们要把它转换为bin码以便乘除法的计算,所以我们可以选择简单粗暴的a=a*10+b的方法,寄存器保存了a,在输入一个新数之后将a*10(即将a左移1位和3位后相加)和b(新数)相加,得到新的a,这个a就是当前输入的数的bin码了。(最左有一个红标一入一出元件是延迟线,在延迟一时钟刻后输出输入的值)
思考:为什么作为bcd码的b可以直接加到bin码的a上?不会导致循环依赖造成信号未定义吗?
3.3:计算引擎
本区域可以分为左右两块区域。
左一小半边是两个数的存储区域,(最上面还有一个两入一出的元件,那个是1bit存储器)但我们没必要存储两个数,事实上一个就够了,所以我们通过一个1bit存储器标记现在导入的是第几个数,存储了0则说明是第1个数,需要被存放于1bit存储器下方的那个32bit存储器;反之则意味着计算条件齐备,可以开始计算,于是输入值被导入下信号总线,同时上方寄存器读取,值导入上信号总线。
右边则是通过左下引来的四根信号线选择正确的计算模块进行运算,除法模块前面的选通器是为了防止不开启时输入0做除数报错,现实可以删除。
思考:真的需要4根线来选择正确的计算模块吗?最少需要多少?(警告:在同一周期内,可以单独导入一个值,但也可以在导入一个值后计算)
3.4:bin->bcd
BIN->BCD通常采用每个BCD位满5加3的方法转换,举个例子吧:我们要转换185(10111001):
首先在BIN位左侧放上12位的BCD位:0000 0000 0000 10111001
将它左移为0000 0000 0001 01110010:左侧区域下四位没有满5
将它左移为0000 0000 0010 11100100:左侧区域下四位没有满5
将它左移为0000 0000 0101 11001000:左侧区域下四位满5了!于是+3(011),
变为0000 0000 1000 11001000
继续左移为0000 0001 0001 10010000
左移为0000 0010 0011 00100000
左移为0000 0100 0110 01000000,下四位满5了!
变为0000 0100 1001 01000000
继续0000 1001 0010 10000000,中间四位满5了!
变为0000 1100 0010 10000000
继续0001 1000 0101 00000000
可以发现原8位区域空了,仔细观察左侧12位:0001 1000 0101,185!正是我们想要的!
电路如图所示:
我奶奶看见了跟我说:呦不错嘛,会织斜的花纹了。
中间的那些青色元件是自定义的,它的定义是这样的:

那个4bitADD是自定义的4bit+4bit的全加器减少门开销,输入输出均用8bit线。
看起来很复杂对吧?复杂就对了,毕竟这是单周期64位BIN转BCD。
思考:观察自定义元件的定义,它的作用是?上方两个或门和与门的作用是?
好了万事具备,只欠数显,无视风险,继续安装!
3.5:数显
相当明显不是吗,每一根8位线含有两个bcd数,将它转换为八段数码管的控制信号即可。

