在计算机中浮点数 表示通常采用IEEE754规定的格式,具体参考以下文章。
https://www.cnblogs.com/mikewolf2002/p/10095995.html
下面我们在Verilog中用状态机实现单精度浮点数的加减法功能。这个实现是多周期的单精度浮点加法。
浮点加法分为以下几个步骤:
1.初始化阶段,分离指数和尾数以及符号位。判断加数和被加数是否是规约浮点数,不是话,直接置overflow=0x11,重新进入初始化阶段,进行下一组数的加法
2.判断加数和被加数中是否有0,有零的话,可以直接得到结果。
3.对接操作,小阶向大阶对齐。
4.对接后,进行尾数相加。
5.规格化尾数,进行左规和右规处理。
6.判断是否溢出,设置overflow标志。
下面是verilog代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
module floatadd(clk, rst_n, x, y, z,overflow); input clk; input rst_n; input [31:0] x; input [31:0] y; output [31:0] z; output [1:0] overflow;//0,没有溢出,1,上溢,10,下溢,11 输入不是规格化数 reg [31:0] z; // z=x+y reg[24:0] xm, ym, zm; //尾数部分, 0+ 1+[22:0], reg[7:0] xe, ye, ze; //阶码部分 reg[2:0] state, nextstate; //状态机 reg zsign; //z的符号位 reg [1:0] overflow; parameter start=3'b000,zerock=3'b001,exequal=3'b010,addm=3'b011,infifl=3'b100,over =3'b110; always @(posedge clk) begin if(!rst_n) state <= start; else state <= nextstate; end //状态机进