精华内容
下载资源
问答
  • BCD十进制转换的算法

    万次阅读 2014-06-13 09:00:10
    BCD是指用二进制来表示十进制数的编码,即用4位二进制来表示一个十进制数,因此4位二进制数表示最大的十进制数9(1001),只取十六个数中的十个数(有别于8421码)。 为了表示两个十进制数(十位、个位),需要两...
    
    

    BCD是指用二进制来表示十进制数的编码,即用4位二进制来表示一个十进制数,因此4位二进制数表示最大的十进制数9(1001),只取十六个数中的十个数(有别于8421码)。

    为了表示两个十进制数(十位、个位),需要两个BCD码(8位),可以用char 类型来储存,比如:

    BCD码:0x99 (153),共八位,储存在char 类型中,它对应的二进制为1001 1001.该BCD码要转换成十进制数99。

       算法应该是这样子的:

        153 - 99= 54

       54 - 9*N = 0 ----> N = 6

    (这些只是验证,知道了算法再去推,感觉有点奇怪,现在还是弄不明白,不过这种算法确实很简洁!)

    --------------------神奇的分割线---------------------

    这算法有点明白了。十进制数是指逢十进一,而十六进制则是逢十六进一,它们之间每次进位差了6,因此要把一个BCD转换成一个十进制的数,先算清多进位的位数,比如0x99,它多进位9次(十位数),那它就多加了9次6,要转换成十进制,只需用0x99 - 9*6 即可。

    很巧妙的算法,利用了十进制与十六进制之间的本质区别。

    -----------------------------------------------

    static unsigned char bcd_decimal(unsigned char bcd)
    {
    return bcd-(bcd >> 4)*6;
    }

    static unsigned char decimal_bcd(unsigned char decimal)
    {
    return (unsigned char) (decimal+(decimal / 10)*6);
    }

    展开全文
  • 今天给大侠带来一表透彻 二进制转BCD之大四加三算法,话不多说,上货。 这里超链接几篇,给各位大侠参考。 基于FPGA的二进制转BCD设计(附代码) FPGA学习altera 系列 第二三篇 二进制转BCD FPGA学习altera ...

    今天给大侠带来一表透彻 二进制转BCD之大四加三算法,话不多说,上货。

     

    这里超链接几篇,给各位大侠参考。

    基于FPGA的二进制转BCD设计(附代码)

    FPGA学习altera 系列 第二十三篇 二进制转BCD

    FPGA学习altera 系列 第二十四篇 BCD转二进制

     

    大四加三算法 二进制(8’hFF)转换为BCD(12’h255)

     

     

     

    END

     

    后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

    大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

     

     

    往期推荐

    展开全文
  • 写在前面的话 在前面小节的学习中,我们已经...在数学中,我们都知道随便一个十进制数如5468 ,那么它的计算过程可以转换为:5468= 5*1000+4*100+6*10+8,因此BCD二进制数的算法就是: abcd = a*1000 + b*...

    写在前面的话

    在前面小节的学习中,我们已经掌握了将二进制数转换成BCD码的方法。那么现在我们就反过来思考一下,设计一个什么样的电路,才可以将BCD码转换成二进制数呢?

    基本概念

    在数学中,我们都知道随便一个十进制数如5468 ,那么它的计算过程可以转换为:5468= 5*1000+4*100+6*10+8,因此BCD码转成二进制数的算法就是:

    abcd = a*1000 + b*100 + c*10 +d

    这种算法是最常规的一种算法,里面需要用到乘法器以及加法器,这种实现方式比较耗费资源,下面梦翼师兄会介绍一种算法,这种算法需要用到加法和移位来完成BCD转二进制数的功能,从而尽可能的节约逻辑资源。

    移位算法原理

    在介绍这种算法之前,梦翼师兄先来解释一个小小的问题:二进制码左移一位等于未左移的二进制码*2,例如有二进制码101001,转成十进制等于41,左移一位得到1010010,转成十进制等于82。

    也就是说二进制码左移1位加上左移3位可以等效于二进制码乘以10,那么我们是否可以利用移位来代替乘法的运算呢?下面我们就来设计一个电路将输入的3位bcd码转换成二进制码,来实现BCD码转二进制数的功能。

    顶层框图

     

    顶层模块端口介绍

    端口名

    端口说明

    clk

    系统50MHz时钟输入

    rst_n

    系统低电平复位

    bw

    BCD码百位输入

    shiw

    BCD码十位输入

    gew

    BCD码个位输入

    binary

    输出转换后的二进制数

    代码实现

    /****************************************************          

     *   Engineer      :   梦翼师兄

     *   QQ             :   761664056

     *   The module function: BCD码转二进制数模块 *****************************************************/

    01  module bcd_to_bin(

    02              clk,   //系统50Mhz时钟

    03              rst_n, //系统低电平复位

    04              bw,   //输入的BCD码的百位

    05              shiw,  //输入的BCD码的十位

    06              gew,   //输入的BCD码的个位   

    07              binary //输出的二进制数

    08              );

    09                  

    10  input clk;

    11  input rst_n;

    12  input [3:0] bw;  //百位

    13  input [3:0] shiw; //十位

    14  input [3:0] gew;  //个位

    15  

    16  output [9:0] binary; //转换结果

    17  

    18  reg [9:0] bwValue1; //百位BCD码转换寄存器1

    19  reg [9:0] bwValue2; //百位BCD码转换寄存器2

    20  reg [9:0] bwValue3; //百位BCD码转换寄存器3

    21  reg [9:0] shiwValue1; //十位BCD码转换寄存器1

    22  reg [9:0] shiwValue2; //十位BCD码转换寄存器2

    23  reg [9:0] gewValue;    //个位BCD码转换寄存器

    24  

    25  /***********转换操作*******************/

    26  always @(posedge clk or negedge rst_n)

    27  if (!rst_n)

    28      begin //寄存器赋初值

    29          bwValue1 <= 0; 

    30          bwValue2 <= 0;

    31          bwValue3 <= 0; 

    32          shiwValue1 <= 0;

    33          shiwValue2 <= 0;

    34          gewValue <= 0;

    35      end

    36  else

    37      begin

    38      //由我们得出的规律可知:a*100=a*(64+32+4)=a*64+a*32+a*4

    39      //=a000000+a00000+a00,即a左移6位加上左移5位加上a左移2位 

    40          bwValue1 <= bw<<6; 

    41          bwValue2 <= bw<<5; 

    42          bwValue3 <= bw<<2; 

    43      //由我们得出的规律可知:a*10=a*(8+2)=a*8+a*2 =a000+a0,

    44      //即a左移3位加上左移1位               

    45          shiwValue1 <= shiw<<3;

    46          shiwValue2 <= shiw<<1;    

    47          gewValue <= gew; //个位数据不变

    48      end 

    49  //将所有的各个位的转换结果相加就是转换后的二进制数

    50  assign binary = bwValue1 + bwValue2 + bwValue3 + shiwValue1

    51                  + shiwValue2 + gewValue;

    52  

    53  endmodule

    18~23行我们定义了BCD码转换需要用到的寄存器,因为我们从算法原理这一部分中总结的规律是:百位的BCD码转换需要(a*100=a*(64+32+4)=a*64+a*32+a*4=a000000+a00000+a00,即a左移6位加上左移5位加上a左移2位)三部分组成,所以需要三组寄存器,同理十位和个位也分别需要两组和一组寄存器;37~48行测试执行移位操作,50~51行将移位的结果输出。

     测试代码如下:

    /****************************************************          

     *   Engineer      :   梦翼师兄

     *   QQ             :   761664056

     *   The module function: BCD码转二进制数测试模块 *****************************************************/

    01  `timescale 1ns/1ps

    02

    03  module bcd_to_bin_tb;

    04

    05      reg clk;

    06      reg rst_n;

    07      reg [3:0] bw;   //百位

    08      reg [3:0] shiw; //十位

    09      reg [3:0] gew;  //个位

    10      

    11      wire [9:0] binary;

    12      

    13      initial begin

    14          clk = 0;

    15          rst_n = 0;

    16         bw = 4'd0; shiw = 4'd0; gew = 4'd0;

    17          #1000 rst_n = 1;

    18          

    19          #100 bw = 4'd1; shiw = 4'd2; gew = 4'd0; //120

    20          #100 bw = 4'd3; shiw = 4'd2; gew = 4'd9; //329

    21          #100 bw = 4'd7; shiw = 4'd0; gew = 4'd3; //703

    22          #100 bw = 4'd0; shiw = 4'd2; gew = 4'd7; //027

    23          #100 bw = 4'd2; shiw = 4'd9; gew = 4'd0; //290

    24          

    25      end

    26      

    27      always #10 clk = ~clk;

    28      

    29       bcd_to_bin bcd_to_bin(

    30        .clk(clk),         //系统50Mhz时钟

    31        .rst_n(rst_n),   //系统低电平复位

    32        .bw(bw),         //输入的BCD码的百位

    33        .shiw(shiw),     //输入的BCD码的十位

    34        .gew(gew),       //输入的BCD码的个位   

    35        .binary(binary)  //输出的二进制数

    36       );

    37      

    38  endmodule

    我们在测试代码中写入了5组BCD码来检测输出是否正确

    仿真分析

     

     从仿真图可以看出,分别输入5组BCD码:120、329、703、27、290,观察输出可知转换之后的二进制数是正确的,成功的把BCD码转换成了二进制码。所以本次设计是成功的。

     

    转载于:https://www.cnblogs.com/mengyi1989/p/11521080.html

    展开全文
  • 寄存器编号,移位流程和执行速度应使用5个样本进行测试SHIFT AND ADD 3算法步骤:1将二进制数左移一位STEP:2如果取了8位,则BCD数为数百,和单位列STEP:3,如果任何BCD列中的二进制值是5或更大,则在该BCD列...
  • BCD码与二进制的转换

    千次阅读 2020-03-29 19:53:55
    百位|位|个位|二进制高4位|二进制低4位 二进制BCD算法 从低到高依次判断个位、位、百位这三列的数是否大于等于5,如果是则加3修正 左移整个数据结构1位 重复1和2步8次(重复次数取决于需要表示的数字的...

    利用的数据结构:每列4bits
    百位|十位|个位|二进制高4位|二进制低4位

    二进制→BCD码

    算法

    1. 从低到高依次判断个位、十位、百位这三列的数是否大于等于5,如果是则加3修正
    2. 左移整个数据结构1位
    3. 重复1和2步8次(重复次数取决于需要表示的数字的二进制形式最大位数,此处为8)
    4. 结束循环,则百位十位个位就是对应的BCD码

    原理

    4位二进制,大于等于16进位;4位BCD,大于等于10进位。两个相差了6。
    要处理的话,判断是否大于等于10,是的话说明BCD要进位,加6使得二进制进位,这样是先移位后判断修正。
    可以改一下,等价地,先判断是否大于等于5,如果是则说明在左移后会大于等于10需要进位,那么就加3,这样移位后相当于加了6,是先判断修正后移位。这样做实际上是预先判断下次移位后的情况了,所以在最后一次移位之后不会出现需要修正的情况。

    BCD码→二进制

    算法

    1. 右移整个数据结构1位
    2. 从低到高依次判断个位、十位、百位这三列的数是否大于等于8,如果是则减3修正(顺序其实不重要,因为减3不会对当前列以外的列产生任何影响)
    3. 重复1和2步8次(重复次数取决于需要表示的数字的二进制形式最大位数,此处为8)
    4. 结束循环,则数据结构的最后8位就是对应的二进制码

    原理

    实际上就是上面二进制转换为BCD码的逆过程。
    一开始不会有大于等于16的情况(因为是BCD码,每4位最大为9),所以不用先判断,可以直接先右移第一次。
    判断是否大于等于8,即这一列4位的最高一位是否是1,如果是则说明刚刚右移之前这一列的高一列4位的最后一位为1,即在BCD意义下有进位(大于等于10),但现在是二进制,这个1表示了16而不是10,所以减3修正,相当于在右移之前减了6。由于每次位移后都需要判断,所以循环里面是把右移放在前面,判断放在后面(注意这里如果顺序反了会出错,在类似1028,1029这样个位大于等于8的数据上),先移位再判断,判断的是刚刚那次位移前的情况,和上面二进制转换为BCD相反。

    lab2是要写这两个module,以及一个testbench,给了其中的2个,只需要写bcd2bin就可以,仿照着给的就可以写。写完要编译、模拟、观察波形。要安装iverilog和gtkwave(并不大)。
    将cmd的工作路径移动到iverilog的文件夹:cd /D D:\iverilog,最好无空格无中文
    编译:iverilog -o XXX.vvp bcd2bin.v bin2bcd.v testbench.v
    编译完产生这个vvp文件,XXX.vvp是输出到的文件,里面是二进制指令(大概?
    模拟:vvp XXX.vvp
    模拟会用testbench测试,输出输出一堆东西,相当于测试代码,正确的话输入的二进制与用了bcd2bin和bin2bcd两个module之后得到的二进制一样;模拟完产生.vcd文件
    观察波形:gtkwave XXXX.vcd(这个文件名在testbench里面自己设定,$dumpfile啥的)会打开gtkwave,就可以看一下了

    展开全文
  • 十进制BCD码转换的算法

    万次阅读 多人点赞 2018-08-06 13:13:47
    BCD是指用二进制来表示十进制数的编码,即用4位二进制来表示一位十进制数,因此4位二进制数表示最大的十进制数9(1001),只取十六个数中的十个数。 比如: BCD码:0x99(153),该BCD码转换成十进制是99. 算法...
  • 在项目设计中,经常需要显示一些数值,比如温湿度,时间等等。在数字电路中数据都是用二进制的形式存储,要想显示就需要进行...但是这样未免会耗费太多资源,使用移位加3算法就可以实现二进制BCD码之间的转换。 ...
  • 二进制转BCD

    万次阅读 2015-05-15 22:33:25
    但是,在FPGA里面用求商和求余将会非常消耗资源,这样就必须用到二进制转BCD码了,这里介绍一种简单的加3移位算法。 注:B代表二进制,D代表十进制,0x代表十六进制,BCDBCD码,下同。 1、加3移位法 以二进制数...
  • 移位大4加3转换法。 可以理解为到10,进位法...3.20位二进制序列(999999)24位BCD码程序 module toBCD( input wire rst, input wire [19:0] idata, output wire [23:0] six_bcd ); reg [43:0] workdata; in.
  • 学习中经常要用到将十进制数据转换为BCD码,算法比较简单,简单说明一下。 **BCD码:**4位二进制数来表示一位十进制数的编码,例如十进制数279,转换为BCD码就是’h177。 算法实现流程:二进制数据每次左移一位,每...
  • 学过C语言的都知道,如果对于一个十进制的数字123,要想将其每一位分别提取出来,显示在数码管这样的设备上,一般需要使用如下的算法来实现 bai = 123 / 100; shi = 123%100/10; ge = 123%10。 这个算法在C语言...
  • 汇编把一个16位无符号二进制数转换成为用8421BCD码表示的5位十进制数。转换算法可以是:用二进制数除以10000,商为“万位”,再用余数除以1000,得到“千位”;依次用余数除以100、10和1,得到“百位”、“十位”和...
  • 我们将给定的一字节二进制数,转换成二十进制(BCD)码。将累加器A的值拆为三个BCD码,并存入RESULT开始的三个单元,例程A赋值#123。三、实验内容及步骤1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿...
  • 51单片机(汇编语言)实现十进制转十六进制任务描述任务原理方案Ⅰ思路代码运行结果算法补充循环四位移位带进位的乘法2bytes + 1byte方案Ⅱ 任务描述 DEC0 DEC1 DEC2 存放"十进制"数 eg:03 35 96 HEX0 HEX1存放十六...
  • 二进制转格雷码 格雷码转二进制 十进制转二进制 二进制转十进制等,在Delphi xe2下通过测试。格雷码(英文:Gray Code, Grey Code,又称作葛莱码,二进制循环码)是1880年由法国工程师Jean-Maurice-Emlle Baudot发明...
  • BCD 译码的实现_移位加3 算法 BCD 译码是指将二进制数转换成BCD 格式如当cnt_s 值为10 时也就 是8b00001010 转换成个位值为4b0000 位值为4b0001 这个转换过程就 是BCD 译码 此处介绍二进制转BCD 码的硬件实现采用...
  • BCD码转换

    2020-11-05 17:47:37
    二进制转BCD的方法是通过左移,然后每四位判断是否大于4,满足则加3。 这里我们采用一种移位加3的算法来实现这个二进制到BCD转换的功能。(当然如果数据范围比较小的情况下,比如几百个数字,我还是推荐在FPGA中使用...
  • BCD码(BinaryCodedDecimal‎)是用4位二进制数来表示1位十进制数中的0~9的编码方法。其中,最常使用到的是8421BCD码。8421码是一种有权码,其各位的权分别是(从最有效高位开始到最低有效位)8,4,2,1。比如,BCD码0x...
  • 本案例节选明德扬广州FPGA培训班。 ...BCD译码是指将二进制数,转换成BCD格式...此处介绍二进制转BCD码的硬件实现,采用左移加3的算法,具体描述如下:(此处以8-bit 二进制码为例)   1、左移要转换的二进
  • JZGKCHINA工控技术分享平台往期回顾●HORNER控制器的J1939通信●HORNER控制器和GE PLC的EGD协议通信BCD码(BinaryCodedDecimal‎)是用4位二进制数来表示1位十进制数中的0~9的编码方法。其中,最常使用到的是8421BCD码...
  • bin28_BCD32.rar

    2020-02-20 14:51:41
    在FPGA中我们一般使用二进制转BCD算法,将二进制数据转换为BCD码,然后就可以直接将BCD码送给数码管显示了,附件为代码和测试工程,包括仿真脚本,大家先自行学习,又不懂的可以直接在本帖下提问。
  • 其实加密算法有很多种,前边我讲到过BASE 64、32、16、BCD,说到底都是要跟机器码进行打交道,即二进制码,无论用什么样的加密算法,都要将数据变成二进制数据后再处理,去再回来,这个模二加算法其实很简单...
  • 转换程序实际应用中经常遇到数制和码制的转换问题,如十进制数(BCD码)与二进制数、ASCII码与二进制数之间的相互转换等。例:将内部RAM 30H中1字节压缩BCD表示的十进制数转换为二进制数,并存入内部RAM的20H中。1)...
  • 接收模块接收到的高度数据采用二进制(BIN)码表示,而数码管等显示设备需要BCD码(即二进制编码的十进制码),所以二者之间的转换非常必要。  BCD码与BIN码的相互转换比较传统的方法是采用DAA调节指令来实现,需要逐...
  • 接收模块接收到的高度数据采用二进制(BIN)码表示,而数码管等显示设备需要BCD码(即二进制编码的十进制码),所以二者之间的转换非常必要。  BCD码与BIN码的相互转换比较传统的方法是采用DAA调节指令来实现,需要逐...
  • 4.1 二进制十进制和十六进制 4.2 C 语言变量类型和范围 4.3 C 语言基本运算符 4.4 for 循环语句 4.5 while 循环语句 4.6 函数的简单介绍 4.7 Keil 软件延时 4.8 流水灯程序 4.9 练习题 第5章 定时器与...
  • 具有处理多种数据类型的能力,可以对8位/16位数,带符号数和不带符号数,压缩的和非压缩的BCD十进制数进行处理;还提供了字符串操作指令;为支持构成多处理器系统,还专门提供了一组指令(WAIT、ESC)。 通过本章...
  • 会计理论考试题

    2012-03-07 21:04:40
    A、模拟信息 B、模拟信息或数字信息 C、数字形式D、二进制形式的数字 6.在Windows98中,要恢复回收站中的文件,只要___B____。 A、双击该文件 B、用鼠标把该文件施出回收站 C、单击该文件 D、A、B、C均可 7.在...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

bcd算法二进制转十进制