二进制码转换为二—十进制(BCD)码

转换原理


对于一个8位二进制码bn-1bn-2……b1b0,,其在十进制编码方式下的值为

                5a0d8b44-c7b7-457d-b13a-43b54c612df3.jpg      1

把上式写出套乘的形式:

                e5828df7-f9d8-41f7-8be8-fec9af9f5a03.jpg      式2

      式中的每项乘2,相当于将寄存器中的二进制码左移1位,这就意味着利用移位寄存器可以完成二进制与8421BCD的转换。[2]


      在移位的过程中,当现态Sn<5时,次态不变。当现态Sn=5、6、7时,左移一次,其次态Sn+1将会超过9,对于一个BCD码来说,这样的状态属于禁用状态。而当Sn=8、9时,左移1位,则会向高1位的BCD码输入一个进位的信号 ,由于二进制和BCD码权不一致,当发生进位时,虽然码元只是左移1位,但次态Sn+1将减少6。基于上面这两种情况,在B/BCD转换时需要对转换结果加以校正。校正过程如下:当Sn>=5时,我们让Sn先加上3,然后再左移1位,次态 Sn+1=2(Sn+3)=2Sn+6,正好补偿由于进位而减少的数值,并且向后一个变换单元送入一个进位信号,这个方法叫“加3移位法”。


     注意:现态和次态都是指BCD码,即用4位二进制表示的1位BCD码。我们对Sn=8、9时举个例子:BCD码的1000(8)乘以2为0001_0110(16),但是左移后变为0001_0000,减少了6。所以需要加上6,这里的方法是加3左移一位,相当于加上6。


转换方法

      首先,先了解二进制与BCD码的位数对应关系,比如一个8位二进制码,可以表示的最大十进制数为255,转换成BCD码为 0010_0101_0101,共需12位,其中每4位组成一个BCD单元,有三个BCD单元,分别表示百位(hundreds)、十位(tens)和个位(units)。n位二进制码转换成D位BCD码的n~D对应关系表见表1。


表1  n~D对应关系


cac216c8-f8f9-4a9e-b61a-79211733e5cf.jpg

       以8位二进制转换为3位BCD码为例,转换步骤是:将待转换的二进制码从最高位开始左移BCD的寄存器(从高位到低位排列),每移一次,检查每一位BCD码是否大于4,是则加上3,否则不变。左移8次后,即完成了转换。需要注意的是第八次移位后不需要检查是否大于5。


注意:为什么检查每一个BCD码是否大于4,因为如果大于 4(比如 5、6),下一步左移就要溢出了,所以加 3,等于左移后的加 6,起到十进制调节的作用。


表2给出了一个二进制码11101011转换成8421BCD码的时序。


表2  B/BCD时序


cecdaf59-9a98-4a49-b3ff-67b8536f218b.jpg 


Verilog 代码

/*

功能:    8位二进制转3位BCD码

输入参数:输入时钟clk,输入二进制数据dat

输出参数:个位units,十位tens,百位hundreds

备注:二进制转BCD码的实现方法很多,本例采用的是“加3移位法”

本例实现的是8位二进制转3位BCD码的例子,例如输入2’b11111111(255),输出0010_0101_0101(BCD)

*/


module BIN_to_BCD(clk,dat,units,tens,hundreds);

input  clk;

input[7:0] dat; //二进制输入数据

output[3:0] units;

output[3:0] tens;
output[3:0] hundreds;

reg[3:0]  units_r,tens_r,hundreds_r;//BCD数据输出寄存器

reg[7:0] dat_r;

reg[11:0] temp; //中间寄存器

integer i;

        assign units =  units_r;

        assign tens =  tens_r;

        assign hundreds = hundreds_r;


always @(posedge clk)


begin

      dat_r = dat;

      temp = 0;

      for(i = 0;i < 7;i = i + 1) //循环7次,注意不是8次,因为第八次不需要修正

      begin

             temp = {temp[10:0],dat_r[7]}; //左移一位

             if(temp[3:0] > 4'd4) //大于4,加三

                    temp[3:0] = temp[3:0]+4'd3;

             if(temp[7:4] > 4'd4) //大于4,加三

                    temp[7:4] = temp[7:4]+4'd3;

             if(temp[11:8] > 4'd4) //大于4,加三

                    temp[11:8] = temp[11:8]+4'd3;

             dat_r=dat_r<<1;  //最高变为原来dat_r的第六位

             {hundreds_r,tens_r,units_r}={temp[10:0],dat[0]};//最后一次(第8次)不用修正

         end

end

endmodule


 波形仿真报告说明


da59bb4f-2d7e-4361-864e-13bc375ab255.jpg


图1   输入二进制1111_1111(255)的波形仿真报告

 

分析综合报告说明


1eed694d-5e57-492b-abee-8834a64c9fd0.jpg


图2  8位二进制转BCD码的分析综合报告 


        待转换二进制位数(n)越大,锁消耗的LE的越多,当n大于8时,采用上面算法的Verilog HDL 代码会消耗大量的LE。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值