定点数转浮点数定点数转浮点数verilog
本文目的是记录学习《数字信号处理的FPGA实现》过程中,用verilog语言实现简单的定点数到浮点数转换的经
历。
若以f[31:0]表示一个单精度32位浮点数,f[31]是符号位,其为‘0’表示正数、为‘1’表示负数;f[30:23]这8位为指数位,为了能表
示负指数,将在实际指数的基础上加上127得到的结果存入f[30:23];f[22:0]表示小数位(尾数),类似科学计数法,不过采用
了省略整数位(2进制的科学计数法整数位必定是1)1,将小数位从高到低依次存入f[22:0]的从高到低的位数,不足23位则在
末尾补0,例如小数位只有“10011001”则f[22:0]="10011001000000000000000",这样就可以用23位存储空间表示24位的数
据,变相增加了精度。另外还有一些特殊编码,如无穷大、0、NAN和非正规数,这里没有考虑,待以后用到再细究吧。
我用verilog语言写的定点数转浮点数模块,实现25位有符号定点整数转化成32位单精度浮点数,并不完全符合标准(例如未
考虑特殊编码等),第一步实现补码到原码的转换,第二步计算指数和尾数。
代码如下:
module fix2float(clk,rst_n,ifix,ofloat);
input clk,rst_n;
input [24:0] ifix;
//reg [24:0] ifix;
output [31:0] ofloat;
reg [24:0] ifix_r;
reg [31:0] ofloat_r;
reg [23:0] ustd_tail;
reg [22:0] std_tail;
reg [7:0] exp;
reg s1,s2;
assign ofloat=ofloat_r;
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
//ifix<=25'd100;
ofloat_r<=32'd0;
ustd_tail<=23'd0;
exp<=8'd0;
end
else
begin
ustd_tail<=ifix_r[23:0];
s1<=ifix[24];
s2<=s1;
if(ifix[24]==1'b1)
begin
评论5