zoukankan      html  css  js  c++  java
  • 二进制 转换成十进制 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

  • 相关阅读:
    码到成功——冲刺随笔 day 8
    码到成功——冲刺随笔 day 7
    码到成功——冲刺随笔 day 6
    码到成功——冲刺随笔 day 5
    码到成功——冲刺随笔 day 4
    码到成功——冲刺随笔 day 3
    码到成功——冲刺随笔 day 2
    Alpha冲刺 —— 5.9
    Alpha冲刺 —— 5.8
    Alpha冲刺 —— 5.7
  • 原文地址:https://www.cnblogs.com/wandashuai/p/10741066.html
Copyright © 2011-2022 走看看