`
本帖最后由 雾_盈 于 2016-8-30 09:36 编辑
六位四则运算计算器(6)算法实现二进制转BCD
雾盈 2016-8-28
一、写在前面
之前写过关于数码管十进制显示的一篇文章,但那个转十进制是用了除法取余的数学公式,像下面这样:
但这样的写法在
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次时,将结果输出。
讲解完毕,附上源代码:
`