二进制转BCD码

应用:

用fpga实现对数码管显示,以前通常的方法是进行整除和取余进行运算,但是fpga并不擅长乘法除法运算,所以可以用BCD码来转换。

BCD码:通俗的可以理解为用四位二进制数表示一位十进制数字。例如,256就可以用bcd码表示为:0010_1001_0110

因此在数码管显示中,也就是把256各位分出来,就可以用bcd码来表示,下面说一种二进制转换bcd码的方法。

加3移位法:

bcd码中只有0~9十进制数,但是在四位二进制中是16进制进1,因此在移位过程中要对二进制进行判断,当在移位之后的状态Qn+1大于9,要对Qn加6才可以。例如1000移位大于9加6为0001_0110,对应bcd码中的16。

我们也可以在移位之前进行判断,如果移位之前的Qn数据大于4,说明Qn+1会溢出,所以可以+3再进行移位,例如1000大于4,加3为1011然后再进行移位0001_0110,16和刚才结果是一样的。

简单的说,判断的目的是防止下一次移位,发生数据溢出的情况

 思路:

代码可以总结为三个部分:移位,加二进制数,判断(最后一次不需要判断)

例如15  ---  1111

(1)移位    0000_0000         加    0000_0001        判断    0000_0001

(2)移位    0000_0010         加    0000_0011        判断    0000_0011

(3)移位    0000_0110         加    0000_0111        判断    0000_1010

(4)移位    0001_0100         加    0001_0101

/*********************************
 功能:实现对6位十进制数以内的bcd码转换
 time: 2017/4/29
 vision:1.0
*********************************/

`define        data_in_num        19
`define        data_bcd_num    23
module        pro_bcd(
            clk,
            rst_n,
            data_in,
            data_bcd
);
input                            clk;
input                            rst_n;
input        [`data_in_num :0]    data_in;
output        [`data_bcd_num:0]    data_bcd;        

reg            [`data_bcd_num:0]        data_bcd_r;
reg            [1:0]                state;
reg            [5:0]                shift_cnt;
always @(posedge clk or negedge rst_n)
    if(!rst_n)begin
        data_bcd_r <= 0;
        state <= 0;
        shift_cnt <= 0;
    end
    else
        case(state)
            2‘d0:begin
                shift_cnt <= 0;
                data_bcd_r <= 0;
                state <= state + 1;
            end
            2‘d1:begin //移位
                if(shift_cnt < `data_in_num + 1)begin
                    data_bcd_r <= data_bcd_r<<1;
                    shift_cnt <= shift_cnt + 1;
                    state <= state + 1;
                end
                else
                    state <= 0;
                end
            2‘d2:begin //相加
                data_bcd_r <= data_bcd_r + data_in[`data_in_num + 1 - shift_cnt];
                state <= state + 1;
            end
            2‘d3:begin //判断
                if(data_bcd_r[3:0] > 4 ) //1
                    data_bcd_r <= data_bcd_r + 3;
                if(data_bcd_r[7:4]>4)    //2
                    data_bcd_r[7:4] <= data_bcd_r[7:4] + 3;
                if(data_bcd_r[11:8]>4)   //3
                    data_bcd_r[11:8] <= data_bcd_r[11:8] + 3;
                if(data_bcd_r[15:12]>4)  //4
                    data_bcd_r[15:12] <= data_bcd_r[15:12] + 3;
                if(data_bcd_r[19:16]>4)  //5
                    data_bcd_r[19:16] <= data_bcd_r[19:16] + 3;
                if(data_bcd_r[`data_bcd_num:20]>4)  //6
                    data_bcd_r[`data_bcd_num:20] <= data_bcd_r[`data_bcd_num:20] + 3;
                state <= 1;
            end

            default:state <= 0;
        endcase

assign        data_bcd = (state == 3)&&(shift_cnt == `data_in_num + 1) ? data_bcd_r : data_bcd;

endmodule
时间: 2025-01-13 00:21:51

二进制转BCD码的相关文章

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

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

二进制转BCD

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

【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则是表示三位十进制数:(好像有点

BCD码

BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码,是用4位二进制数来表示1位十进制数中的0~9这10个数码,用一种使用二进制编码十进制的数字编码形式.BCD码这种编码形式利用四个位元来储存一个十进制的数码,从而使二进制和十进制之间的转换得以更加快捷地进行.相对于一般的浮点式记数法,采用BCD码,既可保存数值的精确度,又可免去使计算机作浮点运算时所耗费的时间.此外,对于其他需要高精确度的计算,BCD编码亦很常用. 由于十进制数共有0.1.2.…….9十个数码,

十六进制和BCD码的区别

十六进制转二进制: 将每一位十六进制转化为4为二进制位即可. BCD码: 将十进制的每一位转化为4位二进制位即可. 方法都是将每一位转为4位二进制位,但是区别是一个对应的是十六进制,一个对应的是十进制.比如给出二进制数0101 0101 如果对应十六进制,则是0x55 如果对应BCD码,则是55(注意这里是十进制的55,上面是十六进制的55)

BCD码与十进制

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

BCD码转换为十进制或者十进制转为BCD码

BCD码其实就是之前在数字电路中说的 用4位二进制数值 来表示一个0-9中的数字,例如: 0000=0 0001=1 0010=2 0011=3也就是说如果把一个数字作为一个BCD码,例如: 11 22那么他应该展开为: 00010001 00100010也就是对应为十进制: 17 34所以一个BCD吗转为十进制数据的思想就是: 将BCD码每个数字分离出来,例如上面的11将十位的1分离出来然后右移4位乘上一个10 在加上 个位的数字即可.十进制转BCD码的 思想:将这个十进制数字用二进制表示,高

BCD码干什么用的?

二进制编码的十进制(Binary Coded Decimal,BCD)数据类型在计算机系统中已经存在很久了.BCD格式经常用于简化对使用十进制数字的设备(比如必须向人显示数字的设备,如时钟和计时器)的处理.处理器不是把十进制数字转换为二进制数字以便进行数学操作,然后再转换回十进制:而是可以按照BCD格式保存数字并且执行数学操作.   BCD的名称就说明了它的作用,它按照二进制格式对十进制数字进行编码.每个BCD值都是一个无符号8位整数,值的范围是0到9.在BCD中,大于9的8位值被认为是非法的.