BCD/BIN转换算法
输入端BCD转BIN算法(这个自己想出来的)
想法很直接,BCD十进制码转BIN二进制码按照常规的数学运算就是十进制每一位乘上10的各自位数-1次方。比如123=1x10^2+2x10^1+3。这个反映到二进制算法上就是将BCD每一位数的四个信号乘以10的n次方的二进制值,n为该位数-1,最后所有位再加起来。重要的是这种算法在硬件上实现很简易,所以我也没找其他算法,就直接用了。下图为BCD转BIN单元。
输出端BIN转BCD算法:
这个用的是通用的算法,流程如下:
某二进制数一直做左移操作,每一次左移后从第一次移位进入的那个位向左每4个位切断成一组(作为BCD数),然后判断改组是否大于等于5,如果大于等于5则该组+3处理,小于5不用处理。所有组处理完后继续移位,一直移到末尾进入第一次移位的那个位。文字介绍很别扭,可以结合下面的图看。
借用MC论坛上的举例介绍:(http://www.mcbbs.net/thread-97108-1-1.html)
把Units,Tens,Hundreds和他们所处的那一列统称为1组,另外Binary和它所在的那一列不算一组,表格一行一行看。1组数据对应一个BCD字符,2进制数有多少位就把它往左移多少位。左边的英文是操作,shift是移位,add是加。Units组的最右边一位就是上文指的“第一次移位进入的那个位”。
上图是以255为例,下面再以123为例的流程如下:
123的二进制数是0111 1011
我们先将其左移1位,得到1111 0110
目前还在binary那列里,所以继续移位
得到0001 1110 1100
组里的数字小于5,继续移
得到0011 1101 1000
继续移位
得到0111 1011 0000
可以看到Units组里的数字已经大于5了,所以把当前该组里的数据+3处理
到1010 1011 0000
继续移位
得到0001 0101 0110 0000
Units组里的数字等于5,所以再加3
得到0001 1000 0110 0000
继续移位
得到0011 0000 1100 0000
继续移位
得到0110 0001 1000 0000
这次是Tens里的数据大于5了,所以+3处理
得到1001 0001 1000 0000
因为在2进制数前面补了一个0,所以变成了8位的数据,现在还差最后一次的移位
得到0001 0010 0011 0000 0000
结束
最终设计出的硬件结构如下图,是一个15bit的BIN转BCD转换器。
除法算法
除法用的是恢复余数的加减交替算法,流程举例如下:
整个串行的除法器利用减法判断符号来决定上商和恢复余数。由于除法在硬件上的运算密度比较高,串行除法器如果让它完全不受时序控制直接串行推进运算会让电脑负担太大的运算量导致卡顿。这个的主要原因是信号在时间上的重叠,初始信号一开始就传送到了最后,每一行的部分积余数一算完,后面所有的信号都要全部改变一次,会导致几千个红石火把每一秒经历若干次变化(还好总数比8小不至于崩溃)。所以我又设计了一个控制运算推进的时序电路,最终卡顿的情况比原来好了许多。
设计出来的硬件单元前文已给出,再贴两张细节。
下图右上灰色部分是最终恢复的余数输出端,右下红绿相间的加法器是除数输入端,被圈出来的蓝色方块从上到下一共15个是被除数输入端,被圈出来的那个是最低位,它下方偏右的那个是最高位。
下图是换了一侧看除法器,图中绿色的一共15个是商输出端
更多相关资讯请关注:我的世界专区