上溢、下溢与除以零等异常情况在大多数系统中是经常发生的。以双精度
浮点数为例,如果只考虑格式化数,则它的溢出有四种情况:
(1)正数大于(1-)×2 的情
况为正上溢;
(2)正数小于0.5×2的情况 为正下溢;
(3)负数小于-(1-2)×2的情 况为负上溢;
(4)负数大于0.5×2的情况 为负下溢。
在浮点运算过程中一个很重要的步骤是舍入。舍入的目的是使得有效数据
的位数保持在固定位数范围内。
IEEE754标准规定了四种舍入模式:
(1)就近舍入(偶数):目标是 使舍入结果尽可能接近实际值。最大
误差为±LSB(Least Significant Bit)。
(2)零舍入RZ:通过截断实际值的多余位来实现。最大误差为土LSB。
(3)+∞舍入:结果向正无穷大方向舍入。所有值被舍入到下一个可能值,
负数的舍入结果将截去多余位,正数的舍入结果为下一个较大的有效值。
(4)-∞舍入:结果向负无穷大方向舍入。负数的舍入结果将为下一个较小
的有效值,正数的舍入结果将截去多余位。
下表给出了不同的舍入方法下的舍入结果,以8位值舍入为4位值为例。
不同舍入方法的舍入值
数值 就近舍入 零舍入 +∞舍入 -∞舍入
.01101001 .0111 .0110 .0111 .0110
-.01101001 -.0111 -.0110 -.0110 -.0111
.10000111 .1000 .1000 .1001 .1000
-10000111 -.1000 -.1000 -.1000 -.1001
.10000000 .1000 .1000 .1000 .1000
浮点运算单元源代码:
module alu(flout_a,flout_b,clk,en,rst,flout_c,yichu); //浮点运算单元模块
input[31:0] flout_a; //输入的被乘数
input[31:0] flout_b; //输入的乘数
input clk; //时钟信号
input en; //使能信号
input rst; //复位信号
output[31:0] flout_c; //输出运算结果
output[1:0] yichu; //输出溢出标志
reg[31:0] flout_c;
reg[1:0] yichu;
reg[1:0] overflow;
reg s3;
reg s1,s2; //符号
reg[7:0] exp1,exp2,exp3; //阶码
reg[22:0] man1,man2,man3; //尾数
reg n;
评论9