首页天道酬勤十进制小数转bcd码,十进制数转换bcd码

十进制小数转bcd码,十进制数转换bcd码

张世龙 05-13 12:54 52次浏览

目录

一.卡介苗代码介绍

二、十进制旋转8421BCD码转换思路

三.程序编制

四.仿真验证

总结

另外一方面,BCD码概要BCD码(Binary-Coded Decimal )是将1位10进制数中0~9的10个数字用4位的2进制数表示的编码形式,经常用于计算机内部的10进制数和2进制数的转换

BCD码分为权利码和权利码两种。 其中,常见权利BCD码为8421码、2421码、5421码; 您没有BCD码剩下的三码、剩下的三回合码和格雷码的权限。 正如所指出的,8421码从高到低,每个位的权重分别为8、4、2、1,例如十进制9在8421BCD码中表示为1001; 2421和5421代码与8421代码相似,但每个位的权重不同。 例如,十进制9在2421BCD代码中表示为1111,十进制9在5421BCD代码中表示为1100。 剩余3码是8421码加上3,例如十进制9在剩余3码表示为1100; 剩下的3循环码在每个码元中固定为0、1的权重,相邻的码字之间只差1比特,避免了过度的码元噪声。

下图显示了典型的BCD代码

二、用十进制转换8421BCD码的思路以十进制234为例。

因为十进制234为三个比特,对应于步骤1(8) 234的二进制8 ) b1110_1010 (8)在b 1110 _ 1010之前3 *,所以每个比特在被转换为8421BCD码之后对应于4个比特

步骤2(20 )将b0000_0000_0000_1110_1010左移一位,然后将BCD码的最高位、最低位、最低位共计三组码字对应的十进制码是否大于4

第三步:向左换挡8次后,结束换挡。 此时,前12位是与该十进制数对应的8421BCD代码

三.程序编制下图展示了该模块的示意图。

输入信号:时钟信号sys_clk

复位信号sys_res

输入十进制数据

输出信号:个位unit

10位ten

百位浑

千位托福

万位t_tho

10万位h_tho

因为输入信号是20位二进制数,并且对应于十进制数的六个位,所以当在20位二进制数之前添加6*4=24个0以构成44位二进制数并且向左移位20次时,获得对应的8421BCD码

下面是模块的时序图。

以下是Verilog代码:

moduleBCD_8421(inputsys_clk,input sys_res,input

[19:0]data, output reg [3:0 ]unit, output reg [3:0 ]ten, output reg [3:0 ]hun, output reg [3:0 ]tho, output reg [3:0 ]t_tho, output reg [3:0 ]h_tho);reg [4 : 0]cnt_shift;reg [43: 0]data_shift;reg shift_flag;always@(posedge sys_clk or negedge sys_res) if(!sys_res) shift_flag <= 1'b0; else shift_flag <= ~shift_flag;always@(posedge sys_clk or negedge sys_res) if(!sys_res) 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;always@(posedge sys_clk or negedge sys_res) if(!sys_res) data_shift <= 44'd0; else if(cnt_shift == 5'd0) data_shift <= {24'b0,data}; else if(cnt_shift != 5'd0 && cnt_shift < 5'd21 && shift_flag == 1'b1) data_shift <= data_shift << 1; else if(cnt_shift != 5'd0 && cnt_shift < 5'd21 && shift_flag == 1'b0)begin data_shift[43:40] <= data_shift[43:40]>4 ? data_shift[43:40]+ 3: data_shift[43:40]; data_shift[39:36] <= data_shift[39:36]>4 ? data_shift[39:36]+ 3: data_shift[39:36]; data_shift[35:32] <= data_shift[35:32]>4 ? data_shift[35:32]+ 3: data_shift[35:32]; data_shift[31:28] <= data_shift[31:28]>4 ? data_shift[31:28]+ 3: data_shift[31:28]; data_shift[27:24] <= data_shift[27:24]>4 ? data_shift[27:24]+ 3: data_shift[27:24]; data_shift[23:20] <= data_shift[23:20]>4 ? data_shift[23:20]+ 3: data_shift[23:20]; end else if(cnt_shift == 5'd21) data_shift <= data_shift;always@(posedge sys_clk or negedge sys_res) if(!sys_res)begin unit <= 4'd0; ten <= 4'd0; hun <= 4'd0; tho <= 4'd0; t_tho <= 4'd0; h_tho <= 4'd0; end else if(cnt_shift == 5'd21)begin unit <= data_shift[23:20]; ten <= data_shift[27:24]; hun <= data_shift[31:28]; tho <= data_shift[35:32]; t_tho <= data_shift[39:36]; h_tho <= data_shift[43:40]; end endmodule 四、仿真验证

   下边给出测试文件的代码:

`timescale 1ns/1nsmodule tb_bcd_8421();reg clk ;reg res ;reg [19:0]data ;wire [3:0]unit ; wire [3:0]ten ; wire [3:0]hun ; wire [3:0]tho ; wire [3:0]t_tho ; wire [3:0]h_tho ;initial begin clk <= 1'b0; res <= 1'b0; #200 res <= 1'b1;end always#10 clk <= ~clk;//assign data = 20'd987654;initial begin data <= 20'd987_654; #1000 data <= 20'd456_123; #2000 data <= 20'd1237_89; #500 data <= 20'd147_852;end //两次数据间隔时间需大于840nsbcd_8421 u_bcd_8421( .sys_clk (clk) , .sys_res (res) , .data (data) , .unit ( unit ) , .ten ( ten ) , .hun ( hun ) , .tho ( tho ) , .t_tho ( t_tho) , .h_tho ( h_tho));endmodule

下图是Modelsim中仿真的结果:

      每次转换所需的时间至少需要840ns,上图中输入的十进制数20‘d123789与20‘d147852间隔时间小于840ns,因此,20'd123789没有完成转换。

总结

    初次创作,难免文章中存在错误,希望读者能够及时纠正并给予私信,望大家共同进步!

格雷码转二进制,8421bcd码转格雷码 单片机bcd码是什么,c语言中的ascii码值