2-10 进制码,也称为 BCD 码,它的编码方式则是通过一个 4 位二进制来表示一个 10 进制数,部分十进制对应的 BCD 码如下

十进制数 | BCD 码

13 --> 0001_0011

14 --> 0001_0100

19 --> 0001_1001

20 --> 0010_0000

99 --> 1001_1001

对于任意的三位十进制整数存在以下公式:

(ABC) 10  = A*102 + B*101 + C*100

显然,对于任意一个三位数分离它的百位、十位和个位可以通过整除来实现,verilog 语法同时也支持相乘(*)、相除(/)和取模(%)的运算符,Quartus 综合器发现这些运算符时会通过调用 FPGA 内部的嵌入式乘法器来实现这些运算。由于在数字电路中乘除法和浮点数的实现较为复杂,所以其他的综合器或许并不直接提供支持或者会出现仿真与实际不一致的结果,在 verilog 代码中使用乘除法或者取模会使得代码失去可移植性,这里并不建议使用。

这里介绍一种通用的算法用于分离十进数的各个数位,这种称为 移位加 3 算法 的算法 只使用加减和移位运算,它可以满足代码移植性的要求,移位加三算法的流程如下(这里假设要分离的只有 3 个数位):

  1. 将二进制数左移一位(未满 4 位在前面填 0)
  2. 如果移动了 8 位,那么二进制数就在 百位、十位和个位列,计算结束
  3. 在任何一个 BCD 列中,如果任何一个二进制数 大于或者等于 5,就把这个数 加上 3
  4. 回到步骤 1

下图展示了十六进制数 0x3F 其转化 BCD 码的流程:

根据上图,可以很容易的编写对应的 verilog 代码:

module bin2bcd8
(
input wire [:] binary,
output wire [:] b,
output wire [:] c,
output wire [:] d
); //***********************//
/*
* z 作为存储 BCD 码和 二进制码的寄存器
* 如果输入为 8 位,那么 z 需要的长度为
* 0xFF = 255 ---> 10-0101-0101 +++ ????-????
* 总共 18 位
*/
reg [:] z;
//***********************// always @ (*)
begin
z = 'b0; //置 0
z[:] = binary; //读入低 8 位
repeat () //重复 8 次
begin
if(z[: ]>) //大于 4 就加 3
z[: ] = z[: ] + 'b11;
if(z[:]>)
z[:] = z[:] + 'b11;
z[:] = z[:]; //左移一位
end
end
    assign b = z[:];                     //输出 BCD 码
assign c = z[:];
assign d = z[:] ; endmodule

部分仿真结果如下图:

同理,16 位二进制数的转化流程如下,和上图不同的是移动次数增加了,这次共需要移动 16 次,各位可以试着写出对应的 verilog 代码。

我的 FPGA 学习历程(07)—— BCD 编码:移位加 3 算法的更多相关文章

  1. 我的 FPGA 学习历程(01)—— FPGA 基础知识和 Quartus 的安装

    高级的嵌入式市场主要分为以下三类:ARM.DSP 和 FPGA. 其中 ARM 是行业内的佼佼者,目前几乎所有的安卓智能手机都使用 ARM 授权的 CPU架构:而 DSP(数字信号处理器) 早年就被大 ...

  2. 我的 FPGA 学习历程(12)—— 电子钟项目准备

    初学 FPGA 的时候,我们总是存在很多疑问,比如:xilinx 和 altera 的 FPGA 那种比较好.verilog 语言被如何综合成具体硬件电路.RTL 级电路是什么意思等等.现在我们就不会 ...

  3. 我的 FPGA 学习历程(09)—— 时序逻辑入门

    讲到这篇时,组合逻辑就告一段落了,下面是一些总结: 描述组合逻辑时,always 语句中的敏感信号列表中需要列出全部的可能影响输出的变量 描述组合逻辑时,always 语句中的赋值总是使用阻塞赋值符号 ...

  4. 我的 FPGA 学习历程(08)—— 实验:点亮单个数码管

    数码管是一种常见的用于显示的电子器件,根据数码管大致可以分为共阴极和共阳极两种,下图所示的是一个共阳极的数码管的电路图(摘自金沙滩工作室的 51 开发板电路图),我的 AX301 开发板与这张图的情况 ...

  5. 我的 FPGA 学习历程(05)—— 使用 Modelsim 仿真工具

    在第 3 篇中讲到了如何使用图形进行仿真激励输入,图形输入法尽管简单易学,但如若要求复杂的仿真输入激励.较长的仿真时间或是要求打印输出信息乃至输出文件日志则显得不够用了. 本篇以上一篇的 3-8 译码 ...

  6. 我的 FPGA 学习历程(02)—— 实验:点亮 LED 灯

    关于 Quartus 的操作可以使用 Quartus 自带的帮助,帮助中带有全套的操作教程. 中文网络教程链接(链接至 altera中文官网,点击观看) Quartus II 软件设计系列:基础 Qu ...

  7. 我的 FPGA 学习历程(14)—— PWM 脉冲宽度调制

    PWM 是一种调节输出功率的技术(俗称调压),其原理在于改变输出方波的占空比,具体输出见下图: 输出信号为电压值,当负载为恒阻时,上图中的输出功率分别为 25%.50%.75%. 实现方法如下: 设置 ...

  8. 我的 FPGA 学习历程(11)—— 实验:按键消抖

    按键是一个输入设备,在理论上可以归为开关一类,理想的按键波形如下: 然而由于按键的机械特性,断开和闭合动作是不可能在一瞬间完成的,实际的波形如下: 抖动期间电平处于临界值,由于晶振的频率相当的高,数字 ...

  9. 我的 FPGA 学习历程(10)—— 实验:数码管驱动

    根据黑金 AX301 手册,数码管位选信号命名为 SEL[5:0],其中 SEL[5] 对应最左边的数码管,而SEL[0] 对应最右边数码管:作为约定,在下面的描述中我们对应的称之为数码管 5 和数码 ...

随机推荐

  1. html的分类与特点

    ##块级元素##|元素|描述||--|--||h1-h6|标题||div|区分大模块||p|段落||ul>li|无序列表||ol>li|有序列表||dl>dt dd|自定义列表||t ...

  2. 了解vue里的Runtime Only和Runtime+Compiler

    转自:了解vue里的Runtime Only和Runtime+Compiler 扩展文章:Vue 2.0如何仅使用Runtime-only Build构建项目? 可以看到有两种版本: Runtime ...

  3. sqli注入--利用information_schema配合双查询报错注入

    目录 sqli-labs 5.6双查询报错注入通关 0x01 获取目标库名 0x02 获取库中表的数量 0x03 获取库中表名 0x04 获取目标表中的列数 0x05 获取目标表的列名 0x06 从列 ...

  4. WebRTC Precompiled 使用

    最近研究webrtc native code,但源码太大(10GB以上)又需要FQ,就找了个预编译的版本https://sourcey.com/precompiled-webrtc-libraries ...

  5. git本机服务器配置(二):TortoiseGit的安装

    1. 下载TortoiseGit https://tortoisegit.org/ 1.1 下载安装包 下载对应安装包,如果不知道自己该下载哪个,那就下载32位的. 1.2 下载语言包 下载和安装包相 ...

  6. Spring Tools4

    Spring Tools4是一个集成了STS插件的Eclipse,所以下载之后就不需要再下载eclipse. 访问 https://spring.io/tools/ 点击“Download STS4 ...

  7. js 检测输入内容是否为空(小程序,网站)

    一.输入内容只要有空格就会返回true if(/\s*/.test(data)){ return true }else{ return false } 二.先替换掉空格,更利于赋值或者判断 1.需要判 ...

  8. luoguP1941-

    飞扬的小鸟 20分&50分: #include<iostream> #include<cstdio> #include<cstring> #include& ...

  9. centos6.6 minimal cannot found a valid baseurl for repo :base

    网上找了很久,说什么NDS1=8.8.8.8,DNS2=4.2.2.2 也有说改ifcfg-eth0文件的 总之我都改了,但都没用 现在我把我修改的流程发上来 1.https://blog.csdn. ...

  10. WebStorm远程调试Node.js

    1.服务启动IP及端口,如果是云服务,IP选用服务器内网IP.同时需要防火墙需要添加端口. #添加端口 $ firewall-cmd --zone=public --add-port=9229/tcp ...