bcd转二进制

BCD码用于显示,但是计算器内部计算用的是二进制码,所以有的时候要对其进行转换。

最简单的BCD转二进制的方法是什么呢?

我们知道BCD码每4位表示一个10进制数,我们现在假设num_reg是一个16位的BCD码,也就是4位的十进制数。那么num_reg[15:12]表示这个数的最高位,他的权值是1000,这个应该可以理解吧。同样的道理,num_reg[11:8]的权为100,num_reg[7:4]的权为10,num_reg[3:0]的权为1。

所以bin = num_reg[15:12] *1000 + num_reg[11:8]*100+num_reg[7:0]*10+num_reg[3:0]。

这种方法虽然能够实现转码,但是占用的FPGA内部资源太大,我们知道fpga内部资源是很宝贵的,所以我们这里着重介绍一下另一种通过移位来达到目的的算法。

二进制码左移一位等于未左移的二进制码乘2,例如二进制码101001,转成十进制等于41,左移一位得到1010010,成了82。也就是说二进制码左移一位加上左移3位,等于二进制码乘10.

设计框图:

module bcd2bin(
        input            wire        sclk,
        input            wire        rst_n,
        input            wire        [3:0]gew,
        input            wire        [3:0]shiw,
        input            wire        [3:0]baiw,
        output        wire        [9:0]binary
);
 reg        [9:0]    bwvalue1;
 reg        [9:0]    bwvalue2;
 reg        [9:0] bwvalue3;
 reg        [9:0]    shiwvalue1;
 reg        [9:0] shiwvalue2;
 reg        [9:0]    gewvalue;

 always@(posedge sclk or negedge    rst_n)
     if(!rst_n)
         begin
             bwvalue1        <=0;
            bwvalue2        <=0;
            bwvalue3    <=0;
            shiwvalue1  <=0;
            shiwvalue2  <=0;
            gewvalue    <=0;
         end
    else
        begin     //100=(64+32+4)=(2^6+2^5+2^2); 10=(8+2)=(2^3+2^1);
            bwvalue1    <=baiw<<6;
            bwvalue2    <=baiw<<5;
            bwvalue3    <=baiw<<2;
            shiwvalue1<=shiw<<3;
            shiwvalue2<=shiw<<1;
            gewvalue    <=gew     ;
        end     

assign binary=bwvalue1+bwvalue2+bwvalue3+shiwvalue1+shiwvalue2+gewvalue;

endmodule

TB文件:

`timescale 1ns/1ps
module  bcd2bin_tb;

reg        sclk;
reg        rst_n;
reg        [3:0]gew;
reg        [3:0]shiw;
reg        [3:0]baiw;
wire        [9:0]binary;

initial
begin
    sclk=0;
    rst_n=0;
    baiw=4‘d0;    shiw=4‘d0;    gew=4‘d0;
    #1000
    rst_n=1;
    #100 baiw=4‘d1;    shiw=4‘d2;    gew=4‘d0;
    #100 baiw=4‘d3;    shiw=4‘d2;    gew=4‘d9;
    #100 baiw=4‘d4;    shiw=4‘d2;    gew=4‘d9;
end 

always #10 sclk =~sclk;

    bcd2bin    U1(
                    .sclk        (sclk)        ,
                    .rst_n        (rst_n)        ,
                    .gew            (gew)        ,
                    .shiw        (shiw)        ,
                    .baiw        (baiw)        ,
                    .binary     (binary)
                    );

endmodule
 

modelsim仿真:

可以看出转换后的bin码是对的,所以达到了设计目标、

时间: 2024-08-25 10:36:41

bcd转二进制的相关文章

基础项目(10)BCD转二进制程序设计讲解

写在前面的话 在前面小节的学习中,我们已经掌握了将二进制数转换成BCD码的方法.那么现在我们就反过来思考一下,设计一个什么样的电路,才可以将BCD码转换成二进制数呢? 基本概念 在数学中,我们都知道随便一个十进制数如5468 ,那么它的计算过程可以转换为:5468= 5*1000+4*100+6*10+8,因此BCD码转成二进制数的算法就是: abcd = a*1000 + b*100 + c*10 +d 这种算法是最常规的一种算法,里面需要用到乘法器以及加法器,这种实现方式比较耗费资源,下面梦

RTC系统

http://blog.csdn.net/fanqipin/article/details/8089995 一. RTC及驱动简介 RTC即real time clock实时时钟,主要用于为操作系统提供可靠的时间:当系统处于断电 的情况下,RTC记录操作系统时间,并可在电池供电情况下继续正常工作,当系统正常启动后,系统可从RTC读取时间信息,来确保断电后时间运行连续性. 目前,很多CPU中都已集成RTC系统,且有许多独立的外接RTC芯片可用于实现RTC功能: 在内核中RTC驱动可分为两层,一层为

RTC系统【转】

http://blog.csdn.net/fanqipin/article/details/8089995 转自:http://www.cnblogs.com/muhuacat/p/5276306.html 一. RTC及驱动简介 RTC即real time clock实时时钟,主要用于为操作系统提供可靠的时间:当系统处于断电 的情况下,RTC记录操作系统时间,并可在电池供电情况下继续正常工作,当系统正常启动后,系统可从RTC读取时间信息,来确保断电后时间运行连续性. 目前,很多CPU中都已集成

【组成原理】概述

目录 计算机概述数据总线CPU存储器输入/输出设备计算机的时标系统 计算机概述 计算机的基本组成: 存储器: 实现记忆功能的部件用来存放计算程序及参与运算的各种数据 运算器: 负责数据的算术运算和逻辑运算即数据的加工处理 控制器: 负责对程序规定的控制信息进行分析,控制并协调输入,输出操作或内存访问 输入设备: 实现计算程序和原始数据的输入 输出设备: 实现计算结果输出 组成的联系: 图一 图二 计算机的工作过程: 用户打开程序 系统把程序代码段和数据段送入计算机的内存 控制器从存储器中取指令

二进制转BCD

什么是BCD码? BCD码称为二进码十进数或BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码.用4位二进制数来表示1位十进制数中的0~9这10个数码. BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行.这种编码技巧,最常用于会计系统的设计里,因为 会计制度经常需要对很长的数字串作准确的计算.相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免却使电脑作浮点运算时所耗费的时 间.此外,对于其他需

二进制转BCD码

应用: 用fpga实现对数码管显示,以前通常的方法是进行整除和取余进行运算,但是fpga并不擅长乘法除法运算,所以可以用BCD码来转换. BCD码:通俗的可以理解为用四位二进制数表示一位十进制数字.例如,256就可以用bcd码表示为:0010_1001_0110 因此在数码管显示中,也就是把256各位分出来,就可以用bcd码来表示,下面说一种二进制转换bcd码的方法. 加3移位法: bcd码中只有0~9十进制数,但是在四位二进制中是16进制进1,因此在移位过程中要对二进制进行判断,当在移位之后的

【FPGA】【verilog代码】二进制转BCD [转]

BCD:Binary Coded Decimal 即用4位二进制编码表示1位的十进制数. 定义:BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行.这种编码技巧,最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算.相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免却使电脑作浮点运算时所耗费的时间.此外,对于其他需要高精确度的计算,BCD编码亦很常用. 参考百度百科对BCD码的解释:http://baike.b

BCD码转换成二进制和ASCII码

首先得知道什么是BCD码,可以看下百度,基本定义已经讲清楚了,百度链接:BCD码--百度百科:这里要说的也是最常用的一种BCD码:8421码.本文规定若没有特殊说明时,各个数值只会是十进制数.二进制数.ASCII值其中的一种进制数. BCD码是用4位二进制数(各个位的权重分别为:8421,所以叫8421码)来表示一位十进制数.这里的一位十进制数要特别说明下,一位十进制数只能是 0-9之间的一个数值.比如:6 就是表示一位十进制数6:66则是表示两位十进制数:666则是表示三位十进制数:(好像有点

基于Verilog HDL的二进制转BCD码实现

在项目设计中,经常需要显示一些数值,比如温湿度,时间等等.在数字电路中数据都是用二进制的形式存储,要想显示就需要进行转换,对于一个两位的数值,对10取除可以得到其十位的数值,对10取余可以得到个位的数值.对于Verilog来说它的标准是支持除法和取余运算的,综合器也会有IP可以进行除法运算.但是这样未免会耗费太多资源,使用移位加3算法就可以实现二进制到BCD码之间的转换. BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码.用4位二进制数来表示1位十进制数中的