十进制转8421_BCD码

2023-11-06


一、BCD码简介

       BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,常应用于计算机内部十进制与二进制之间的转换。

      BCD码可分为有权码无权码两类。其中,常见的有权BCD码有8421码、2421码、5421码;无权BCD码有余3码、余3循环码、格雷码。8421码,顾名思义,自高到低,每个位上的权值分别是8,4,2,1,例如十进制9用8421BCD码表示为1001;2421码和5421码与8421码类似,只是每个位上的权重不同,例如十进制9用2421BCD码表示为1111,十进制9用5421BCD码表示为1100;余3码是在8421码的基础上加3,例如十进制9用余3码表示为1100;余3循环码每个编码中0、1没有确定的权值,相邻码字之间只有一位不同,避免过度码产生的噪声。

     下图给出了常用的BCD码

二、十进制转8421BCD码转换思路

       以十进制数234为例:

       第一步:8'd234对应的二进制8'b1110_1010,由于十进制数234共有三位,每位转换为8421BCD码后对应4个比特位,因此在8'b1110_1010的前边加上3*4=12个0,构成20'b0000_0000_0000_1110_1010

      第二步:将20'b0000_0000_0000_1110_1010向左进行移位,每移一位后,分别判断BCD码最高位、次高位、最低位共三组码字对应的十进制码是否大于4,如果该组码字大于4,则在改组对应十进制码的基础上加3,如果该码字小于等于4,则继续进行下一次移位

     第三步:向左移位8次后,结束移位,此时前12位就是该十进制对应的8421BCD码

三、程序编写

        下图给出该模块的示意图:

 

  输入信号:时钟信号                              sys_clk

                   复位信号                              sys_res

                   输入十进制数                      data

  输出信号:个位                                     unit

                   十位                                     ten

                   百位                                     hun

                   千位                                     tho

                   万位                                     t_tho

                   十万位                                 h_tho

     输入信号是20位的二进制数,对应十进制共6位,所以在20位二进制数的前边补上6*4=24个0,构成44位的二进制数,向左移位20次,即可得出对应的8421BCD码

  下边给出该模块的时序图:

   下边给出Verilog代码:

module bcd_8421(
    input                sys_clk,
    input	         sys_res,
    input          [19:0]data,
    output    reg  [3:0 ]unit,
    output    reg  [3:0 ]ten,
    output    reg  [3:0 ]hun,
    output    reg  [3:0 ]tho,
    output    reg  [3:0 ]t_tho,
    output    reg  [3:0 ]h_tho
);
reg  [4 : 0]cnt_shift;
reg  [43: 0]data_shift;
reg         shift_flag;



always@(posedge sys_clk or negedge sys_res)
    if(!sys_res)
	    shift_flag <= 1'b0;
    else
	    shift_flag <= ~shift_flag;
always@(posedge sys_clk or negedge sys_res)
    if(!sys_res)
	    cnt_shift <= 5'd0;
    else if(cnt_shift == 5'd21&&shift_flag == 1'b1)
	    cnt_shift <= 5'd0;
    else if(shift_flag == 1'b1)
	    cnt_shift <= cnt_shift + 1'b1;

always@(posedge sys_clk or negedge sys_res)
    if(!sys_res)
	    data_shift <= 44'd0;
    else if(cnt_shift == 5'd0)
	    data_shift <= {24'b0,data};
    else if(cnt_shift != 5'd0 && cnt_shift < 5'd21 && shift_flag == 1'b1)
	    data_shift <= data_shift << 1;
    else if(cnt_shift != 5'd0 && cnt_shift < 5'd21 && shift_flag == 1'b0)begin
	     data_shift[43:40] <= data_shift[43:40]>4 ? data_shift[43:40]+ 3: data_shift[43:40];
		 data_shift[39:36] <= data_shift[39:36]>4 ? data_shift[39:36]+ 3: data_shift[39:36];
		 data_shift[35:32] <= data_shift[35:32]>4 ? data_shift[35:32]+ 3: data_shift[35:32];
		 data_shift[31:28] <= data_shift[31:28]>4 ? data_shift[31:28]+ 3: data_shift[31:28];
		 data_shift[27:24] <= data_shift[27:24]>4 ? data_shift[27:24]+ 3: data_shift[27:24];
		 data_shift[23:20] <= data_shift[23:20]>4 ? data_shift[23:20]+ 3: data_shift[23:20];
    end 
	else if(cnt_shift == 5'd21)
         data_shift <= data_shift;	
		
always@(posedge sys_clk or negedge sys_res)
    if(!sys_res)begin
	    unit   <=    4'd0;
	    ten    <=    4'd0;
	    hun    <=    4'd0;
	    tho    <=    4'd0;
	    t_tho  <=    4'd0;
	    h_tho  <=    4'd0;
    end 
    else if(cnt_shift == 5'd21)begin
	    unit   <=   data_shift[23:20];
	    ten    <=   data_shift[27:24];
	    hun    <=   data_shift[31:28];
	    tho    <=   data_shift[35:32];
	    t_tho  <=   data_shift[39:36];
	    h_tho  <=   data_shift[43:40];
    end 	
endmodule

四、仿真验证

   下边给出测试文件的代码:

`timescale 1ns/1ns
module tb_bcd_8421();
reg         clk    ;
reg         res    ;
reg   [19:0]data   ;
wire   [3:0]unit   ;  
wire   [3:0]ten    ; 
wire   [3:0]hun    ; 
wire   [3:0]tho    ; 
wire   [3:0]t_tho  ; 
wire   [3:0]h_tho  ;

initial begin
   clk <= 1'b0;
   res <= 1'b0;
   #200 res <= 1'b1;
end 
always	#10 clk <= ~clk;
//assign data =  20'd987654;
initial  begin
   data <= 20'd987_654;
   #1000 data <= 20'd456_123;
   #2000 data <= 20'd1237_89;
   #500  data <= 20'd147_852;

end 
//两次数据间隔时间需大于840ns

bcd_8421 u_bcd_8421(
    .sys_clk (clk)    ,
    .sys_res (res)    ,
    .data    (data)    ,
    .unit    ( unit )    ,
    .ten     ( ten  )    ,
    .hun     ( hun  )    ,
    .tho     ( tho  )    ,
    .t_tho   ( t_tho)    ,
    .h_tho   ( h_tho)
);

endmodule 

下图是Modelsim中仿真的结果:

      每次转换所需的时间至少需要840ns,上图中输入的十进制数20‘d123789与20‘d147852间隔时间小于840ns,因此,20'd123789没有完成转换。


总结

    初次创作,难免文章中存在错误,希望读者能够及时纠正并给予私信,望大家共同进步!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

十进制转8421_BCD码 的相关文章

随机推荐

  • 【图论】最短路算法:Dijkstra、bellman-ford、spfa、Floyd 和拓扑排序

    是AcWing算法基础课关于基本图论算法的笔记 图片和引用来自给出原链接的 参考 AcWing 永远滴神 图来自这里 Dijkstra的使用条件是 边权非负即可 朴素版Dijkstra AcWing 849 Dijkstra求最短路 I 稠
  • MySQL半同步复制

    MySQL半同步复制 MySQL为了容灾数据一致性服务 有几种复制方式 主从复制方式 异步 半同步 lossless半同步复制方式 异步的复制 默认的复制是异步的 即master commit时不等更新被slave接受就向客户端回话应答成功
  • 二蛋赠书一期:《快捷学习Spring》

    文章目录 前言 活动规则 参与方式 本期赠书 快捷学习Spring 关于本书 作者介绍 内容简介 读者对象 获奖名单 结语 前言 大家好 我是二蛋 一个热爱技术 乐于分享的工程师 在过去的几年里 我一直通过各种渠道与大家分享技术知识和经验
  • 125KHz RFID芯片模块及电路替代方案

    125K RFID芯片模块是否可以写数据 以上是125KHz RFID芯片模块的供应商和芯片名称 频段 容量 功能 协议 18000 2 11784 11785协议 集成 RFID 收发器可对 100 到 150 kHz 频率范围内的转发器
  • 你所不知道的面试陷阱,巧妙避开,面试不再步步惊心

    你觉得自己比面试官更机智吗 如果准备充分 其实是可以的 在面试中 面试官有些时候会出一些陷阱题来考验你 这并不是出于恶意 而是希望对应聘者的能力有更加敏锐的判断 以下是10条最有可能难住你的面试陷阱问题以及化解它们的方法建议和回答样例 壹
  • 阿里员工离职换来一条血泪教训:以为当小白兔很安全,是你对职场最大的误解

    大家好 我是彭于晏 最近跟一些朋友见面 提起阿里辞退员工中 很多是职场小 老 白兔 看似温和 其实是组织中的祸患 这让我想起马云在湖畔大学首堂课上曾分享 小公司的成败在于你聘请什么样的人 大公司的成败在于你开除什么样的人 大公司里有很多老
  • 【C++】5、构建:CMake

    文章目录 一 概述 二 实战 2 1 内部构建 外部构建 2 2 CLion Cmake 一 概述 CMake 是跨平台构建工具 其通过 CMakeLists txt 描述 并生成 native 编译配置文件 在 Linux Unix 平台
  • vc2010使用libcurl静态库遇到连接失败的解决方案

    vc2010使用libcurl静态库 遇到连接失败的解决方案 2010 11 10 15 35 下载libcurl的源码 打开lib文件夹下项目 编译为静态链接库 在编译的时候出现问题如下 注 以前在vc2005下用mfc工程并且libcu
  • char型int型float型double型数组在内存中所占的字节数(16位、32位、64位PC机)

    在C语言中 以16位PC机为例 一个char型数据在内存中所占的字节数为1 一个int型数据在内存中所占的字节数为2 一个float型数据在内存中所占的字节数为4 一个double型数据在内存中所占的字节数为8
  • ThreadPool 线程池

    ThreadPool 线程池 1 例子 MyThreadPoolDemo 2 为什么用线程池 3 线程池如何使用 4 线程池几个重要参数 5 线程池底层工作原理 6 线程池用哪个 生产中如设置合理参数 一 MyThreadPoolDemo
  • Oracle数据库远程连接配置教程

    本人前一段时间做过Oracle数据库的相关工作 但是发现数据库的监听程序和服务名比较难搞定 而且网上也没有现成的教程 所以经过自己的探索之后将这片文章贡献给大家 如有不当之处还请谅解并请联系本人 此配置是在本机允许访问的前提下进行 如不允许
  • typescripe第二天—返回类型和注解

    函数参数类型和返回类型定义 简单类型定义 如下图 getTotal没有给它定义返回值类型 虽然被推断出了返回值是number类型 但如图所示 有string存在时 并未报错 可以直接给total一个类型注解 但错误的根本是getTotal
  • Android 11 WebView 打开html文件,加载时报错:ERR_ACCESS_DENIED

    问题描述 之前andorid 10上做的需求 移植到android 11上 在项目中 system app HTMLViewer 自定义的加载html的xxxActivity java文件访问 手机系统中的 system etc html
  • 不使用MFC AppWizard向导, 如果没有设置好项目参数, 编译时产生错误及解决办法

    转贴 在创建MFC项目时 不使用MFC AppWizard向导 如果没有设置好项目参数 就会在编译时产生很多连接错误 如error LNK2001错误 典型的错误提示有 libcmtd lib crt0 obj error LNK2001
  • 频分复用和时分复用

    频分复用 FDM Frequency Division Multiplexing 就是将用于传输信道的总带宽划分成若干个子频带 或称子信道 每一个子信道传输1路信号 频分复用要求总频率宽度大于各个子信道频率之和 同时为了保证各子信道中所传输
  • 【深入理解C++】类对象所占用的空间大小

    文章目录 1 须知 2 非静态成员变量 普通成员变量 3 静态成员变量 4 非静态成员函数 普通成员函数 5 静态成员函数 6 构造函数和析构函数 1 须知 类本身是没有大小的 类的大小指的是类的对象所占的大小 如果用 sizeof 运算符
  • 十个不错的 Linux 网络监视工具

    点击上方蓝字 快速关注我们 英文 Linuxandubuntu 编译 LCTT https linux cn article 9153 1 html 保持对我们的网络的管理 防止任何程序过度使用网络 导致整个系统操作变慢 对管理员来说是至关
  • 毕业设计-基于机器学习的新冠肺炎疫情预测精度研究

    目录 前言 课题背景和意义 实现技术思路 一 国内新冠肺炎疫情的统计分析 二 基于机器学习模型的新冠肺炎疫情研究 三 基于深度学习模型的新冠肺炎疫情研究 实现效果图样例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着备考或实习为毕业
  • CentOS 7 搭建CA证书服务器

    一 实验环境 CA 192 168 199 141 Apache 192 168 199 143 二 实验步骤 1 CA证书服务器的配置 1 1 安装openssl工具 默认使安装完成的 root CA yum install y open
  • 十进制转8421_BCD码

    目录 一 BCD码简介 二 十进制转8421BCD码转换思路 三 程序编写 四 仿真验证 总结 一 BCD码简介 BCD码 Binary Coded Decimal 用4位二进制数来表示1位十进制数中的0 9这10个数码 是一种二进制的数字