FPGA中二进制转BCD码方法

  先说说为啥要二进制转BCD码:二进制转BCD码大多用于数码管显示,比如你要显示4567这个十进制数,就需要在数码管上依次显示4 5 6 7四个数,动态扫描即可,然而,问题来了:4567这个十进制数在电脑里的储存方式是二进制0001000111010111,你得把他的个十百千位分别计算出来才能显示,用四位二进制数分别表示每一个数字4 5 6 7即可(之所以是4位,因为表示数字0-9需要4位),即你真正需要的一串二进制数是0100_0101_0110_0111,拿到这串二进制每4位一截取就可以获得要显示的数字,从0001000111010111到得到0100_0101_0110_0111的过程就叫做二进制转BCD码。

下面说转换方法:

如果你用C语言,那非常简单,通过/和%两个就可以完成

但如果用Verilog语言,因为FPGA中进行乘除是一件非常消耗资源的做法,为此有了下面的方法。

这里以显示234举例说明:

第一步,先写出234的二进制表示方法,即1110_1010。显示234需要3位数码管,因为每一位数字需要4位二进制数来表示,所以这里先在1110_1010前面补12个0;

第二步我们需要进行判断运算,移位操作,首先判断每一个BCD码其对应的十进制数是否大于4,如果大于4就对BCD码做加3操作,若小于等于4就让其值保持不变。当对每一个BCD码进行判断运算后,都需要将运算后的数据像左移1位。移完位后我们仍按前面所述进行判断运算,判断运算后需再次移位,以此循环,当我们进行8次判断移位后的BCD码部分数据就是我们转换的数据。

   上述就是二进制转BCD码的方法,值得注意的是,在实际应用中,还有一个问题需要考虑:显示不同十进制数需要的数码管位数不一样,按照前文的做法,在二进制前面的补0的个数也就不一样,那如果我们显示的是0-9999这个区间范围的数,怎么在程序中清晰的显示这个逻辑?

我们可以以最大显示的数为基准,比如最大显示到9999,需要补16个0,那我们就在每个二进制数的前面补16个0,同时每个二进制数都用相同位数(这个位数其实也就是用来表示最大的数需要的二进制位数)来表示(这一点其实不必关心,因为你在verilog 中肯定需要定义一个有大小的参数来表示要显示的数,定义完以后所有的二进制数就都是这个大小),这样,小的数前面都是0,经过移位最终显示的依旧是0,逻辑上没有错,到此为止都是对的

但又产生了新的问题(可能这就是学习的本质吧,发现问题与解决问题交替上升):你要显示12,结果出来的是0012,逻辑没错,但看着不大美。由此,只需要在程序中加一段对这一位是不是零的判断即可,如果是0,段选值就给不显示就行,反之,显示对应的数即可,注意要从最高位开始判断,依次往下,直到个位为止。这个简单,一连串的else if就可以解决。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值