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. 数字孪生和GIS结合将会为智慧园区带来怎样的改变?

    数字孪生和地理信息系统(GIS)是当今智慧园区发展中的两个重要技术,它们的结合将为智慧园区带来根本性的改变和巨大的发展机遇.这种结合将深刻影响园区的规划.建设.运营和管理,为人们创造更智能.高效.可持 ...

  2. 使用dtd定义元素

  3. Python——第二章:字符串操作——总结

    总结: f"{变量}"  格式化字符串最优方法 索引.切片.步长: 索引:从0开始计算的.[5] 切片:s[start: end: step],end位置的数据永远拿不到,左闭又开 ...

  4. DVWA Cross Site Scripting (XSS) 跨站脚本攻击

    文章目录 DVWA_XSS(Stored) 存储性XSS 1.Low 2.Medium 3.High 4.Impossible XSS平台 DVWA_XSS(Stored) 存储性XSS 一句话概括: ...

  5. STM32CubeMX教程10 RTC 实时时钟 - 周期唤醒、闹钟A/B事件和备份寄存器

    本实验主要使用STM32CubeMX软件配置STM32F407开发板实现RTC周期唤醒.闹钟A/B事件功能,周期唤醒中输出RTC时间,闹钟A/B事件发生时利用串口输出闹钟A/B事件发生提示 1.准备材 ...

  6. IO流小结图片

  7. 启动多个redis进程

    启动时指定端口 启动时指定端口可在一台服务器启动多个redis进程 cd /opt/work/redis/bin./redis-server ../conf/redis.conf --port 638 ...

  8. 使用鼠标在图片上拖拽矩形框vue

    <template> <div> <img class="no-drag" src="https://dashanbook.oss-cn-s ...

  9. JavaScript异步编程1——Promise的初步使用

    目录 1. 概述 2. 详论 3. 参考 1. 概述 Promise对象是ES6提出的的异步编程的规范.说到异步编程,就不得不说说同步和异步这两个概念. 从字面意思理解同步编程的话,似乎指的是两个任务 ...

  10. 知识+AI融合创新探索,华为云论文被AI顶级学术期刊IEEE TPAMI接受

    摘要:通过利用物体类别之间存在的层级关系约束,自动学习从数据中抽取识别不同类别的规则,一方面对模型的预测过程进行解释,另一方面也提供了一条引入人工先验知识的可行途径. 前言 受益于深度学习技术的突破, ...