FPGA|CPLD|ASIC论坛
直播中

陈淼旸

8年用户 61经验值
擅长:EDA/IC设计
私信 关注
[资料]

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

` 本帖最后由 雾_盈 于 2016-8-30 09:36 编辑
六位四则运算计算器(6)算法实现二进制转BCD

                        
雾盈        2016-8-28


        


一、写在前面

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

         00.png

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


二、 框图


框图.png

三、什么是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位数据。
示意图如下:

         转换示意图.png


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

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

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

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

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


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


五、代码解释

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

         第一段.png
        
        第二段:

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

         3.png

讲解完毕,附上源代码:
bin2bcd.zip (962 Bytes)
(下载次数: 17, 2016-8-30 09:36 上传)



         0.png







`

回帖(2)

h1654155701.4611

2016-8-30 10:07:04
赞!
举报

陈淼旸

2016-8-30 10:08:30
受到警告
提示: 作者被禁止或删除 内容自动屏蔽
举报

更多回帖

发帖
×
20
完善资料,
赚取积分