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

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

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

原论文:

因为解释起来有丶小复杂, 所以先来说怎么实现:

假设现在是16位BIN, 最大转换为Nbits的BCD码, 那么需要一个(16+N)bits的寄存器, 低16位记录着BIN

重复以下步骤16次:

  1. 对寄存器高N位, 每4位执行一次操作A (左边不足4位用0补充)

  2. 寄存器数据左移一位

操作A: 如果选中的4bit数据大于4, 则+3, 否则+0   (因为BDC的特性, +3后不会大于16, 所以不考虑进位)

如下图所示:  (从上往下)

对于操作A, 执行+3最小数字是5, 执行后得到8(1000), 而对于(1XXX)明显大于4, 需要执行+3, 所以提出了一种改进操作A的方法:   对输入进行+3, 如果结果第4位=1, 则输出+3结果, 否则输出原输入,  来自论文的原图:

实物:

同理, 可以做成减少体积的版本

原理:

BCD转BIN中, 目标数字为n = ((((...)x10+A3)x10+A2)x10+A1)x10+A0       (1)

并且BCD里0~9跟BIN里的0~9一致,  所以BCD转BIN实际上是在BIN里计算上1式

同理, 在BIN转BCD中, 目标数字n = ((((...)x2+B3)x2+B2)x2+B1)x2+B0          (2)

并且BIN里的01跟BCD里的01一致, 所以我们可以找到一种在BCD里计算2式的方法


跟BCD->BIN不同的是, BIN->BCD重点不是加法, 而是乘法, 因为x2后必定为偶数, 而+Bn(Bn是BIN里的一位)只需要直接把Bn插入第一位BCD码的第一位就可以了


在使用4个二进制位的进制系统里(也就是说一个数字需要4bits表示的N进制), 16进制(HEX)是很特殊的一个, 因为HEX的*2与BIN一样直接<<1就可以了, 那么我们可以在HEX上面寻找BCD如何快速*2

一个数字*2可以看作这个数字加上它本身,  并且从构造加法器时, 可以得知"一位"的加法应该有A输入, B输入, 进位c输入, 和S输出, 进位C输出, 其他进制也一样, 那么我们来探求加法的本质(并不是复读机)

在N进制下, 任何数字可以写序列:   [...., A3, A2, A1, A0], 那么加法就相当于两个序列按照一些方法组合在一起, 加法的规则不难看出是这样的:

平常做公式的网站炸了, 迫不得已只能自己做了

为了方便表达, 我们定义一个"进位"函数

我们需要找到一种方法让BCD的加法在HEX上实行,   实际上进行十进制加法时, 有进位时加上6, 并且让进位在十六进制上进行, 就得到了在HEX上计算BCD的加法

10前面忘记是分号了 (趴

在此基础上推断BCD的*2:

上面已经知道HEX的*2跟BIN一样是<<1, 那么在计算BIN转BCD的步骤就变成了:

  1. 对每一个BCD码X计算   X_16 + 3*carry(X,0;5)

  2. 按位对全部BCD<<1, 下一位BIN移动到最右边一位

论文内的

这个系列暂时不会再继续更新了, 因为简单计算器内全部部件都已经说完了, 显示部分稍微动动脑就做得出来啦, 而电路的化简也没想象中的复杂, 就是把重复出现的部件输出接一个寄存器, 寄存器输出指向部件输入, 使用一个时钟控制部件的运作就ok了

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

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