社区导航

 
快捷导航
  • 首页
  • 论坛
  • 查看新帖
  • 最新回复
  • 社区活动
  • 联系管理员
  • 消灭零回复
  • E金币兑换
  • 干货
搜索
查看: 1559|回复: 4

[原创] 【小梅哥FPGA进阶教程】第二章 二进制转BCD

[复制链接]

139

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2017-1-9 15:21:00 | 显示全部楼层 |阅读模式
二、二进制转BCD


本文由杭电网友曾凯峰贡献,特此感谢



我们的数据在运算或者存储的时候,一般都是以二进制的格式存在的。但是在很多情况下,我们需要将运算结果显示到某种显示设备上,如果直接以二进制的形式来显示的话,会非常不便于我们查看。因此,我们需要首先将二进制数转换为十进制数再进行显示。二进制到十进制的转换有很多种方法。这里,我们和大家一起学习一种国外目前最为流行的转换方法—逐步移位法。通过这种方式,我们不但可以在没有周期差的情况下实现数据格式的转换,同时我们的资源占用量也是相当小的。
基本概念
BCD码(Binary-Coded Decimal)也称二进码十进数或二-十进制代码。用4位二进制数来表示1位十进制数中的0~9这10个数码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。这种编码技巧在FPGA中经常用到,如矩阵键盘输入的数据需要在数码管上显示的时候,矩阵键盘输入的数字是二进制数,而数码管上需要显示的是十进制数,所以需要将二进制数转换成BCD码,这在我们以后的设计中会经常遇到。
转换原理
对于一个8位二进制码 图片1.jpg ,其在十进制编码方式下的值为:
图片2.jpg
把上式写出套乘的形式:
图片3.jpg
式中的每项乘2,相当于将寄存器中的二进制码左移1位,这就意味着利用移位寄存器可以完成二进制与8421BCD的转换。
在移位的过程中,当现态 图片0.jpg <5时,次态不变。当现态 图片0.jpg =5、6、7时,左移一次,其次态 图片0.jpg 将会超过9,对于一个BCD码来说,这样的状态属于禁用状态。而当 图片0.jpg =8、9时,左移1位,则会向高1位的BCD码输入一个进位的信号,由于二进制和BCD码权不一致,当发生进位时,虽然码元只是左移1位,但次态 图片0.jpg 将减少6。基于上面这两种情况,在B/BCD转换时需要对转换结果加以校正。校正过程如下:当 图片0.jpg >=5时,我们让 图片0.jpg 先加上3,然后再左移1位,次态 图片0.jpg =2( 图片0.jpg +3)=2 图片0.jpg +6,正好补偿由于进位而减少的数值,并且向后一个变换单元送入一个进位信号,这个方法 叫“加3移位法”。
注意:现态和次态都是指BCD码,即用4位二进制表示的1位BCD码。我们对 图片0.jpg =8、9时举个例子:BCD码的1000(8)乘以2为0001_0110(16),但是左移后变为0001_0000,减少了6。所以需要加上6,这里的方法是加3左移一位,相当于加上6。
转换方法
首先,先了解二进制与BCD码的位数对应关系,比如一个8位二进制码,可以表示的最大十进制数为255,转换成BCD码为0010_0101_0101,共需12位,其中每4位组成一个BCD单元,有三个BCD单元,分别表示百位(hundreds)、十位(tens)和个位(units)。n位二进制码转换成D位BCD码的n~D对应关系表见表1。
表1  n与D对应关系
图片4.jpg

以8位二进制转换为3位BCD码为例,转换步骤是:将待转换的二进制码从最高位开始左移BCD的寄存器(从高位到低位排列),每移一次,检查每一位BCD码是否大于4,是则加上3,否则不变。左移8次后,即完成了转换。需要注意的是第八次移位后不需要检查是否大于5。
注意:为什么检查每一个BCD码是否大于4,因为如果大于 4(比如 5、6),下一步左移就要溢出了,所以加 3,等于左移后的加 6,起到十进制调节的作用。
它的操作可以归纳如下:
1.     对于BCD移位寄存器中的每4位的BCD数字,检测这个数是否大于4。如果是,就在这个数字上加上一个3。
2.     将整个BCD寄存器向左移动一位,将输入二进制序列的最高有效位(MSB)移入到BCD寄存器的最低位(LSB)。
3.     重复步骤1和步骤2,直到所有的输入位都被使用了。
一个8位二进制输入“11101011”的转换过程如下表所示
表2 B/BCD时序
图片5.jpg

13位的转换电路代码如下:使用简单的FSMD控制整个操作。当start信号置为1时,二进制输入就存放到寄存器p2s中。然后FSM循环访问这13位二进制数的每一位,类似于前面例子描述的过程。需要四个调整电路来调整这四个BCD数字。为了清楚,将调整电路与次态逻辑分开,使用单独的代码进行描述。

图片6-1.jpg 图片6-2.jpg 图片6-3.jpg 图片6-4.jpg 图片6-5.jpg 图片6-6.jpg

声明:此代码参考于基于NiOSIIDE嵌入式Sopc系统设计与Verilog开发实例上的代码
仿真验证
仿真验证代码如下:
图片7-1.jpg 图片7-2.jpg 图片7-3.jpg

仿真结果如下:
图片8.jpg

图片9.jpg


小梅哥
芯航线电子工作室


关于学习资料,小梅哥系列所有能够开放的资料和更新(包括视频教程,程序代码,教程文档,工具软件,开发板资料)都会发布在我的云分享。(记得订阅)链接:http://yun.baidu.com/share/home?uk=402885837&view=share#category/type=0


此帖出自FPGA/CPLD论坛

二进制转BCD.pdf

907.91 KB, 下载次数: 47

评分

1

查看全部评分



回复

使用道具 举报

5

TA的帖子

1

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2017-1-10 11:57:23 | 显示全部楼层
前排支持一下

点评

感谢您的支持!!!  详情 回复 发表于 2017-1-10 21:54


回复

使用道具 举报

139

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

 楼主| 发表于 2017-1-10 21:54:46 | 显示全部楼层

感谢您的支持!!!


回复

使用道具 举报

2070

TA的帖子

4

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-2-17 20:52:44 | 显示全部楼层
楼主,我在淘宝上 看到个 ,价格公道,是你做的吗。

  
收藏 分享复制链接 举报
AC620 Altera FPGA 开发板 芯航线 小梅哥17年力作 音频网络教程

点评

是的,我做的,总想做个精致又实惠的板子,配合我们的视频和文档教程一起散播。让更多的人学习起来更加轻松。  详情 回复 发表于 2017-2-17 22:56
MicroPython中文社区 http://www.micro-python.com/forum.php


回复

使用道具 举报

147

TA的帖子

1

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2017-2-17 22:56:13 | 显示全部楼层
5525 发表于 2017-2-17 20:52
楼主,我在淘宝上 看到个 ,价格公道,是你做的吗。

  
收藏 分享复制链接 举报
AC620 Altera ...

是的,我做的,总想做个精致又实惠的板子,配合我们的视频和文档教程一起散播。让更多的人学习起来更加轻松。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456

GMT+8, 2018-2-24 19:51 , Processed in 0.158594 second(s), 17 queries , Redis On.

快速回复 返回顶部 返回列表