精华内容
下载资源
问答
  • DH11 程序(以SF板为例)[包含单字节二进制转换BCD码程序].raDH11 程序(以SF板为例)[包含单字节二进制转换BCD码程序].rarr
  • 占用资源少、移植性好、扩展方便的verilog HDL二进制转bcd码程序 下载的朋友请在 bcd ; 的前面加上 result[0] = bin[B_SIZE-1]; 由此造成的不便请见谅 CSDN文档上传后不能删除,这点也让我纠结
  • FPGA 二进制转bcd码

    千次阅读 2018-10-28 19:15:47
    //这是一个使用Verilog HDL编写的带使能端的8-bit二进制转BCD码程序,具有占用资源少、移植性好、扩展方便的特点。 module bcd(rst_n,binary,bcd); //rst_n为使能端,binary为待转换的二进制数,bcd为转换后的BCD码...
    //这是一个使用Verilog HDL编写的带使能端的8-bit二进制转BCD码程序,具有占用资源少、移植性好、扩展方便的特点。   
    module bcd(rst_n,binary,bcd);   //rst_n为使能端,binary为待转换的二进制数,bcd为转换后的BCD码      
    parameter B_SIZE=12;				//B_SIZE为二进制数所占的位数,可根据需要进行扩展 
    
    input       rst_n;                 	//rst_n高电平有效,低电平时
    input  		[B_SIZE-1:0] binary;
    output reg  [B_SIZE+3:0] bcd;
    
       
    reg  [B_SIZE-1:0] bin;   
    //reg  [B_SIZE+3:0] bcd;    //bcd的长度应根据实际情况进行修改   
    reg  [B_SIZE+3:0] result;   //result的长度=bcd的长度 
     
    
      
    always@(binary or rst_n)
       begin      
          bin= binary;     
    	  result = 0;         
       if(rst_n == 0) 
    	  bcd <= 0;      
    else    
    	begin         
    repeat(B_SIZE-1)//使用repeat语句进行循环计算      
       begin            
    	result[0] = bin[B_SIZE-1];                     
       if(result[3:0] > 4)            
        result[3:0]=result[3:0]+ 4'd3;      
       if(result[7:4] > 4)            
        result[7:4]=result[7:4]+4'd3;  
       if(result[11:8] > 4)   	   
    	result[11:8] = result[11:8]+4'd3; //扩展时应参照此三条if语句续写   
       if(result[15:12] > 4)   	   
    	result[15:12]= result[15:12]+ 4'd3;  
    	result=result<<1;
    	bin=bin<<1; end         
    	result[0]= bin[B_SIZE-1]; 
    	bcd<=result;   
       end  
       end   
    endmodule

     

    展开全文
  • 1. BCD码的求和BCD码使用4位二进制数来表示十进制中0~9这10个数的数码。例如,十进制的237,其BCD码就是0010_0011_0111,但是其二进制是1110_1101。我们先来研究两个4位的BCD码相加的情况。设这两个BCD码对应的十...

    1. BCD码的求和

    BCD码使用4位二进制数来表示十进制中0~9这10个数的数码。例如,十进制的237,其BCD码就是0010_0011_0111,但是其二进制是1110_1101。

    我们先来研究两个4位的BCD码相加的情况。设这两个BCD码对应的十进制是a,b,其中a,b∈{0,1,2,...,9}。此时只有3种情况:

    0≤a+b≤9

    10≤a+b≤15

    16≤a+b≤18

    也就是说:

    对于第一种情况,结果本身就是对应的BCD码。例如,0100+0101=1001,即4+5=9;

    对于第二种情况,其结果对于4位运算来说没有产生进位,但是结果超过了BCD码表示的范围(因为4位BCD码最多表示9)。例如,5+8=13,0101+1000=1101

    对于第三种情况,其结果对于4位运算来说不仅产生了进位,而且其结果也超过了BCD码表示的范围。例如,4+13=17,0100+1101=1_0001

    第一种情况显然不需要再修正。

    第二种情况,例如,5+8=13,我们希望得到BCD码是0001_0011,但是运算结果1101,因此如果我们加上了6,就可以得到正确结果:1101+0110=0001_0011。这是因为,十进制是逢十进一,但是4位BCD加法,在看作是二进制数做加法时,是逢十六进一。因此,如果结果是10≤a+b≤15,加上6以后就是16+0≤a+b+6≤16+5,此时因为逢十六进一的原因,就得到了结果1_0≤[a+b+6]≤1_5,这个结果就是对的。

    第三种情况,因为16≤a+b≤18,逢十六进一后,我们得到了1_0≤[a+b]≤1_2,为了使结果正确,如果我们加上一个修正值6,就得到1_6≤[a+b+6]≤1_8,从而结果也变得正确。

    综上所述,如果两个BCD码相加:

    如果结果小于9,则不做操作

    如果结果大于9,则需要加上6作为修正值

    考虑一个例子,比如 35+99=134。35和99的BCD码分别是0011_0101和1001_1001。先计算低4位:0101+1001=1110,因为这个值大于9,因此加上6作为修正:1110+0110=1_0100。现在计算高四位,同时注意到还有一个进位:0011+1001+0001=1101,这个值还是大于9,加上6,得到1101+0110=1_0011。因此最终结果是1_0011_0100,这刚好就是134的BCD码。

    我们之所以能够安全地加上进位,是因为BCD加法比照的就是十进制的加法,只不过前者是4位为一个单位,而后者是以1位数字作为一个单位。加上修正值后,BCD加法的进位就相当于十进制加法的进位。图示如下:

    42ad12622dc8

    2. 二进制转BCD码

    给定一个二进制数,要转BCD码。一个常用算法就是不断将该数除以10,以此依次分解出个位、十位、百位……上的数字,这些数字的4位二进制数就是对应的BCD。但是这样的算法需要不断做除法操作十分的麻烦。我们可以使用名为加三左移法来完成。

    这个算法基于以下的事实:

    一个数乘以2,相当于其二进制左移1位

    两个BCD码相加,如果结果大于9,需要加上6作为修正

    一个n位二进制数

    math?formula=h%3Db_%7Bn-1%7Db_%7Bn-2%7D%5Cdotsc%20b_0,其展开是

    math?formula=h%3D%5Csum_%7Bi%3D0%7D%5E%7Bn-1%7D%20b_i2%5Ei如果使用秦九韶算法的嵌套形式写法,可以写成:

    math?formula=h%3D2(2(%5Cdotsc(2(2b_%7Bn-1%7D%2Bb_%7Bn-2%7D)%2Bb_%7Bn-3%7D)%5Cdotsc)%2Bb_1)%2Bb_0或者若令

    math?formula=%5Cbegin%7Bcases%7D%20%5Cmathcal%7BH%7D_i%26%3D2%5Cmathcal%7BH%7D_%7Bi%2B1%7D%2Bb_%7Bi%7D%5C%5C%20%5Cmathcal%7BH%7D_%7Bn-1%7D%26%3Db_%7Bn-1%7D%5Cend%7Bcases%7D

    math?formula=h%3D%5Cmathcal%7BH%7D_0如果使用这种形式,我们先计算的是

    math?formula=%5Cmathcal%7BH%7D_%7Bn-1%7D,然后是

    math?formula=%5Cmathcal%7BH%7D_%7Bn-2%7D%3D2%5Cmathcal%7BH%7D_%7Bn-1%7D%2Bb_%7Bn-2%7D,然后是

    math?formula=%5Cmathcal%7BH%7D_%7Bn-3%7D%3D2%5Cmathcal%7BH%7D_%7Bn-2%7D%2Bb_%7Bn-3%7D,……,最后是

    math?formula=%5Cmathcal%7BH%7D_%7B0%7D%3D2%5Cmathcal%7BH%7D_%7B1%7D%2Bb_%7B0%7D

    注意到

    math?formula=2%5Cmathcal%7BH%7D_i就是把

    math?formula=%5Cmathcal%7BH%7D_i左移1位,这样就会在最右边空出一个位,之后再加

    math?formula=b_%7Bi-1%7D就是用

    math?formula=b_%7Bi-1%7D填充这个最低位,从而我们得到了

    math?formula=%5Cmathcal%7BH%7D_%7Bi-1%7D。不断左移,最终就能得到

    math?formula=h,现在我们来设计一个算法使得左移结束后能得到对应的BCD码。

    math?formula=R是一个无限长的、初始状态为所有位都是0的理想寄存器,

    math?formula=h是欲转换的数。我们使用下面的归纳法来构造证明我们通过不断左移最终能够得到存储在

    math?formula=R中的

    math?formula=h对应的BCD码:

    初始:

    math?formula=h左移

    math?formula=b_%7Bn-1%7D进入

    math?formula=R,通过若干运算后,

    math?formula=R中是

    math?formula=%5Cmathcal%7BH%7D_%7Bn-1%7D的BCD码。这个显然是成立的,因为

    math?formula=%5Cmathcal%7BH%7D_%7Bn-1%7D%3Db_%7Bn-1%7D是1位(不是0就是1,对应BCD码就是本身),将其左移进

    math?formula=R后,

    math?formula=R的值立即是

    math?formula=%5Cmathcal%7BH%7D_%7Bn-1%7D的BCD码

    假设:设某一时刻,已经将

    math?formula=b_i左移入

    math?formula=R,通过若干运算后,此时

    math?formula=R中是

    math?formula=%5Cmathcal%7BH%7D_%7Bi%7D的BCD码

    归纳:现在准备移入

    math?formula=b_%7Bi-1%7D,我们希望这个步骤结束后,

    math?formula=R的值是

    math?formula=%5Cmathcal%7BH%7D_%7Bi-1%7D的BCD码。因为此时

    math?formula=R

    math?formula=%5Cmathcal%7BH%7D_%7Bi%7D的BCD码,现在对

    math?formula=R从最低位开始每四位作为一个单位

    math?formula=u,即将

    math?formula=R划分为

    math?formula=R%3D%5Cdotsc%5Cdotsc%20u_%7B2%7Du_%7B1%7Du_%7B0%7D,设

    math?formula=i%3D0,做如下处理:

    如果从

    math?formula=u_i开始之后全部为0,则过程结束

    否则如果

    math?formula=u_i%3C5,则转第4步

    否则,令

    math?formula=u_i%3Du_i%2B3,保留4位

    math?formula=i%3Di%2B1,转第1步

    为什么要加3呢?这是因为如果

    math?formula=u_i%5Cgeqslant%205,那么加法结果要加修正值6,也就是

    math?formula=2u_i%2B6,这等价于

    math?formula=2(u_i%2B3);如果

    math?formula=u_i%3C5,那么加法结果就不需要修正。此外,因为

    math?formula=R目前本身就是BCD码,因此必然

    math?formula=u_i%5Cleqslant9,从而加3不会产生进位。如此处理后,将

    math?formula=R左移一位,也就是乘以2,此时得到的就是

    math?formula=2%5Cmathcal%7BH%7D_%7Bi-1%7D的BCD码。现在,因为乘以2的关系,

    math?formula=R必然是偶数,故而BCD最低位的数值

    math?formula=u_0%5Cleqslant8,于是加上

    math?formula=b_%7Bi-1%7D后有

    math?formula=u_0%2Bb_%7Bi-1%7D%5Cleqslant9。从而,得到的就是

    math?formula=%5Cmathcal%7BH%7D_%7Bi-1%7D正确的BCD码。

    由数学归纳原理,移动len(h)次后,我们最终可以得到

    math?formula=h的BCD码。

    作为一个例子,考虑使用该算法将

    math?formula=134的二进制1000_0110转为BCD码:

    初始:R=..._0000_0000,h=1000_0110(下面使用#作为占位符)

    R中的

    math?formula=u_i均小于5,不做处理。R左移1位,h左移一位进入R:R=..._0000_0001,h=0000_110#

    R中的

    math?formula=u_i均小于5,不做处理。R左移1位,h左移一位进入R:R=..._0000_0010,h=0001_10##

    R中的

    math?formula=u_i均小于5,不做处理。R左移1位,h左移一位进入R:R=..._0000_0100,h=0011_0###

    R中的

    math?formula=u_i均小于5,不做处理。R左移1位,h左移一位进入R:R=..._0000_1000,h=0110_####

    R中的

    math?formula=u_0%3D8%5Cgeqslant5,对其做加3处理得到R=..._0000_1011。R左移1位,h左移一位进入R:R=..._0001_0110,h=110#_####

    R中的

    math?formula=u_0%3D6%5Cgeqslant5,对其做加3处理得到R=..._0001_1001。R左移1位,h左移一位进入R:R=..._0011_0011,h=10##_####

    R中的

    math?formula=u_i均小于5,不做处理。R左移1位,h左移一位进入R:R=..._0110_0111,h=0###_####

    R中的

    math?formula=u_0%3D7%5Cgeqslant5%2Cu_1%3D6%5Cgeqslant5,对其都做加3处理得到R=..._1001_1010。R左移1位,h左移一位进入R:R=..._0001_0011_0100,h=####_####

    现在,

    math?formula=h已经全部移入,此时

    math?formula=R的值就是0001_0011_0100,它就是

    math?formula=134的BCD码。

    C语言的算法如下:

    #include

    #define N 50

    #define DIGITS_NUM 8*sizeof(byte_t)

    typedef char byte_t;

    byte_t regstr[N];

    void resetRegstr(){

    for(int i=0;i

    }

    void show8421bcd(){

    int i=0;

    for(i=0;i

    if(regstr[i]!=0) break;

    }

    if(i==N) {

    printf("0\n");

    return;

    }

    for(;i

    byte_t unit=regstr[i];

    for(int j=0;j

    printf("%d",(unit>>(4*(DIGITS_NUM/4-j-1)))&0xF);

    }

    }

    printf("\n");

    }

    byte_t _processUnit(byte_t unit){

    byte_t newval=0;

    for(int j=0;j

    int val=0xF&(unit>>(4*j));

    newval|=(val+(val>4?3:0))<

    }

    return newval;

    }

    int to8421bcd(byte_t *num,int n){

    resetRegstr();

    for(int k=0;k

    byte_t digit=num[k];

    for(int i=DIGITS_NUM-1;i>-1;i--){

    byte_t bi=(digit>>i)&0x1;

    for(int j=N-1;j>-1;j--){

    byte_t bi_=_processUnit(regstr[j]);

    regstr[j]=(bi_<<1)|bi;

    bi_=(bi_>>(DIGITS_NUM-1))&0x1;

    if(bi_==1&&j==0) return 0;

    bi=bi_;

    }

    }

    }

    return 1;

    }

    void main(){

    byte_t nums[]={/*2,321,973,245,437,681,127 */

    0x20,0x39,0x4E,0x5D,0x48,0x46,0x1D,0xE7

    };

    int ok=to8421bcd(nums,8);

    if(!ok){

    printf("something wrong...\n");

    }else{

    show8421bcd();

    }

    }

    展开全文
  • 利用Verilog语言写的二进制转BCD码程序
  • 二进制转BCD码,用的移位加三法,相对于用常规的除法和取余方法来说节省大量资源
  • 本例为单字节二进制数(0X20)转换为非压缩BCD ,存在0X25,0X24,0X23 中,0X25 为百位,0X23 为个位。main: MOV a,@0xa4 ;赋值MOV 0x20,aMOV 0x21,aMOV 0x22,aMOV a,@0x0 ;0x23,0x24,0x25 单元清0MOV 0x23,aMOV 0x24,a...

    本例为单字节二进制数(0X20)转换为非压缩BCD 码,存在0X25,0X24,0X23 中,0X25 为百位,0X23 为个位。

    main: MOV a,@0xa4 ;赋值

    MOV 0x20,a

    MOV 0x21,a

    MOV 0x22,a

    MOV a,@0x0 ;0x23,0x24,0x25 单元清0

    MOV 0x23,a

    MOV 0x24,a

    MOV 0x25,a

    MOV a,@0x64 ;对100 的个数计数

    MOV 0x26,a

    MOV a,@0x25 ;百位存在0x25 中

    MOV 0x04,a

    call a0 ;调计数子程

    MOV a,@0x0a ;对10 的个数计数

    MOV 0x26,a

    dec 0x04 ;个位存在0x24 中

    call a0

    MOV a,0x22 ;除去百位,十位,余下的即个位,存入0x23

    MOV 0x23,a

    self: jmp self

    a0: ;计数子程

    MOV a,0x26

    sub 0x22,a

    jbs 0x03,2

    jmp a1

    inc 0x00 ;无余数则对应位加1

    MOV a,@0x0 ;0x21 与0x22 在返回时应保持相同

    MOV 0x21,a

    ret

    a1: jbs 0x03,0 ;小于则跳a2

    jmp a2

    inc 0x00 ;大于则计数值加1

    MOV a,0x22

    MOV 0x21,a ;将0x22 保存到0x21 中

    jmp a0 ;跳回a0 继续计数

    a2: MOV a,0x21 ;0x21 中保存的减之前的数据,此时恢复到0x22

    MOV 0x22,a

    ret

    eop

    展开全文
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼这是我自己找的代码,一直有错,不知道怎么改DATA SEGMENTBUFF1 DB "Please enter BCD code:$"BUFF2 DB 50DB ?DB 50 DUP(0)BUFF3 DB 50DB ?DB 50 DUP(0)DATA ENDSSSTACK ...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

    这是我自己找的代码,一直有错,不知道怎么改

    DATA SEGMENT

    BUFF1 DB "Please enter BCD code:$"

    BUFF2 DB 50

    DB ?

    DB 50 DUP(0)

    BUFF3 DB 50

    DB ?

    DB 50 DUP(0)

    DATA ENDS

    SSTACK SEGMENT STACK

    DW 64 DUP(?)

    SSTACK ENDS

    CODE SEGMENT

    ASSUME CS:CODE

    START: MOV AX,DATA

    MOV DS,AX

    MOV DX,OFFSET BUFF1

    MOV AH,9H

    INT 21H

    XOR AX, AX ;1、将AX清零;

    ; 2、将CF标志位也清零。

    ;也就是说相当于以下两条指令:

    ; MOV ax,0

    ; CLC

    MOV CX, 0004H ;输入数据长度。[4000]:01,02..?

    MOV SI, 3500H

    MOV DI, 3510H

    MOV DX,OFFSET BUFF2

    MOV AH,0AH

    INT 21H

    LEA SI,BUFF2

    A1: MOV AL, [SI]

    ADD AL, AL ;*2

    MOV BL, AL

    ADD AL, AL ;*2

    ADD AL, AL ;*2

    ADD AL, BL ;*10

    INC SI

    ADD AL, [SI] ;BCD 个位,十位相加

    MOV [DI], AL ;存结果

    INC SI

    INC DI

    LOOP A1 ;cx不为零继续

    MOV DX,OFFSET BUFF3

    MOV AH,0AH

    INT 21H

    MOV AH,4CH

    INT 21H ;程序终止

    CODE ENDS

    END START

    展开全文
  • 8位二进制转BCD码.docx

    2019-06-20 16:54:49
    使用Verilog语言开发的将8位转入二进制数据转换为BCD码,其中转换后分别输出为个、十、百位。
  • 实验一 二进制BCD转换一、实验内容将存放在R2中的一个单字节二进制数,转换成非压缩的二—十进制(BCD),并存放到R3R4R5中。二、实验仪器和设备PC机、星研Star16L仿真器系统+仿真头PODPH51(DIP)、EL-Ⅱ型通用接口...
  • 浅谈二进制转BCD码(加三移位法)

    万次阅读 2017-09-26 21:03:27
    二进制转BCD 加三移位法(网上是这么叫的) ... 二进制想要BCD码,关键就是其转换为十进制后分离其各个位,每一位用4位二进制表示即可。  如果不转换成十进制如何将其表示为BCD码?  4位二进制最高表示15
  • 大家可以看看,这个代码是关于二进制数如何转换成bcd码的一个用vhdl编写的程序,可以参考下思路
  • 【单字节二进制整数转换为BCD码子程序】;;入口:(A)= 二进制整数,;;出口:(R0)= 存放BCD码的RAM首址指针。BINtoBCD1:MOV B, #100DIV AB ;;A←百倍数, B←余数MOV @R0 A ;;RAM←百位数INC R0 ;;RAM指针加1MOV ...
  • 二进制码转换为bcd码 输入的是data_gen产生的数据,输出的是要显示的个十百千万十万,共六个数码管的数据。bcd_8421主要是将data_gen产生的二进制数据转化为bcd码,这样便于显示,其转换如下所示。 最后移位的...
  • 在分析代码之前,我们先来了解一下,BCD码二进制到底区别在哪?  学习过计算机原理的和数字电子技术这两门课的都会知道这两个到底是什么含义,也有的同学学过了,考过了,过了一段时间又忘记了,今天,我们通过一...
  • 16位二进制转换为bcd码的c51汇编程序(16 bit binary converted to BCD code C51 assembler)16位二进制转换为bcd码的c51汇编程序(16 bit binary converted to BCD code C51 assembler)Algorithm 16 bit binary code ...
  • 二进制转 BCD码 VHDL

    2010-06-03 22:37:46
    一个较为适合初学者(CPLD\FPGA)的VHDL语言程序
  • 16位二进制转换为BCD码的C51汇编程序16位二进制转换为BCD码的C51汇编程序16位二进制转BCD码程序算法及51汇编实现:n=b15~b0n=[b15~b8]*256+[b7~b0]=[b15~b12]*4096+[b11~b0],高四位[b15~b12]取值范围为0~15,代表...
  • 二进制BCD码(内含完整C语言的代码)
  • 16位二进制转BCD码程序算法及51汇编实现:n=b15~b0n=[b15~b8]*256+[b7~b0]=[b15~b12]*4096+[b11~b0],高四位[b15~b12]取值范围为0~15,代表了4096的个数n=[b15~b12]*4000+{[b15~b12]*(100-4)+[b11~b0]}用x 代表[b15...
  • 二进制转BCD码

    万次阅读 2015-05-15 22:33:25
    但是,在FPGA里面用求商和求余将会非常消耗资源,这样就必须用到二进制转BCD码了,这里介绍一种简单的加3移位算法。 注:B代表二进制,D代表十进制,0x代表十六进制,BCD为BCD码,下同。 1、加3移位法 以二进制数...
  • 假若A是16位的二进制数字,转换的数学表达式如下:A = 2^15+2^14+.....2^1+2^0在转换的时候,待转换的数是16位(两字节),环路计数器是16次,最大的结果因有65535,所以至少要用2.5字节存结果,取整之后就是3个字节做...
  • 为方便读者学习,本文小编给读者提供了用verilog将二进制码转换为十进制BCD码程序设计方法,供读者参考。
  • 在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。.说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经...
  • 请编制程序,其功能是:内存中连续存放着10个用ASCII码表示的十进制个位数,将它们转换成相应的二进制字节数N0,N1,…,N9,然后按序将N0~N9,存入内存中,最后存放它们的和M(M=N0+N1+N9)。M用压缩型(组合型)BCD码...
  • library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;use ieee.std_logic_arith.all;entity B_BCD isport(clk: instd_logic;din: instd_logic_vector(26 downto 0);y0,y1,y2...
  • C语言:十进制BCD码互换

    万次阅读 2021-08-30 16:38:17
    最近写单片机 RTC 日期、时间配置,需要实现十进制BCD码互换,将示例Demo分享给各位朋友~
  • 利用Verilog写的32位的2进制转为8个BCD码输出的程序,采用流水线处理,可以用在高速时钟上,而且所需时钟个数为各个位上的数之和。
  • 二进制BCD码转换

    千次阅读 2011-10-24 11:49:51
    #define WORD_MSB(x) *((unsigned char *)&x+1) #define WORD_LSB(x) *((unsigned char *)&x) ...//二进制数转换为压缩BCD数,结果存入saveBCD中 int BinToBcd(unsigned char val) {  unsig

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,944
精华内容 3,177
关键字:

二进制转bcd码程序