赞
踩
背景:
前文有提到过,心血来潮想学习浮点数乘法,基于IEEE754标准完成一个浮点数乘法运算的代码实现。随后,发现乘加器的运用比较广泛,且目前已完成了单精度浮点乘法运算的实现,所以,为嘛不去实现单精度浮点加法的运算呢?
于是,决定对相关知识点进行整合,进行一个完整的浮点数加法实现。
说明1:如果文章有误,欢迎大家指出、讨论,笔者也会积极改正,希望大家一起进步!
说明2:为了书写方便,本文中的一些符号相关的写法,可能是基于verilog语言的写法。另有一些流程,为了更直观的的表达,用的是verilog伪代码的方式进行展示。若给大家的阅读带来不便,还请多多包涵。
假设需要对两个浮点乘数A[31:0]和B[31:0]进行加法运算,得到C,则具体流程如下:
C = A + B
= { A_sign, A_exponent, A_fraction} + { B_sign, B_exponent, B_fraction};
其中:
注意:这里进行移位、加运算时,必须要把尾数位的隐藏位1加进去,该1表示小数的整数部分。
注意:CSDN上的很多帖子上,都在写用双符号法判断溢出的操作,但他们在所给的计算样例中舍弃掉隐藏位1,不小心就被绕进去了。
注意:如,本来要计算浮点数 1.m1 + 1.m2 的,对方展示的样例可能就是计算 0.m1+0.m2 的,然后用起了双符号法。
// 注:Verilog伪代码
if( A_sign== B_sign) begin
sum_m = c_m_align + d_m_align;
sum_s = A_sign;
end else if (A_fraction>= b_f_align) begin
sum_m = A_fraction- b_f_align;
sum_s = A_sign;
end else if (A_fraction< b_f_align) begin
sum_m = b_f_align- A_fraction;
sum_s = B_sign;
end
4 计算结果正则化,然后进行舍入计算。并在此过程中,要进行溢出判断。
注:
a 赛灵思他们家好像用的都是就近舍入( Round to nearest (even) );
b 还有一些帖子上用的是 末位恒置1法 、0舍1入法,感觉精度不一定有 就近舍入 的高。
// 注:Verilog伪代码,不是规范的代码书写,只是为了方便 阅读 与 区分。 if( A和B为 zero或denormal ) begin 则返回zero; end else if( A或B为 nan) begin 返回qnan; end else if( A或B为 infinity ) begin if( A与B为 infinity ) begin if( A或B为 符号不相同 ) 返回qnan; else 返回infinity; end else 返回infinity; end else if( A为 zero )begin 返回B; end else if( B为 zero )begin 返回A; else 正常的浮点数计算,按照 1.思路 中的操作来就行了。 end
上述过程中,还需要对INVALID、UNDERFLOW、OVERFLOW进行判断。
这个根据定义来就行了,比较简单,就不赘述了。
fp_add_data #( .addr_width( addr_WIDTH ) )fp_add_data_inst( // 数据读取模块,对存在本地的浮点数据进行读取 .Clk(Clk), .rst_N(rst_N), .Done(Done), .C_H(c_h[31:0]), .D_H(d_h[31:0]), .C_D(c_d[31:0]) ); // A和B的数据,传递给浮点加法器 fp_add fp_add_inst( .C(c_h[31:0]), .D(d_h[31:0]), .FPA_OUT(fpa_out[31:0]) // 通过浮点乘法器算出来的A*B结果 ); assign PassStatus = ( fpa_out==c_d )? 1 : 0 ; // 将事先预算出的加法结果与浮点加法模块算出的结果进行对比
波形图:
1 整体角度
2 局部放大
从RTL仿真结果来看,PassStatus的一直为1,这意味浮点数加法器的功能应该是通过了的。
其他:
关于运行速度,是在一款国产FPGA软件工具上测的。
预期300Mhz,最快可以跑到320Mhz;预期400Mhz,最快可以跑到400.2Mhz;
感觉改进一下代码,可能跑得更快。
嗯,百度百科的词条是这么解释双符号法的,笔者认为这个可以从计算机原理的角度来解释二进制数据的加减、溢位过程。
但从Verilog实现的角度来看,还是直接进行符号判断、然后原码加减来的简单暴力点;如果要用双符号法,还得增加一个原码与补码转换机制。所以,笔者直接偷了懒,感兴趣的朋友可以尝试下。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。