zoukankan      html  css  js  c++  java
  • 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码是对的,所以达到了设计目标、

  • 相关阅读:
    MFC中添加自己定义的消息
    动态创建的list control添加消息响应
    关于CString的奇怪问题
    如何去掉按钮在输入焦点切换时所产生的闪烁
    wince中将自己的应用程序编译到内核并开机启动的一种方法
    wince下圆角矩形按钮的实现
    关于error C2471:无法更新程序数据库的错误的解决方法
    关于烧写开机logo之后导致无法启动系统的问题
    利用IdHTTP进行多线程下载
    TEdit 控件的提示,就像 IE7 的地址输入栏一样
  • 原文地址:https://www.cnblogs.com/zhouzheng/p/5823449.html
Copyright © 2011-2022 走看看