欢迎光临散文网 会员登陆 & 注册

如何在mc里打造一个计算器 [4] -- BCD转BIN

2020-03-04 23:04 作者:nyasyamorina  | 我要投稿


在计算器里, 从输入到计算, 中途会遇上一个棘手的问题:  十进制转二进制

从输入到二进制输出一共分为3个部件:  键盘输入, BCD寄存 和 BCD转BIN

作为最简单的键盘也没什么好说的, 不过需要注意的是: 0对应的BCD为0000, 这与无信号的情况是一样的, 为了让下一个部件知道"输入了一个0", 所以需要一条额外的触发信号(黄色)


因为我们的部件是不知道玩家输入几位的数字, 并且每按下一位, 这个BCD可能对应玩家需要的数字的十位或者个位, 所以需要一个用来储存BCD的位移寄存器

蓝色是输入, 黄色是触发信号, 红色是BCD输出

这里用实际操作演示一下就懂的了:

①:  原本寄存器内无数据:  0000,0000,0000,0000,0000

②:  按下 3:   0011输入寄存器, 随后触发信号输入, 整体向左移动: 0000,0000,0000,0000,0011

③:  按下2:  重复上述步骤得到: 0000,0000,0000,0011,0010

④:  按下6:   得到: 0000,0000,0011,0010,0110

不过这里有一个需要注意的地方, 位移寄存器只能储存有限的数据, 而溢出的数据会在左边溢出


位移寄存器输出的BCD码经过转码后可以得到用于计算的BIN码, 这里把输出的BCD码最右边4位(个位)叫做A0, 右边起第5~8位(十位)叫做A1, 以此类推, 目标数字为n

那么可以知道  n = ... + A3*1000 + A2*100 + A1*10 + A0*1,   分解因式得到:

n = ((((...)x10+A3)x10+A2)x10+A1)x10+A0

可以看到一个不断出现的结构:  (...)x10+An ,  于是我们可以设计出一个部件: 输入两个数字:B和An, 输出为C=Bx10+An,   把上一级的输出C放入下一级的输入B里, 直至穷尽BCD码,   这就是BCD转BIN的思路了

观察部件的计算部分:  C=Bx10+An  =  Bx(8+2)+An  =  Bx8 + Bx2 + An

其中x8和x2可以使用位移计算, 即   Bx8 = B<<3, Bx2 = B<<1,  那么 C  =  B<<3 + B<<1 + An

在全加器里, 一共有两个输入, 当B<<3和B<<1输入时, 可以观察到下面的情况: 

加法器的前三位没有被利用到, 当然我们可以省略这三位, 后面再做一个加法器处理 +An 部分, 但是An是只有4位的BCD码, 额外使用一个加法器无疑是太小题大做, 那么我们可以吧加法器的输入设计为:

但是在这里可以看到An的第4位 An_3 没有位置插入加法器的输入,  但是多亏BCD码的特性: 取值从0000到1001,  并且穷举加法器的第3和第2位, 并且对比加法器内从第3位向第4位的进位S_3和An的第4位:    最右列是An可能的值, 并且因为没有规定An_0的值, 所以An会有多个值

这里把An不可能的值全部画上了下划线

可以看到当An_3可以为1时, S_3绝对不会为1 ,反之亦然.   那么把An_3接入S_3处也不会造成错误

橙色就是吧An_3接入S_3处

如此利用BCD码的特性, 就把C=B<<3+B<<1+An用一个加法器就完成了, 把一堆这种部件堆在一起, 并且分别连上正确的BCD位移寄存器的输出, 就做好了BCD转BIN了

当然, 就像乘法器一样, 对于重复的部件, 也有化简的办法, 化简后的结果就是最开始的图片, 一个输出32bits的bcd转bin

如何在mc里打造一个计算器 [4] -- BCD转BIN的评论 (共 条)

分享到微博请遵守国家法律