二进制转BCD码

昨儿碰到一个不大不小的问题。就是一个十位的二进制数,如何转化成一个16位的BCD码(这里用8421码),也就是一个普通的十进制的四位数的问题。不是换算,是用具体的电路实现。

其实我有一段Verilog的源代码(是时序触发的,不过,我还没想到用组合逻辑要怎么搞……)。只不过看不懂,后来google之,果然得到老外的一段英文,看了以后就悟了。鉴于这问题有点意思,就发上来给大家看看。

喜欢Verilog的看这个,习惯vhdl的可以看这个。对一切HDL语言都没兴趣的人(即如果你既不知道Verilog,又不知道VHDL),可以略过这两段,直接看下面。

操作是这样的:用两个寄存器,一个10bit,一个16bit,分别存bin码和有待实现的bcd码。接下来,逐位将BIN的最高位移入BCD的最低位。同时,将BCD的16位寄存器按每四位划成一块,我们称之为个十百千好了。但记住,个,十,百,千都有4个bit位。

1.将bin[9](bin是bin[9:0])移入bcd[0]。这样,bin[9]就变成了原来的bin[8],bin[0]=0。

2.分别检查个十百千里存的数是不是大于等于5(按二进制换十进制那样换算),如果是,加3。

3.重做1,2。直到全部移进去。

原理是这样的:

bin和bcd的表示方法的差别,就在于10用bin表示为1010,用bcd表示成10000。但左移一位就是乘2,这个是没问题的。因此,如果不做2的操作,就等于不停的把个位数乘2加上新的个位数,这样还是原来的数。做了2之后,就等于把原来的1010变成10000,因为1010在bcd码里是不可能出现的,因此要把10变成bin下面的16。而5=10/2,3=(16-10)/2,也等于(18-12)/2……等等等等。

二进制转BCD码》上有6条评论

  1. 呵呵

    如果不做2的操作,就等于不停的把个位数乘2加上新的个位数,这样还是原来的数。做了2之后,就等于把原来的1010变成10000,因为1010在bcd码里是不可能出现的,因此要把10变成bin下面的16。而5=10/2,3=(16-10)/2,也等于(18-12)/2……等等等等
    朋友,我这句依然不懂什么意思?您能再写几句话吗?再解释解释?

  2. 百毒 文章作者

    可以,这里的2的操作,是指上面的1、2、3三个步骤里的第二步。如果不做第二步,用一个十进制数来打比方,就好比是123=((1x10)+2)x10+3这样,得到的还是123。但如果做第二步,碰到1010,也就是10的时候,会被变成10000,也就是16。而1010=10和10000=16,是bin的解释,对于bcd而言,则10000=10。后面的5等于什么,和3等于什么,是在解释第二步里的5和3是从哪里来的。因为移位等于乘2,所以需要5和3。

  3. li

    5=10/2,3=(16-10)/2或(18-12)/2说明什么问题,能不能再说的详细一点,

  4. fengwei

    楼主,能请教一下,加3修正在电路里你是怎么实现的,万分感谢...

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.