有时候没有采用BCD计数器,又需要用十进制形式显示二进制数据,最常用的方法是编码转换:将二进制码转换成BCD码(8421)。
8421码:8421码又称十进制码,它只选用了四位二进制码中前10组代码,4个码表达10个数,即用0000~1001分别代表它所对应的十进制数,余下的六组代码不用。
如果要我将二进制码转成BCD码,我会看看他们何时分道扬镳,以此观察二者的区别。
对于BCD计数器,当计数到1001时,下一次计数要进位,得到0001_0000。对于二进制计数器,下一次计数得到的是1010。
不可能重新计一次数来得到BCD码,太浪费时间了,但是直接让我转我也束手无策。我们很快发现按位重建的话,消耗的时钟周期数是二进制位数,还可以接受。深入思考一下,发现是可行的。就像标准LSB乘法一样,从二进制高位开始重建,用一个寄存器每个周期进行shift-add操作。如果不干其他的,花费n个周期即可重建出n-bit二进制数。这个工作量已经是一个比特串行乘法器了,结果肯定是原来的二进制数不会错。每4个bit分为一组BCD码,对于任意一组在任意一个周期状态下,只要数据≥5,那么下一次移位就会超出BCD码范围,对于BCD计数器来说需要进位。为使4位二进制码进位,要满足逢16进一。由于BCD码是逢10进一,直接给当前组4bit数据补上差距3即可。下一次移位的时候,差距扩大为6,如果BCD码应该进位,那么二进制码也会进位,同步进位,目的达成。
寄存器中的编码已经是BCD码了,但是这个BCD码代表的值和二进制代表的值是一样的。二进制重建可以进行shift-add操作,BCD码重建同样可以进行shift-add操作,只不过BCD码有自己的规则,在shift-add的时候要进行一点修正罢了。在任意周期,重建出来的二进制码和BCD码表示的值都是一样的。所以最终重建出来的BCD码是正确的。
示例:1011
重建到101时,+3,变为1000。继续重建,得到10001,可知1011对应十进制数位11。
8位示例请看这篇帖子:https://blog.csdn.net/li200503028/article/details/19507061