verilog实现二进制转BCD码-加3移位法

这篇具有很好参考价值的文章主要介绍了verilog实现二进制转BCD码-加3移位法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

BCD码用4位二进制数表示一个十进制数,最常用的BCD码是8421码,用4’b0000-4’b1001表示十进制数字0-9,接下来默认BCD码就是8421码。

在FPGA中使用数码管时,段选信号不好记,所以我们用BCD码表示一个数码管的数值,将BCD码转化为段选信号驱动数码管,数码管驱动可以这篇文章:74hc595驱动数码管。例如,当我们想要6个数码管显示123456时,只需要给数码管驱动模块传入{4’h1, 4’h2, 4’h3, 4’h4, 4’h5, 4’h6}即可。

但这样做依然不够方便,例如,当我们采集到某个10bit二进制数时,想要将其显示在数码管上,该怎么办?此时就需要进行二进制转BCD码的操作,最简单粗暴的方法为使用除法,但fpga中使用除法消耗资源过多,因此通常用加三移位法。

加三移位法

4位二进制数取值范围为0-15,为16进制,而BCD码为0-9,为10进制,如果4位二进制数逢十进一,就能得到BCD码,所以需要对大于9的4位二进制数进行+6强制进位

加三移位法即上述方法的改进,占用更少的资源。由于4位二进制数大于9时需要+6调整,那么其大于4时,其左移后会大于9,所以左移前进行+3调整,等同于左移后+6。

对于大于4位的二进制数,通过左移,每4位大于4的都+3调整,可将任意位的二进制数转化为BCD码。
注意:最后一次左移后不需要调整,因为不再会左移,任意4位大于4也没关系

参考网上的例子,以8bit二进制数8’hff为例:

0           1111 1111;          //原数
1           0000 0001;          //左移一次
2           0000 0011;          //左移二次
3           0000 0111;          //左移三次,检查低四位>4?
3.1.        0000 1010;          //大于4,加3进行调整
4           0001 0101;          //左移四次,检查低四位>4?
4.1.        0001 1000;          //大于4,加3进行调整
5           0011 0001;          //左移五次
6           0110 0011;          //左移六次,检查高四位>4?
6.1.        1001 0011;          //大于4,加3进行调整
7           1 0010 0111;         //左移七次,检查低四位>4?
7.1.        1 0010 1010;         //大于4,加3进行调整
8           10 0101 0101;        //左移八次(得到BCD码255)

更多细节可以看这篇文章:走近FPGA之二进制转BCD码

RTL代码与仿真

给大于4就+3这个操作编写一个模块Adder:

module Adder(
    input [3:0] i_data,
    output [3:0] o_data
);
    assign o_data = (i_data > 4'h4) ? (i_data + 4'h3) : i_data;
endmodule

以10bit二进制数转BCD码为例,其RTL图如下所示:
加三移位法,FPGA,数码管,fpga开发

首先,0和A9,A8,A7构成了左移3次后的低4位,Adder1对其进行+3调整,输出o1,o1低3位与A6构成了左移4次的低4位,同理Adder2的输出o2的低3位与A5构成了左移5次的低四位,后续Adder3~Adder7同理。第一层到第七层分别为左移3次到左移9次的调整,其它Adder的作用可以参考上述8位二进制数转BCD码的流程。

根据上图,可以轻易写出10位二进制转BCD码的RTL代码:

module bin2bcd_10bit(
    input   [9:0]   i_data,
    output  [15:0]  o_bcd
);
//------------signals--------------
wire [3:0] o1, o2, o3, o4, o5, o6, o7, o8, o9, o10, o11, o12;
//------------function-------------
Adder Adder1 (
    .i_data ({1'b0, i_data[9:7]}), 
    .o_data (o1)
);
Adder Adder2 (
    .i_data ({o1[2:0], i_data[6]}), 
    .o_data (o2)
);
Adder Adder3 (
    .i_data ({o2[2:0], i_data[5]}), 
    .o_data (o3)
);
Adder Adder4 (
    .i_data ({o3[2:0], i_data[4]}), 
    .o_data (o4)
);
Adder Adder5 (
    .i_data ({o4[2:0], i_data[3]}), 
    .o_data (o5)
);
Adder Adder6 (
    .i_data ({o5[2:0], i_data[2]}), 
    .o_data (o6)
);
Adder Adder7 (
    .i_data ({o6[2:0], i_data[1]}), 
    .o_data (o7)
);
Adder Adder8 (
    .i_data ({1'b0, o1[3], o2[3], o3[3]}), 
    .o_data (o8)
);
Adder Adder9 (
    .i_data ({o8[2:0], o4[3]}), 
    .o_data (o9)
);
Adder Adder10 (
    .i_data ({o9[2:0], o5[3]}), 
    .o_data (o10)
);
Adder Adder11 (
    .i_data ({o10[2:0], o6[3]}), 
    .o_data (o11)
);
Adder Adder12 (
    .i_data ({1'b0, o8[3], o9[3], o10[3]}), 
    .o_data (o12)
);
assign o_bcd = {3'b000, o12, o11, o7, i_data[0]};
endmodule

编写仿真tb,输入20个随机10位二进制数,输出bcd码的hex格式:

`timescale 1ps/1ps
`define CLK_CYCLE 20

module bin2bcd_8bit_tb;

//----------clk generate-----------
reg clk = 1'b1;
always #(`CLK_CYCLE/2) clk = ~clk;

//-----------signals---------------
reg rst_n = 1'b0;
reg [9:0] i_data = 10'd0;
wire [15:0] o_data;

//----------instantiation----------
bin2bcd_10bit inst_bin2bcd_10bit (
    .i_data (i_data), 
    .o_bcd  (o_data)
);

//-----------simulation------------
initial begin
    // reset first
    @(negedge clk) rst_n = 1'b1;
    @(posedge clk);
    
    $monitor("input(decimal): %d, output(hex): %h, time: %t", i_data, o_data, $time);
    repeat(20) begin
        i_data = $random;
        #(`CLK_CYCLE);
    end

    // stop/finish
    #(`CLK_CYCLE * 10) $finish;
end

endmodule

仿真结果如下:
加三移位法,FPGA,数码管,fpga开发
可以看出20次二进制数转BCD码都成功了,之后可以用该模块加上数码管译码模块直接进行10bit二进制数的数码管显示。

16bit二进制转bcd码也同理,其RTL图如下:
加三移位法,FPGA,数码管,fpga开发
可以看出组合逻辑非常多,有13层加三移位Adder,为了降低组合逻辑延时,可以进行流水线加速,这里就不具体展开了。文章来源地址https://www.toymoban.com/news/detail-742074.html

到了这里,关于verilog实现二进制转BCD码-加3移位法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用74LS73设计四位二进制加法计数器和8421BCD加法计数器

     (1)用2片74LS73实现该电路,由CP端输入单脉冲,设计并画出4位异步二进制加法计数器电路图。  (2)由CP端输入单脉冲,测试并记录Q1~Q4端状态及波形。 四位二进制加法计数器状态迁移表如下: Q 4n Q 3n Q 2n Q 1n Q 4n+1 Q 3n+1 Q 2n+1 Q 1n+1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 1 1 0 0 1 1 0 1 0

    2024年02月10日
    浏览(90)
  • 【FPGA】Verilog:二进制并行加法器 | 超前进位 | 实现 4 位二进制并行加法器和减法器 | MSI/LSI 运算电路

    0x00 并行加法器和减法器 如果我们要对 4 位加法器和减法器进行关于二进制并行运算功能,可以通过将加法器和减法器以 N 个并行连接的方式,创建一个执行 N 位加法和减法运算的电路。 4 位二进制并行加法器 4 位二进制并行减法器

    2024年02月05日
    浏览(57)
  • 10.31一些代码分析,香浓展开,移位器(桶形多位),二进制转格雷码

     always的block之间,采用并行执行 always之内,采用非阻塞赋值,为顺序执行 这个把使能信号和W信号组合在一起,进行case语句,即只有合并信号最高位为1时,才进行操作 always后面要写@,assign不用 这没有期望的边沿,就是只要发生变化就会触发 加上posedge,negedge就可以标记期望

    2024年02月07日
    浏览(59)
  • 【FPGA】Verilog:计数器 | 异步计数器 | 同步计数器 | 2位二进制计数器的实现 | 4位十进制计数器的实现

    目录 Ⅰ. 实践说明 0x00 计数器(Counter) 0x01 异步计数器(Asynchronous Counter)

    2024年02月05日
    浏览(57)
  • Verilog | 二进制与格雷码

    格雷码是一个叫弗兰克·格雷的人在 1953 年发明的,最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以 避免二进制编码计数组合电路中出现的亚稳态 。格雷码常

    2023年04月14日
    浏览(39)
  • 【Verilog基础】二进制比较器

    1、1、一位数值比较器(是多位比较器的基础) 1、真值表: 2、由真值表推逻辑表达式: 3、逻辑电路:

    2024年02月05日
    浏览(50)
  • 【verilog】6位二进制数加法器

    1:掌握无符号二进制数加法器的设计方法。 2:掌握使用Modelsim对verilog程序进行仿真和验证的方法。 二进制加法器由全加器构成,全加器功能和电路图如下图所示。 全加器对两个1位二进制数和1位来自低位的进位做加法运算,产生1位和和1位向更高位的进位。图中(a)是全加

    2024年02月06日
    浏览(46)
  • 【verilog】用七段数码管显示二进制编码的十进制数

    用七段数码管显示0~9,输入为四个信号,这四位二进制数表示十进制的0~9 图1 逻辑电路与七段显示器 图2 真值表 根据卡诺图,得出a~g的逻辑表达式: 硬件描述语言: 图4 代码编译成功 图5 电路图 图6 仿真波形 表1 端口管脚分配表 端口 使用模块信号 对应FPGA管脚 功能说明

    2023年04月25日
    浏览(58)
  • [FPGA]用Verilog写一个简单三位二进制加法器和减法器

    加法器和减法器是数字电路中的基本组件,它们可以对二进制数进行算术运算。加法器可以将两个或多个二进制数相加,得到一个和和一个进位。减法器可以将两个二进制数相减,得到一个差和一个借位。加法器和减法器可以用来实现更高级的运算,例如乘法、除法、移位等

    2024年02月04日
    浏览(44)
  • 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器与分频器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用

    2024年02月02日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包