Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2565387
  • 博文数量: 320
  • 博客积分: 9650
  • 博客等级: 中将
  • 技术积分: 3886
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-27 21:05
文章分类

全部博文(320)

文章存档

2024年(1)

2017年(5)

2016年(10)

2015年(3)

2014年(3)

2013年(10)

2012年(26)

2011年(67)

2010年(186)

2009年(9)

分类:

2010-07-05 15:53:35

  "二进制数调整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


阅读(12463) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

mcuflower2011-05-22 22:01:03

匿名: 你好 有vhdl编的这个二进制转十进制 的程序吗.....
不好意思,本人对vhdl不熟悉。

2011-05-05 17:46:14

你好 有vhdl编的这个二进制转十进制 的程序吗

chinaunix网友2010-10-31 22:18:13

多谢!

chinaunix网友2010-08-02 15:33:12

顶 很好