雾盈 发表于 2016-8-29 09:42:45

雾盈FPGA笔记之(三十)六位四则运算计算器(6)算法实现二进制转BCD

本帖最后由 雾盈 于 2016-8-29 09:47 编辑

六位四则运算计算器(6)算法实现二进制转BCD
                        雾盈        2016-8-28

        雾盈FPGA笔记汇总目录


一、写在前面

        之前写过关于数码管十进制显示的一篇文章,但那个转十进制是用了除法取余的数学公式,像下面这样:

       

但这样的写法在FPGA 里并不可取,因为FPGA 里的硬件资源很宝贵,为了综合出除法器需要消耗大量的加法器,得不偿失,所以我抛弃了那样的写法,用了老师介绍的一个小算法来实现二进制转BCD的


二、 框图

       


三、什么是BCD 码?

        要转BCD码,我们首先应该弄清楚什么是BCD码。
百度百科是这样解释的:

        BCD码(Binary-Coded Decimal)亦称二进码十进数或二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数码。是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。

        BCD码可分为有权码和无权码两类:有权BCD码有8421码、2421码、5421码,其中8421码是最常用的;无权BCD码有余3码,余3循环码等。

        8421
        8421 BCD码是最基本和最常用的BCD码,它和四位自然二进制码相似,各位的权值为8、4、2、1,故称为有权BCD码。和四位自然二进制码不同的是,它只选用了四位二进制码中前10组代码,即用                                                      0000~1001分别代表它所对应的十进制数,余下的六组代码不用。


        简单点说:
BCD码就是使用4位来表达一个十进制数字
        例如,十进制数20’D 999999 = 20’B 1111_0100_0010_0011_1111,原本只有20位,现在我们用BCD码去表示这个十进制数,
就是 24’H 9 9 9 9 9 9 = 20’B1001_1001_1001_1001_1001_1001,
每个十进制9 用十六进制的四位去表示,就变成了24位数据。
示意图如下:

       


四、算法原理
       
        这个算法应用了逐步移位的方式:
        第一步:添加一个20位的移位寄存器用作移位寄存
        因为有6个数码管显示。       

        第二步:二进数逐步左移
将需要转换的十进制数以二进制形式逐步左移。

        第三步:大四加三
每左移一位,就要让BCD位去和4比较,如果大于4就加上3,如果不大于就继续左移,然后继续和4比较。

        第四步:进数全部移完,得到结果。

举个例子:165 (取自教材中的例子)
示意图如下:
       
       


        这样整个算法讲完,我们来看程序。


五、代码解释

        第一段:
这里用状态机写的,闲置状态将待转换十进制存入data_r以备转换之需。
然后跳入下一状态,移位SHIFT

       
       
        第二段:

加入了一个移位计数器,当移位未满20次时,每移位一次就跳入判断状态ADD,判断每个BCD位是否大于4,大于则加3,否则跳回移位SHIFT状态,继续左移。当移位满20次时,将结果输出。
       
       

       

讲解完毕,附上源代码:


       





芙蓉王 发表于 2016-8-29 10:46:43

                     感谢分享

陈飞龙 发表于 2016-8-30 09:06:49

不错,格式越来越规范:P:P

Blondie 发表于 2016-8-30 09:22:03

                         挺好的

Esmiamor 发表于 2016-8-30 09:42:49

                  加油。

Adamancy 发表于 2016-8-30 10:14:45

             不错。

zhiweiqiang33 发表于 2016-8-31 08:54:59


支持 同学, 就业班学习笔记整理的很详细,感谢分享。

小旭 发表于 2017-7-28 22:49:45

谢过。。。。。。。。
页: [1]
查看完整版本: 雾盈FPGA笔记之(三十)六位四则运算计算器(6)算法实现二进制转BCD