Verilog 把8位的16进制转换为8位的10进制,且提取10进制的百、十和个位数的方法

1、8位的16进制转换为8位的10进制
就是把第0位的数值加上第1位的数值的16倍

function [7:0]Hex_to_Doc;
input  [7:0] num_h;
begin
     Hex_to_Doc = num_h[3:0] + num_h[7:4]*16;
end 
endfunction

2、提取10进制的百、十和个位数
a.如果该数大于等于100:
三位数的百位:百位数是将这个数直接除以100;
三位数的十位:十位数是将这个数直接除以10再对10取余数;
三位数的个位:个位数是将这个数直接对10取余数;
b.如果该数大于等于10,小于100:
两位数的十位:十位数是将这个数直接除以10;
两位数的个位:个位数是将这个数直接对10取余数;
c…如果该数小于10:
那该数就是其个位数。

//
reg[7:0] bit_bai;
reg[7:0] bit_shi;
reg[7:0] bit_bai;
always @(posedge clk)
begin
		transfer(8'd120);
end

task transfer;
input  [7:0] num;
begin
      if(num >= 8'd100)
      begin
            bit_bai <= num/100;
            bit_shi <= (num/10)%10;
            bit_ge  <= num%10;
      end
      else if(num < 8'd100 && num >= 8'd10)
      begin
            bit_bai <= 8'h00;
            bit_shi <= num/10;
            bit_ge  <= num%10;
      end
      else
      begin
            bit_bai <= 8'h00;
            bit_shi <= 8'h00;``
            bit_ge  <= num;
      end
end 
endtask
/
module hex2bcd #( parameter IN_DATA_W = 27 ,//输入数据宽; parameter OUT_DATA_W = clogb2({{IN_DATA_W}{1'b1}})//自动计算输出数据对应的十进制数; )( input clk ,//系统时钟; input rst_n ,//系统复,低电平有效; input [IN_DATA_W-1:0] din ,//输入二进制数据; input din_vld ,//输入数据有效指示信号,高电平有效; output reg [4*OUT_DATA_W-1:0] dout ,//输出8421BCD码; output reg dout_vld //输出数据有效指示信号,高电平有效; ); localparam CNT_W = clogb(IN_DATA_W-3);//根据输入数据的宽自动计算需要移动的轮数; //localparam OUT_DATA_W = clogb2({{IN_DATA_W}{1'b1}});//自动计算输出数据对应的十进制数; reg [IN_DATA_W-1:0] din_ff0 ; reg flag ; reg [CNT_W-1:0] cnt ; reg [IN_DATA_W+OUT_DATA_W*4-1:0]data_shift ; reg end_cnt_ff0 ; wire [OUT_DATA_W*4-1:0] data_compare; wire add_cnt ; wire end_cnt ; function integer clogb2(input integer depth); begin if(depth==0) clogb2 = 1; else if(depth!=0) for(clogb2=0;depth>0;clogb2=clogb2+1) depth=depth/10; end endfunction //自动计算宽 function integer clogb(input integer depth);begin if(depth==0) clogb = 1; else if(depth!=0) for(clogb=0;depth>0;clogb=clogb+1) depth=depth>>1; end endfunction //当输入数据有效并此时该模块空闲时保存输入数据,否则不保存输入数据,这样可以保证本次换数据完全正确; always@(posedge clk or negedge rst_n)begin if(rst_n==1'b0)begin din_ff0 <= 0; end else if(din_vl
最新发布
03-24
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值