写在前面的话

在前面小节的学习中,我们已经掌握了将二进制数转换成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

基础项目(10)BCD转二进制程序设计讲解相关推荐

  1. 飞机大战--python基础项目(附源码和原理讲解)

    声明 此项目是对python基础语法和高级语法的结合,学完python基础和高级可以拿此项目练手,说的比较细,涵盖了pygame一些知识点的讲解. 项目展示 安装准备 这里我们要用到pygame模块, ...

  2. python在线投票系统讲解_Python开发基础-项目实训-在线投票系统ppt课件

    <Python开发基础-项目实训-在线投票系统ppt课件>由会员分享,可在线阅读,更多相关<Python开发基础-项目实训-在线投票系统ppt课件(27页珍藏版)>请在人人文库 ...

  3. IOS开发基础之UI的喜马拉雅的项目-10

    IOS开发基础之UI的喜马拉雅的项目-10 // // ViewController.m // 10-喜马拉雅 // // Created by 鲁军 on 2021/2/2. //#import & ...

  4. 视频教程-PHP基础项目实战/过程化开发-PHP

    PHP基础项目实战/过程化开发 云知梦创始人,国际架构师,11年互联网培训和开发经验,曾在港电讯盈科.北大青鸟集团.远大教育.北京易第优教育等公司任职曾获得美国红帽RHCA构架师和RHCDS数据中心讲 ...

  5. Java基础项目——客户信息管理软件

    目录 前言 本项目目标 一.需求及软件设计结构说明 1.需求说明 1)主菜单 2)添加客户 3)修改客户 4)删除客户 5)客户列表 2.软件设计结构 1)Customer类的设计 2)Custome ...

  6. 网络基础项目——全网互通实验

    作者简介:一名云计算网络运维人员.每天分享网络与运维的技术与干货.   座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 前言 本章将会讲解网络基础项目--全网互通实验. 一.实验项目图 ...

  7. Python自动化开发基础 项目实战-监控系统 Day16-李杰-专题视频课程

    Python自动化开发基础 项目实战-监控系统 Day16-14487人已学习 课程介绍         课程特色:实战,细致,生动,深入浅出 适用人群:适合Python初学者 课程详情:从0基础开始 ...

  8. java字体颜色编程_java Applet 程序设计讲解2 字体,颜色的使用

    java Applet 程序设计讲解2 字体,颜色的使用 关键词: 字体    颜色 图形界面输出用到的字体,颜色的使用 1.字体类 (Font类) 构造方法: Font(String fontnam ...

  9. 计算机基础- -计算机为什么要使用二进制

    计算机基础- -计算机为什么要使用二进制 文章目录 计算机基础- -计算机为什么要使用二进制 一.为什么用二进制表示 二.什么是二进制数 三.移位运算和乘除的关系 四.便于计算机处理的补数 五.算数右 ...

最新文章

  1. Python教程:函数对象与函数嵌套
  2. Navicat mysql 加索引_mysql 索引 (Navicat添加索引)
  3. innobackupex 数据库备份
  4. java之七 高级类设计
  5. 云服务器 怎样修改地域,云服务器 怎样修改地域
  6. .net framework摘抄与理解
  7. Coarse-Grained lock 粗粒度锁
  8. 浅谈打印机驱动安装的常见方法及安全防护
  9. 在html中加入中文字体,css设置中文字体
  10. 小米平板刷机shell怎么退_黑龙江省宁安市小米平板1的刷机经历刷入DotOS并退回MIUI-最懂产品的运维...
  11. PIXI+GSAP 防刹车动效
  12. 好书推荐《月亮与六便士》
  13. 赖美云的认证照_火箭少女最新路透照出炉:吴宣仪赖美云魅力十足,张紫宁傅菁凭颜值圈粉...
  14. 利用135端口快速入侵个人PC电脑
  15. RD Client远程控制PC
  16. Windows上架设Turn服务器
  17. Matlab--创建函数(function)
  18. eNSP之简单WLAN拓扑配置
  19. 少儿编程软件python_Python编程软件下载
  20. 【交通领域张同学】-基础selenium企查查企业信用码抓取

热门文章

  1. 高频交流信号采样电路设计
  2. 飞客茶馆-常旅客互助社区 - 飞客茶馆旅行网
  3. Q1 不同企业的竞争优势(待完成)
  4. 中国各省人力资本测算就业人员受教育程度构成(2000-2021年)
  5. centost查看网络信息_监控io性能、free命令、ps命令、查看网络状态、Linux下抓包...
  6. iOS 自动续期订阅 恢复购买
  7. 用Java写一个解一元二次方程的程序
  8. win10运行快捷键_阿销带你看世界——电脑技巧之电脑快捷键(WIN篇2)
  9. Pycharm 找不到对应字体
  10. 2020焊工(技师)考试及焊工(技师)模拟考试系统