二进制 转换成十进制 BCD码(加3移位法)

“原来的二进制数十几位,则左移时就要左移几位”

  "二进制数调整BCD码的方法是将二进制码左移8次,每次移位后都检查低四位LSD+3是否大于7,如是则加3,否则不加,高4位MSD作同样处理"

一、为什么左移8次

原寄存器是存二进制数的,新寄存器是存十进制数的,当然要左移8次,把数据全部移进去。

但这里要注意两件事,第一,如果只安排一个字节作十进制寄存器,原数据要小于 64H(即100)。第二,由于新寄存器是十进制的,要随时调整。

二、检查 半字节+3 是否大于 7,是,则 +3

51 系列里有十进制调节指令(半字节大于 9,则加 6,应该不难理解),PIC 里没有,只好采取变通的方法。

检查 半字节+3 是否大于 7,也就是检查半字节是否大于 4。因为,如果大于 4(比如 5、6),下一步左移就要溢出了,所以加 3,等于左移后的加 6,起到十进制调节的作用。

那为什么要绕个圈子去检测 半字节+3 是否大于 7 呢?这样程序编起来会简练一些。

一个例子

假如有一个八位二进制数255,我把他转255的十进制数

0        1111 1111    原数

1        0000 0001    ;左移一次

2        0000 0011   ; 左移二次

3        0000 0111    ;左移三次,检查低四位+3>7?

3.1     0000 1010    ;大于7,加3进行调整

4        0001 0101    ;左移四次, 检查低四位+3>7?

4.1     0001 1000   ;大于7,加3进行调整

5        0011 0001    ;左移五次

6        0110 0011    ;左移六次,检查高四位+3>7?

6.1      1001 0011   ;大于7,加3进行调整

7           1 0010 0111     ;左移七次,检查低四位+3>7?

7.1       1 0010 1010      ;大于7,加3进行调整

8           10 0101 0101    ;左移八次(得到BCD码255)

 

附上Verilog代码:

//17位二进制数转BCD码(基本思想是逢十进1)

module BIN_BCD_4 (CLK, A, BW, BQ, BB, BS, BG);

    input CLK;

    input  [16:0]A;           //二进制输入数据

    output [3:0]BW, BQ, BB, BS, BG;//BCD数据输出寄存器

    reg    [3:0]BW, BQ, BB, BS, BG;

    integer I;

    reg  [19:0]TEMP;

    reg  [16:0]C;

 

    always @ (posedge CLK)

     begin

       C=A;

       TEMP=0;

 

       for (I=1; I<17; I=I+1)

           begin

           {TEMP, C}={TEMP[18:0], C, 1'b0};//左移一位

           if (TEMP[3:0]>4'b0100)

              begin

                TEMP[3:0]=TEMP[3:0]+3; // >4则加3

              end 

           if (TEMP[7:4]>4'b0100)

              begin

                TEMP[7:4]=TEMP[7:4]+3;

              end 

           if (TEMP[11:8]>4'b0100)

              begin

                TEMP[11:8]=TEMP[11:8]+3;

              end 

           if (TEMP[15:12]>4'b0100)

              begin

                TEMP[15:12]=TEMP[15:12]+3;

              end 

           if (TEMP[19:16]>4'b0100)

              begin

                TEMP[19:16]=TEMP[19:16]+3;

              end 

           {BW, BQ, BB,  BS, BG}={TEMP[18:0], A[0]};

           end

     end

 

endmodule

 

转载于:https://www.cnblogs.com/wandashuai/p/10741066.html

你可能感兴趣的:(二进制 转换成十进制 BCD码(加3移位法))