1.BCD码

  • 数码管动态显示的data[19:0]使用二进制数表示的多位十进制数,不能直接生成段选和片选信号,需要使用BCD码表示的十进制数
  • BCD码(Binary-Coded Decimal),又称为二-十进制码,使用四位二进制数来表示1位十进制数中的0-9这十个数,是一种二进制的数字编码形式,用二进制编码的十进制代码
  • 分类:有权码和无权码,这里的权字表示权值,有权码四位二进制数中的
  • 有权码:8421码,5421码,2421码
  • 无权码:余三码,余三循环码,格雷码

  • 使用多位数码管表示234,二进制表示就是1110_1010,使用8421码表示0010_0011_0100
  • 使用多位数码管显示234,需要使用动态扫描的方式,要依次显示个位,十位,百位,要求能从传入的数据中得到个位,十位,百位,所以使用BCD码可以直接得到位选信号和段选信号

1.1 二进制数转换为BCD码

  • 实现转换的第一步,就是在输入的二进制码之前补多少个0,补(十进制数位数*4)个0
  • 234 -- 前面补12个0,然后看BCD码每一位,如果小于等于4,就保持不变,进行移位操作(左移);如果大于4,就将补的BCD码进行加3
  • 直到二进制数为0,补充的BCD码位就是对应的二进制数的BCD码,十进制数-->二进制数-->BCD码
  • 移位次数:输入多少位二进制数,就会移位多少次

2.BCD码转换模块

2.1 模块框图

添加BCD码转换模块

  • 输入时钟和复位信号
  • 输入十进制数的二进制编码
  • 输出六路BCD码4bit,输出的6路BCD码分别用个位,十位,百位,千位,万位,十万位表示



    系统框图需要进行修改

2.2 波形图

  • 二进制码向BCD码的转换是通过判断运算加移位操作实现的,移位次数是与二进制数的位数相关的,需要移位计数器对于判断运算和移位次数进行计数,移位次数是20次,所以位宽为5bit
  • 需要一个中间变量存储中间的数据,data_shift[43:0],(二进制数位数+BCD码位数)
  • 判断运算在前,移位操作在后,需要一个标志信号区分这两个操作(shift_flag),但是这两个操作是在一个时钟周期内完成的,每次移位操作都是在判断计算之后进行的

2.3 RTL

module bcd_8421(
input wire sys_clk,
input wire sys_rst_n,
input wire [19:0] data, output reg [3:0] unit ,
output reg [3:0] ten ,
output reg [3:0] hun ,
output reg [3:0] thou ,
output reg [3:0] t_thou ,
output reg [3:0] h_hun , ); reg [4:0] cnt_shift;
reg [43:0] data_shift;
reg shift_flag; always@(posedge sys_clk or negedge sys_rst_n)
if(sys_clk == 1'b1)
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;
else
cnt_shift <= cnt_shift; always@(posedge sys_clk or negedge sys_rst_n)
if(sys_clk == 1'b1)
data_shift <= 44'b0;
else if(cnt_shift == 5'd0)
data_shift <= {24'b0,data};
else if((shift_flag == 1'b0) && (cnt_shift <= 20))
begin
data_shift[23:20] <= (data_shift[23:20] > 4) ? (data_shift[23:20] + 2'd3) : data_shift[23:20];
data_shift[27:24] <= (data_shift[27:24] > 4) ? (data_shift[27:24] + 2'd3) : data_shift[27:24];
data_shift[31:28] <= (data_shift[31:28] > 4) ? (data_shift[31:28] + 2'd3) : data_shift[31:28];
data_shift[35:32] <= (data_shift[35:32] > 4) ? (data_shift[35:32] + 2'd3) : data_shift[35:32];
data_shift[39:36] <= (data_shift[39:36] > 4) ? (data_shift[39:36] + 2'd3) : data_shift[39:36];
data_shift[43:40] <= (data_shift[43:40] > 4) ? (data_shift[43:40] + 2'd3) : data_shift[43:40];
end
else if((shift_flag == 1'b1)&&(cnt_shift <= 20))
data_shift <= data_shift << 1;
else
data_shift <= data_shift; always@(posedge sys_clk or negedge sys_rst_n)
if(sys_clk == 1'b1)
shift_flag <= 1'b0;
else
shift_flag <= ~shift_flag; // 输出信号
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_clk == 1'b1)
begin
unit <= 4'b0;
ten <= 4'b0;
hun <= 4'b0;
thou <= 4'b0;
t_thou <= 4'b0;
h_hun <= 4'b0;
end
else if(data_shift == 5'd21)
begin
unit <= data_shift[23:20];
ten <= data_shift[27:24];
hun <= data_shift[31:28];
thou <= data_shift[35:32];
t_thou <= data_shift[39:36];
h_hun <= data_shift[43:40];
end endmodule

2.4 Testbench


`timescale 1ns/1ns
module tb_bcd_8421();
reg sys_clk ;
reg sys_rst_n ;
reg [19:0] data ; wire [3:0] unit ;
wire [3:0] ten ;
wire [3:0] hun ;
wire [3:0] thou ;
wire [3:0] t_thou ;
wire [3:0] h_hun ; initial begin
sys_clk = 1'b1;
sys_rst_n <= 1'b0;
data <= 20'd0;
#30
sys_rst_n <= 1'b1;
data <= 20'd123_456;
#3000;
data <= 20'd654_321;
#3000;
data <= 20'd987_654;
#2000;
data <= 20'd999_999;
end always #10 sys_clk = ~sys_clk; bcd_8421 bcd_8421_inst(
.sys_clk (sys_clk ) ,
.sys_rst_n (sys_rst_n ) ,
.data (data ) ,
.unit (unit ) ,
.ten (ten ) ,
.hun (hun ) ,
.thou (thou ) ,
.t_thou (t_thou ) ,
.h_hun (h_hun ) , ); endmodule

2.5 仿真

23- 数码管动态显示02-转换BCD码的更多相关文章

  1. Delphi中对BCD码的直接支持 (转)

    最近在Delphi下写软件,需要将数据转换为BCD码和将BCD码转换为其它数据类型,从网上搜索了一下,没有发现好的函数,于是就想自定义函数来完成BCD与其它格式的数据转换功能.但最终没有动手写,先查查 ...

  2. FPGA中将十进制数在数码管中显示(verilog版)--二进制转换为BCD码

    这周有朋友问怎样在fpga中用数码管来显示一个十进制数,比如1000.每个数码管上显示一位十进制数.如果用高级语言来分离各位,只需要分别对该数做1000,100,10对应的取商和取余即可分离出千百十个 ...

  3. Linux时间戳转换成BCD码(转载)

    #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> / ...

  4. C#下16进制和BCD码转换代码

        private static Byte[] ConvertFrom(string strTemp) { try { if (Convert.ToBoolean(strTemp.Length & ...

  5. 二进制 转换成十进制 BCD码(加3移位法)

    "原来的二进制数十几位,则左移时就要左移几位" "二进制数调整BCD码的方法是将二进制码左移8次,每次移位后都检查低四位LSD+3是否大于7,如是则加3,否则不加,高4位 ...

  6. 一种BCD码转换的算法

    #include "stdio.h" typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef ...

  7. C语言之linux内核--BCD码转二进制与二进制转BCD码(笔试经典)

    在分析代码之前,我们先来了解一下,BCD码和二进制到底区别在哪? 学习过计算机原理的和数字电子技术这两门课的都会知道这两个到底是什么含义,也有的同学学过了,考过了,过了一段时间又忘记了,今天,我们通过 ...

  8. 基于Verilog HDL的二进制转BCD码实现

    在项目设计中,经常需要显示一些数值,比如温湿度,时间等等.在数字电路中数据都是用二进制的形式存储,要想显示就需要进行转换,对于一个两位的数值,对10取除可以得到其十位的数值,对10取余可以得到个位的数 ...

  9. BCD码

    BCD码(Binary-Coded Decimal‎)亦称二进码十进数或二-十进制代码,是用4位二进制数来表示1位十进制数中的0~9这10个数码,用一种使用二进制编码十进制的数字编码形式.BCD码这种 ...

  10. BCD码、十六进制与十进制互转

    在做嵌入式软件的设计中,常常会遇到十六进制.BCD码与十进制之间的转换,近期做M1卡的应用中,涉及了大量的十六进制.BCD码与十进制之间的转换.通过对BCD码.十六进制 权的理解,轻松的实现了他们之间 ...

随机推荐

  1. Centos 利用本地镜像安装yum源

    前提 在"设置"中确保两点 1.勾选"已连接" 2.添加上本地的"centos.iso"镜像文件 切换到用户目录 cd / 新建一个iso目 ...

  2. Ynoi

    P4688 [Ynoi2016] 掉进兔子洞 序列,静态,求三个区间的可重集的交的大小,离线,\(n,Q\le 10^5\),3s,500MB 缺乏性质 \(\rightarrow\) bitset ...

  3. 21、Scaffold属性 FloatingActionButton实现类似闲鱼App底 部导航凸起按钮

    FloatingActionButton详解 FloatingActionButton简称FAB ,可以实现浮动按钮,也可以实现类似闲鱼app的底部凸起导航   实现类似闲鱼App底部导航凸起按钮 c ...

  4. webrtc实时视频语音实现

    webrtc介绍 WebRTC实现了基于网页的视频会议,标准是WHATWG 协议,目的是通过浏览器提供简单的javascript就可以达到实时通讯(Real-Time Communications ( ...

  5. 详解ZooKeeper在微服务注册中心的应用

    本文分享自华为云社区<SpringCloud ZooKeeper 详解,以及与Go.Rust等非Java服务的集成>,作者: 张俭. ZooKeeper,是一个开源的分布式协调服务,不仅支 ...

  6. 代码也能“杀”虫:此虫,真虫非Bug也

    摘要:看这群大学生如何保护粮食,让害虫.霉变无处遁形. 国以民为本,民以食为天,对有着14亿人口的中国来说,粮食安全,一直都是关系国计民生的头等大事. 2010年以来,我国人均粮食占有量持续高于世界平 ...

  7. 一文带你从零认识什么是XLA

    摘要:简要介绍XLA的工作原理以及它在 Pytorch下的使用. 本文分享自华为云社区<XLA优化原理简介>,作者: 拓荒者01. 初识XLA XLA的全称是Accelerated Lin ...

  8. SEAL 0.3 正式发布:国内首个全链路软件供应链安全管理平台

    12月1日,软件供应链安全管理平台 SEAL 0.3 正式发布(以下简称"SEAL"),这是国内首个以全链路视角保护软件供应链的安全管理平台.两个月前 SEAL 0.2 发布,该版 ...

  9. QA团队基于DataLeap开放平台能力的数据测试实践

    背景 &痛点 随着生态体系扩展和业务发展,数据在业务中承担的决策场景越来越多样化,一部分数据已应用在资损.高客诉等高风险场景,因此对数据质量的要求,尤其是高风险场景的质量要求非常之高.但在保障 ...

  10. 一文了解 DataLeap 中的 Notebook

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 概述 Notebook 是一种支持 REPL 模式的开发环境.所谓「REPL」,即「读取-求值-输出」循环:输入一 ...