首页 > 代码库 > bcd转二进制

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/1psmodule  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=4d0;    shiw=4d0;    gew=4d0;    #1000     rst_n=1;    #100 baiw=4d1;    shiw=4d2;    gew=4d0;    #100 baiw=4d3;    shiw=4d2;    gew=4d9;    #100 baiw=4d4;    shiw=4d2;    gew=4d9;end always #10 sclk =~sclk;    bcd2bin    U1(                    .sclk        (sclk)        ,                    .rst_n        (rst_n)        ,                    .gew            (gew)        ,                    .shiw        (shiw)        ,                    .baiw        (baiw)        ,                    .binary     (binary)                    );endmodule 

modelsim仿真:

技术分享

 

 

可以看出转换后的bin码是对的,所以达到了设计目标、

bcd转二进制