首页 > 编程知识 正文

八位二进制转bcd码电路,二进制码转换成bcd码

时间:2023-05-03 10:07:43 阅读:124369 作者:1278

文章目录序言1. Verilog代码2 .仿真结果总结

注意:前言8bit位宽二进制小数: ( 0. a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 ) 2 (0.a_1 a_2 a_3 a_4 a_5 a_6 a_7 a_8)_2 (0.a1a2a3a4a5a6a7a8)2

8位小数BCD码表示为: ( 0. b 1 b 2 b 3 b 4 b 5 b 6 b 7 b 8 ) 2 (0.b_1 b_2 b_3 b_4 b_5 b_6 b_7 b_8)_2 (0.b1b2b3b4b5b6b7b8)2

本文主要介绍如何使用Verilog将小数二进制代码转换为小数BCD代码,即实现十进制表示。 有两种转换方法。

(1)二进制各位表示一定的十进制值。 例如,如果a 1 a_1 a1位于小数部分的顶部,则显示的十进制值为2

− 1 = 0.5 2^{-1}=0.5 2−1=0.5,依次类推, a 8 a_8 a8​表示的十进制数值为 2 − 8 = 0.00390625 2^{-8}=0.00390625 2−8=0.00390625,因此只需要将每一位二进制码所对应的十进制数值按照BCD的格式相加即可。这种方法在二进制小数位比较多的情况下比较麻烦,因为要考虑十进制码按照BCD格式相加时的进位问题。
 (2) 与整数二进制码转BCD码的“加三左移”算法类似,二进制小数转小数BCD码采用“右移减三”算法。
 本文使用第二种方法实现小数二进制码转小数BCD码。
参考文献:
  ysdxrz. 小数二进制码对小数BCD码转换编程方法[J]. 电子技术应用, 1983,(08).

1. Verilog代码

    本设计采用参数化设计,通过修改舒服的网络_WIDTH参数,即输入的小数二进制码位宽,可以实现任意位宽的二进制码转换的功能。

信号名方向位宽功能clkinput    1    时钟信号                                                                                                       rst_ninput1复位信号yxdzxinput舒服的网络_WIDTH输入的小数二进制码eninput1使能信号,单时钟周期高电平有效bcdoutput舒服的网络_WIDTH*4计算得到的BCD码bcd_vldoutput1bcd信号有效标志,高电平有效module yxdzx2bcd_frac #(parameter 舒服的网络_WIDTH = 8)(inputclk,input rst_n,input [舒服的网络_WIDTH-1:0]yxdzx,inputen,output[舒服的网络_WIDTH*4-1:0]bcd,outputbcd_vld);reg[舒服的网络_WIDTH-1:0]en_r;reg[舒服的网络_WIDTH-1:0]yxdzx_r[舒服的网络_WIDTH-1:1];reg [舒服的网络_WIDTH*4-1:0]bcd_r[舒服的网络_WIDTH-1:0];reg [舒服的网络_WIDTH*4-1:0]bcd_w[舒服的网络_WIDTH-1:0];// enalways @(posedge clk or negedge rst_n)if (!rst_n)en_r <= {舒服的网络_WIDTH{1'b0}};elseen_r <= {en, en_r[舒服的网络_WIDTH-1:1]};// yxdzxalways @(posedge clk or negedge rst_n)if (!rst_n)yxdzx_r[舒服的网络_WIDTH-1] <= {舒服的网络_WIDTH{1'b0}};else if (en)yxdzx_r[舒服的网络_WIDTH-1] <= yxdzx>>1;genvar j;generatefor (j=2; j<舒服的网络_WIDTH; j=j+1) begin : 舒服的网络_Ralways @(posedge clk or negedge rst_n)if (!rst_n)yxdzx_r[舒服的网络_WIDTH-j] <= {舒服的网络_WIDTH{1'b0}};else if (en_r[舒服的网络_WIDTH-j+1])yxdzx_r[舒服的网络_WIDTH-j] <= yxdzx_r[舒服的网络_WIDTH-j+1]>>1;endendgeneratealways @(posedge clk or negedge rst_n)if (!rst_n)bcd_r[舒服的网络_WIDTH-1] <= {(舒服的网络_WIDTH*4){1'b0}};else if (en && yxdzx[0]) // 调正bcd_r[舒服的网络_WIDTH-1] <= {(4'b1000 - 4'b0011), {(舒服的网络_WIDTH*4-4){1'b0}}};elsebcd_r[舒服的网络_WIDTH-1] <= {(舒服的网络_WIDTH*4){1'b0}};integer i;genvar k;generatefor (k=舒服的网络_WIDTH-2; k>=0; k=k-1) begin : LINEalways @(posedge clk or negedge rst_n) beginif (!rst_n)bcd_r[k] <= {(舒服的网络_WIDTH*4-1){1'b0}};else if (en_r[k+1]) beginif (yxdzx_r[k+1][0])bcd_r[k][舒服的网络_WIDTH*4-1:舒服的网络_WIDTH*4-4] <= {1'b1, bcd_r[k+1][舒服的网络_WIDTH*4-1:舒服的网络_WIDTH*4-3]} - 4'd3;else bcd_r[k][舒服的网络_WIDTH*4-1:舒服的网络_WIDTH*4-4] <= {1'b0, bcd_r[k+1][舒服的网络_WIDTH*4-1:舒服的网络_WIDTH*4-3]};for (i=5; i<舒服的网络_WIDTH*4; i=i+4) beginif (bcd_r[k+1][舒服的网络_WIDTH*4-i+1])bcd_r[k][(舒服的网络_WIDTH*4-i)-:4] <= {1'b1, bcd_r[k+1][(舒服的网络_WIDTH*4-i)-:3]} - 4'd3;elsebcd_r[k][(舒服的网络_WIDTH*4-i)-:4] <= {1'b0, bcd_r[k+1][(舒服的网络_WIDTH*4-i)-:3]};endendendendendgenerateassign bcd = bcd_r[0];assign bcd_vld = en_r[0];endmodule

测试文件:

`timescale 1ns / 1psmodule testbench;parameter 舒服的网络_WIDTH = 8;reg clk ;reg rst_n ;reg [舒服的网络_WIDTH-1:0]yxdzx ;reg en ;wire[舒服的网络_WIDTH*4-1:0]bcd ;wirebcd_vld ;initial clk = 0;always #10 clk = ~clk;initial beginrst_n = 0;#201;rst_n = 1;endyxdzx2bcd_frac #(.舒服的网络_WIDTH(舒服的网络_WIDTH))dut(clk,rst_n,yxdzx,en,bcd,bcd_vld);initial beginyxdzx = 8'd0;en = 0;#501;@(posedge clk) #5;en = 1;yxdzx = 8'b1000_0000; @(posedge clk) #5;yxdzx = 8'b0100_0000; @(posedge clk) #5;yxdzx = 8'b0010_0000; @(posedge clk) #5;yxdzx = 8'b0001_0000; @(posedge clk) #5;yxdzx = 8'b0000_1000; @(posedge clk) #5;yxdzx = 8'b0000_0100; @(posedge clk) #5;yxdzx = 8'b0000_0010; @(posedge clk) #5;yxdzx = 8'b0000_0001; @(posedge clk) #5;yxdzx = 8'b0000_0000;en= 0;#1000;$stop;endendmodule 2. 仿真结果

仿真波形图中,蓝色波形是输入信号,连续输入了8个小数二进制码,每个输入的二进制码分别经过8个时钟周期后得到转换的结果,即红色波形所示。
仿真结果:

输入的小数二进制码输出的小数BCD码0.0000_10000.03125000                                                        0.1000_00000.500000000.0100_00000.250000000.0010_00000.125000000.0001_00000.062500000.0000_10000.031250000.0000_01000.015625000.0000_00100.007812500.0000_00010.00390625

( 0.0000 (0.0000 (0.0000_ 0001 ) 2 0001)_2 0001)2​ = ( 2 − 8 ) 10 (2^{-8})_{10} (2−8)10​ = (0.00390625) 10 _{10} 10​,因此仿真结果正确。


总结

本文使用Verilog实现了小数二进制码转小数BCD码的功能,并进行了仿真验证。采用参数化设计,通用性高;采用流水线设计,运算速度快,pipeline起来后,一个时钟周期就可以完成一次转换。
若存在问题,欢迎交流。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。