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码是对的,所以达到了设计目标、

posted on 2016-08-30 20:08  Crazy_body_01  阅读(2307)  评论(0编辑  收藏  举报

导航