• 二进制转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
  • 相关阅读:
    关于 使用python向qq好友发送消息(对爬虫的作用----当程序执行完毕或者报错无限给自己qq发送消息,直到关闭)
    关于爬虫的制定
    关于scrapy 使用代理相关问题
    scrapy 关于特殊字符的处理
    scrapy
    关于数据去重
    零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(进阶篇)
    零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(代码篇)
    计算机编号、硬盘序列号和Mac地址查询方法
    统计学(第七版)第二章 数据的收集
  • 原文地址:https://www.cnblogs.com/bixiaopengblog/p/6785845.html
Copyright © 2020-2023  润新知