精华内容
下载资源
问答
  • 二进制数转换成BCD码的Verilog实现

    千次阅读 2020-07-15 16:30:19
    二进制数转换成BCD编码的Verilog实现 通常在显示温度、数码管、电压等数据时,通常需要将二进制数据转成十进制进行显示。最常用的方法是将二进制码转换成BCD码(8421)。 8421码:它只选用了四位二进制码中前10组...

    二进制数转换成BCD编码的Verilog实现
    通常在显示温度、数码管、电压等数据时,通常需要将二进制数据转成十进制进行显示。最常用的方法是将二进制码转换成BCD码(8421)。 8421码:它只选用了四位二进制码中前10组代码,即用0000~1001(0-9)分别代表它所对应的十进制数,余下的六组代码不用。 二进制转BCD 用除法或者取余对于计算机来说耗时耗力占用资源多。
    其余方法有移位后加6或加3再移位,二进制转成BCD码,就是每一位用4位二进制表示即可。 4位二进制最高表示15,BCD码4位最高表示9那么如果4位二进制大于9了就进一(加6),本人前面一篇BCD加法器用这种方法。加3移位占用资源相对少些 , 先判断是否大于4 ,如果是加三再移位产生向高位的进位,例如此时为5(0101),如果移位就是10超出BCD范围,产生进位就要加6,但现在先加3(011)等于8(1000)再移位相当于乘二等于16产生进位。
    步骤:

    1. 如果某一权位(百位,十位,个位)大于4,那么此权位加3。
    2. 将二进制数左移1位。
    3. 如果二进制数据位都移动完毕,计算结束
    4. 返回步骤1
      下图借用他人文章图片该文也是同类型文章但本篇是基于自己查看其他文章后根据自己的理解编写代码并实现
      在这里插入图片描述代码:

    module b_bcd(
    input clk ,
    input rst ,
    input [7:0] din , //输入要转换的数据
    output reg [3:0] unit_out , //个位输出
    output reg [3:0] tens_out ,//十位输出
    output reg [3:0] hund_out ,//百位输出
    output reg done //转换完成标志
    );
    reg [3:0] unit = 4’d0;
    reg [3:0] tens = 4’d0;
    reg [3:0] hund = 4’d0;
    reg [7:0] cnt;
    reg [7:0] d;

    always @(posedge clk)   //个十百位之间移位
    begin
    	if(rst|done) begin
    		  unit_out	<=	4'd0;
    	    tens_out	<=	4'd0;
    	    hund_out	<=	4'd0;
    	end
    	else begin
    		  unit_out	<=	{unit[2:0],d[7]};
    	    tens_out	<=	{tens[2:0],unit[3]};
    	    hund_out	<=	{hund[2:0],tens[3]};
    	end
    end
    
    always@(posedge clk)   //二进制数据移位,同时根据计数产生完成标志
    	begin
    	if(rst|done)
    		begin
    		d<=din;
    		done<=1'd0;
    		end
    	else if(cnt==7)
    		begin
    	    done<=1'd1;
    	    d<=8'd0;
    	    end
    	else
    		d<={d[6:0],1'b0};		
    	end
    

    always @(*) //判断是否大于4,此处用组合逻辑表示前面个十百移位后立即判断
    begin
    if(rst) begin
    unit = 4’d0 ;
    tens = 4’d0 ;
    hund = 4’d0 ;
    end
    else begin
    unit = (unit_out > 4’d4) ? unit_out + 4’d3 : unit_out;
    tens = (tens_out > 4’d4) ? tens_out + 4’d3 : tens_out;
    hund = (hund_out > 4’d4) ? hund_out + 4’d3 : hund_out;
    end
    end

    always @(posedge clk)   //计数用于判断输入移位完成
    begin
    	if(rst|done)
    		cnt <= 8'd0;
    	else if(cnt == 8'd7)
    		cnt <= 8'd0;
    	else 
    		cnt <= cnt + 1'd1;
    end
    

    endmodule
    在这里插入图片描述仿真结果图
    tb文件:
    `timescale 1ns / 1ns
    module b_bcd_tb;
    wire [3:0] unit_out ;
    wire [3:0] tens_out ;
    wire [3:0] hund_out ;
    reg [7:0] din;
    wire done;
    reg clk,rst;

    b_bcd u0(
    	.clk(clk),	
    	.rst(rst),	
    	.din(din),	
    	.unit_out(unit_out),
    	.tens_out(tens_out),
    	.hund_out(hund_out),
    	.done(done)
    );
    
    initial begin
    	rst = 1'd1;
    	#20 rst = 1'd0;
    end
    
    initial begin
    	clk = 0;
    	forever begin
    		#10 clk = ~clk; 
    	end
    end
    

    initial begin
    din = 8’b1111_1111;
    wait(done);
    din = 8’b0101_1010;
    end
    endmodule
    以上研究设计仅是本人的一些理解实现,如有错误不足之处请指正。

    展开全文
  • Verilog - 二进制数转换成BCD编码

    万次阅读 多人点赞 2015-12-16 12:06:12
    二进制BCD编码都是什么?这里所说的二进制,就是一个变量(整数)的实际值的意思,比如一个整数10,那么我们说他的二进制的值就是10,这个没啥好说的。 主要是BCD编码,在数据的传输中,数据都是以字节(byte)为...

    二进制和BCD编码都是什么?

    这里所说的二进制,就是一个变量(整数)的实际值的意思,比如一个整数10,那么我们说他的二进制的值就是10,这个没啥好说的。
    主要是BCD编码,在数据的传输中,数据都是以字节(byte)为单位进行的传输,一个字节有8个位(bit),那么一个字节能够传递的数值的范围就是0~255(十六进制为0x00~0xFF)。这个时候,比如我们要传递一个值35,那么用十六进制表示就是0x23。一般情况下是没有问题的,但是在某些应用中就存在一定的问题,比如数码管显示上经常需要将数值的每个位都提取出来,还是刚才的值35,在数码管显示的特定应用中就需要将十位3和个位5分别提取,形成一个新的数据0x35,这样用分别独立的数字来表示二进制值的编码方式就是BCD编码。简单来说可以由下图表示:

    这里写图片描述

    Verilog算法

    这里,查看英文原文。
    这里我们采用一种移位加3的算法来实现这个二进制到BCD转换的功能。(当然如果数据范围比较小的情况下,比如几百个数字,我还是推荐在FPGA中使用查找表的方法来进行)

    算法:步骤

    1. 如果某一权位(百位,十位,个位)大于或者等于5,那么此权位加3。
    2. 将二进制数,左移1位到BCD移位寄存器中。
    3. 如果二进制数据位都移动完毕,计算结束
    4. 返回步骤1

    图表表示:
    这里写图片描述

    代码

    这里写图片描述

    展开全文
  • 在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。程序可见:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/6154551f93ba561440341732.html中的...

    在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。

    程序可见:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/6154551f93ba561440341732.html中的HEX2BCD子程序。

    .

    说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。

    但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。

    上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。

    .

    单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。

    为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!) 执行时间仅仅是经典程序的1/4!

    .

    近来,在网上发现了一个链接:http://www.mcu123.com/news/Article/uc/uc8051/200803/4751.html,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。

    这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。

    .

    下面说说做而论道的编程思路。

    ;-----------------------------------------------------------------------

    ;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。

    ;那么可以写成:

    ; n = [b15 ~ b0]

    ;把16位数分解成高8位、低8位来写,也是常见的形式:

    ; n = [b15~b8] * 256 + [b7~b0]

    ;那么,写成下列形式,也就可以理解了:

    ; n = [b15~b12] * 4096 + [b11~b0]

    ;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数;

    ;上式可以变形为:

    ; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]}

    ;用x代表[b15~b12],有:

    ; n =   x * 4000 + {x * (100 - 4) + [b11~b0]}

    ;即:

    ; n =   4*x (千位) + x (百位) + [b11~b0] - 4*x

    ;写到这里,就可以看出一点BCD码变换的意思来了。

    ;

    ;上式中后面的位:[b11~b0] - 4*x,如果小于256,那就太简单了,马上就可以去按照常规转换BCD了。

    ;如果数值较大,就要把[b11~b7]看成128的个数y;在百位中加上y、在十位加上3*y、并在[b6~b0]中减去2*y。

    ;那么就有:

    ; n = 4*x (千位) + x (百位) + [b11~b0] - 4*x

    ; n = 4*x (千位) + (x + y) (百位) + 3*y (十位) + [b6~b0] - 2*y

    ;由此,就可以明确由高9位[b15~b7]变换出来十进制的各个位的数值,可能大于9,到最后整理一下即可。

    ;剩下的低7位[b6~b0],已经是单字节数据,变换成BCD码那就十分简单了。

    ;-----------------------------------------------------------------------

    从最后的表达式中可以看出,高9位变换的计算方法极为简单,只是使用左移、加减等指令即可,基本上不涉及多字节的运算。

    编程的时候,要充分利用单字节、单周期的指令,使程序的长度和执行时间尽量缩短。

    做而论道的编程思路已经给出,程序代码还是过一段时间再公布,给大家留下一个发挥的时间。

    感兴趣的网友可以留言,写出自己编写的程序。

    展开全文
  • 二进制数转换BCD

    2012-04-13 14:29:59
    step1:先将二进制数转换为十进制数; step2:再将每一位表示成BCD码。

    step1:先将二进制数转换为十进制数;

    step2:再将每一位表示成BCD码。

    展开全文
  • 二进制转换成BCD

    2009-08-18 11:16:02
    此代码是将二进制数转换成BCD码,提供32位转换,可自行扩展
  • 、实验内容 1、完成单片机开发相关必备软件的安装 2、学习单片机开发板套件的实验原理图 3、编写、下载及实现第一个单片机程序(点亮一个LED灯) 三、实验原理 单片机开发板原理图;单片机并行输入输出接口 四、...
  • 将R0中的8位二进制数转换成3位BCD码,结果存入外部RAM的1002H~1000H(从高位到低位)单元中。例如:开始时,R0 中的数据是:81H 即 (129)10;程序执行后,外部 RAM: 地址 内容 1002H 01H 1001H 02H 1000H ...
  • data segment array dw 54321 dbcd db 5 dup(?) data ends code segment assume cs:code,ds:data; start: mov ax,data mov ds,ax mov dx,array mov bx,10000;除数 mo...
  • data segment array dw 54321 dbcd db 5 dup(?)data endscode segmentassume cs:code,ds:data; start: mov ax,data mov ds,ax mov dx,array mov bx,10000;除数 ...
  • 使用LABVIEW 生成的子VI 可以有效得将二进制数转换成16进制数的BCD码。 常用于校验和分析上。
  • FPGA进制数BCD转换

    2020-06-28 17:05:08
    二-十进制编码(BCD码)是把十进制的0~9这个十个数用二位二进制数(0000 1001)代表的代码。我们也可以用四位二进制数表示两个BCD码。 module bit4BCD(bcd,bcd0,bcd1); input [3:0] bcd; output reg[3:0] bcd0,...
  • vhdl二进制转十进制BCD码加法

    热门讨论 2011-06-08 19:21:49
    实现8421BCD码加法和二进制与十进制之间的相互转换功能 完成将6位二进制数值转换成2位BCD形式十进制数的功能 完成2位BCD码加法运算
  • “原来的二进制数十几位,则左移时就要左移几位”"二进制数调整BCD码的方法是将二进制码左移8次,每次移位后都检查低四位LSD+3是否大于7,如是则加3,否则不加,高4位MSD作同样处理"一、为什么左移8次原寄存器是存二进制...
  • #include <stdio.h> int main(int argc, char const argv[]) {     int x;     scanf("%d",&x);     x=x/1610+x%16;    ...}
  • verilog快速将二进制成BCD

    千次阅读 2019-01-02 12:02:39
    FPGA的到的数值最后在数码管、LED、LCD显示,最直接的方式是利用求商/求余,但是这种方式非常占用内部资源的,这时候很多时候都会采用将二进制数转换成BCD码,最后再显示。转换成BCD码的方式有很多,这个就要根据...
  • 大家可以看看,这个代码是关于二进制数如何转换成bcd码的一个用vhdl编写的程序,可以参考下思路
  • VHDL语言实现32位二进制数BCD

    千次阅读 2019-06-09 10:51:30
    使用FPGA开发板上的数码管显示...我用除十取余的方法,用VHDL写了32位二进制数BCD码代码。 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; USE IEEE.STD_LOGIC_ARITH.ALL; ENTI...
  • 先记一下二进制数与八进制数之间的对应关系:二进制八进制00000011010201131004101511061117二进制转换成八进制的方法是,取三合一法,即从二进制的小数点为分界点,向左(或向右)每三位取成一位,分好组以后,对照...
  • BCD转换成二进制和ASCII码

    万次阅读 2015-01-17 16:32:10
    BCD转换成二进制和ASCII码;用BCD码表示:十位上的十进制数为 2 == BCD码表示为 0010;个位上的十进制数9 === BCD码表示为 1001;所以总的来说 十进制数 29 用BCD码表示为:0010 1001;转换过程:把BCD码 0010(十...
  • 本资源包含该实验需要编制的第三个程序代码:十六进制数转换为ASCII码。 本资源只含代码,不含实验报告,如果你需要的是实验报告就不要点开了以免浪费你宝贵的分数。本代码的可靠性极高,与网络上其他来源的实验报告...
  • 首先得知道什么是BCD码,可以看下百度,基本定义...BCD码是用4位二进制数(各个位的权重分别为:8421,所以叫8421码)来表示一位十进制数。这里的一位十进制数要特别说明下,一位十进制数只能是 0~9之间的一个数值。...
  • BCD转换成进制

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

    万次阅读 2018-12-02 15:48:52
    最常用的方法是将二进制码转换成BCD码(8421)。  8421码:它只选用了四位二进制码中前10组代码,即用0000~1001分别代表它所对应的十进制数,余下的六组代码不用。  我们将二进制数(1101_0101)转换成十进制数...
  • 我们将给定的一字节二进制数转换成二十进制(BCD)码。将累加器A的值拆为三个BCD码,并存入RESULT开始的三个单元,例程A赋值#123。三、实验内容及步骤1.安装好仿真器,用串行数据通信线连接计算机与仿真器,把仿...
  • c语言 - 二进制BCD解密

    2021-01-07 17:43:16
    但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了! 现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后...
  • BCD是指用二进制来表示十进制数的编码,即用4位二进制来表示一位十进制数,因此4位二进制数表示最大的十进制数9(1001),只取十六个数中的十个数。 比如: $$ BCD码:0x99(153),该BCD转换成十进制是99. $$ 算法...
  • 7-4 BCD进制转换

    2018-02-19 15:23:38
    但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后...

空空如也

空空如也

1 2 3 4 5 ... 12
收藏数 240
精华内容 96
关键字:

二进制数转换成bcd数