二进制转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
(0)

相关推荐

  • 二进制码与BCD码

    精华 | 2020年全年工控技术文章汇总 ,全在这儿!

  • 【博文精选】关于Xilinx-FPGA的DNA的使用场景和读取方法

    Xilinx每一个FPGA都有一个独特的ID,也就是Device DNA,这个ID相当于我们的身份证,在FPGA芯片生产的时候就已经写死在芯片的eFuse寄存器中,具有不可修改的属性,因为使用的是熔断 ...

  • 【原创博文】在FPGA中使用for循环一定浪费资源吗?

    渐渐地,发现自己已经习惯于发现细节,喜欢打破常规,真的非常喜欢这种feel. 相信很多人在书上或者博文上都有提出"在FPGA中使用for语句是很占用资源的"的观点,特权同学也不例外 ...

  • 一天一个设计实例-门控时钟和使能时钟

    门控时钟的简介: 组合逻辑中多用门控时钟,一般驱动门控时钟的逻辑都是只包含一个门,如果有其他的附加逻辑,就容易因竞争而产生不希望的毛刺.门控时钟通过一个时能信号控制时钟的开关.当系统不工作时可以关闭时 ...

  • 【精品博文】BCD转二进制与计算模块

    这是计算器的最后一个模块了,前面分别总结了一下矩阵键盘扫描模块,数码管显示与消零模块,逐位输入与输出控制模块,可以说是万事具备,只欠东风了,今天就来总结一下这个东风吧.其实计算模块是比较简单的.大致框 ...

  • 【精品博文】FPGA的计算器设计——逐位输入与输出控制模块

    之前写了两篇关于计算器的模块,一个是键盘扫描,一个是数码管消零,今天我总结一下第三个模块,也就是标题写的逐位输入与输出控制模块.我们平时使用过计算器都应该了解,我们每按一个键,显示屏上就多一个数,并且 ...

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

    在项目设计中,经常需要显示一些数值,比如温湿度,时间等等.在数字电路中数据都是用二进制的形式存储,要想显示就需要进行转换,对于一个两位的数值,对10取除可以得到其十位的数值,对10取余可以得到个位的数 ...

  • 二进制转BCD码需要几步?

    Hi,大家好!我是至芯科技的李老师. 今天讲课的题目比较有意思,它是一个小问题:把二进制变成BCD码需要几步? 请大家思考一下.有同学可能回答需要三步,为什么啊? 因为啊,把大象放进冰箱里需要三步,第 ...

  • BCD码

    精华 | 2020年全年工控技术文章汇总 ,全在这儿!

  • archlinux的安装是如何从源码到二进制

    其实不管是什么linux的发行版本,都需要一个软件包管理器,负责将用户需要的软件从源代码转换成二进制程序.无论是早期的rpm.yum.apt.emerge还是pacman都是这个原理,但是具体细节呢. ...

  • 手工焊接,二进制写码,B站Up主手搓CPU爆火出圈

    机器之心报道 编辑:小舟.张倩 CPU是怎么执行0101的呢?就为了这点好奇心,一位B站Up主自己动手焊了个CPU-- 在 B 站当 UP 主,门槛是出了名的高. 有人会用 AI 还原朱元璋,有人能造 ...

  • 通达信突破孕线选股公式源码

    T1:=(REF(O,4)-REF(C,4))/REF(O,4)>=0.05; A:=HHV(C,3); B:=LLV(C,3); T2:=REF(A,1)<REF(H,4) && ...

  • Day 404 希腊语超市篇 | 收银员扫了两次码,如何向对方解释?

    您好! Καλώς ήρθατε! 欢迎来到"希游记朗读营". 让我们静下 来学习希腊语. 在希游记之旅上你我结伴同行. Πάμε! 版权声明 本文首发自微信公众账号:希游记朗读营 ...