上海大学 Verilog 设计 32位浮点加法器设计
- 格式:docx
- 大小:218.99 KB
- 文档页数:7
《VLSI电路系统与设计》课程设计报告——32bit_32bit移位相加乘法器A 移位相加乘法器原理无符号二进制移位相加乘法器的基本原理是通过逐项移位相加来实现相乘的,从被乘数的最低为开始,若为1,则乘法左移后与上一次的和相加;若为0,左移后以全零相加,直至被乘数的最高位。
以下以4位二进制数为例进行说明:图1 移位相加乘法器原理图如图所示,就可以实现4位二进制数的相乘。
B 电路结构方案根据移位相加乘法器的基本原理,可以将整个电路划分为四个部分:32右移寄存器,32位加法器,乘1模块,64位锁存器。
原理框图如下所示:图2 移位相加乘法器原理框图在上图中,START信号的上跳沿及其高电平有两个功能,即32位寄存器清零和被乘数A[32:0]向移位寄存器SREG32B加载;它的低电平则作为乘法使能信号。
CLK为乘法时钟信号。
当被乘数被加载于32位右移寄存器SREG32B后,随着每一时钟节拍,最低位在前,由低位至高位逐位移出。
当为1时,与门ANDARITH打开,32位乘数B[32:0]在同一节拍进入32位加法器,与上一次锁存在64位锁存器REG16B中的高32位进行相加,其和在下一时钟节拍的上升沿被锁进此锁存器。
而当被乘数的移出位为0时,与门全零输出。
如此往复,直至32个时钟脉冲后,乘法运算过程中止。
此时REG64B的输出值即为最后的乘积。
此乘法器的优点是节省芯片资源,它的核心元件只是一个32位加法器,其运算速度取决于输入的时钟频率。
一、32位加法器模块的设计加法器模块是由8个四位全加器构成的,4位全加器是采用1位全加器构成的。
对于1位全加器,采用门级描述语言,使用了3个异或门和2个与门来实现的。
(1)1位加法器是采用门级描述语言,生成的库文件如图:仿真结果:图1 功能仿真图2 时序仿真(2)32位全加器32位全加器是采用8个4位全加器构成的,其电路原理图如下:图3-32位全加器原理图仿真结果:图4 功能仿真图5 时序仿真由以上的仿真结果可以看出,所设计电路在在功能上能满足要求,在时序上存在一定的时间延迟。
32位浮点加法器设计32位浮点加法器是一种用于计算机中的算术逻辑单元(ALU),用于执行浮点数的加法运算。
它可以将两个32位浮点数相加,并输出一个32位的结果。
设计一个高效的32位浮点加法器需要考虑多个方面,包括浮点数的表示形式、运算精度、舍入方式、运算逻辑等。
下面将详细介绍32位浮点加法器的设计。
1.浮点数的表示形式:浮点数通常采用IEEE754标准进行表示,其中32位浮点数由三个部分组成:符号位、阶码和尾数。
符号位用来表示浮点数的正负,阶码用来表示浮点数的指数,尾数用来表示浮点数的小数部分。
2.运算精度:在浮点数加法运算中,精度是一个重要的考虑因素。
通常,浮点数加法器采用单精度(32位)进行设计,可以处理较为广泛的应用需求。
如果需要更高的精度,可以考虑使用双精度(64位)浮点加法器。
3.舍入方式:浮点数加法运算中,结果通常需要进行舍入处理。
常见的舍入方式有以下几种:舍入到最近的偶数、舍入向上、舍入向下、舍入到零。
具体的舍入方式可以根据应用需求来确定。
4.运算逻辑:浮点数加法运算涉及到符号位、阶码和尾数的加法。
首先,需要判断两个浮点数的阶码大小,将较小的阶码移到较大的阶码对齐,并相应调整尾数。
然后,将尾数进行相加并进行规格化处理。
最后,根据求和结果的大小,进行溢出处理和舍入操作。
在32位浮点加法器的设计中,还需要考虑到性能和效率。
可以采用流水线技术来提高运算速度,将加法运算划分为多个阶段,并在每个阶段使用并行处理来加速运算。
此外,还可以使用硬件加速器和快速逻辑电路来优化运算过程。
总结起来,设计一个高效的32位浮点加法器需要考虑浮点数的表示形式、运算精度、舍入方式、运算逻辑以及性能和效率。
在实际设计中,还需要根据具体应用需求进行功能扩展和优化。
通过合理的设计和调优,可以实现高性能的浮点加法器,满足不同应用场景的需求。
一种32位高速浮点乘法器设计
周德金;孙锋;于宗光
【期刊名称】《电子与封装》
【年(卷),期】2008(8)9
【摘要】文章介绍一种32位浮点乘法器软IP的设计,其部分积缩减部分采用修正Booth算法,部分积加法采用4-2压缩树结构,最终carry,sum形式部分积采用进位选择加法器完成,乘法器可以进行32位浮点数或24位定点数的乘法运算.采用VerilogHDL RTL级描述,采用SMIC 0.18μm工艺库进行综合,门级仿真结果表明乘法器延时小于4.05ns.
【总页数】4页(P35-38)
【作者】周德金;孙锋;于宗光
【作者单位】江南大学信息工程学院,江苏,无锡,214036;中国电子科技集团公司第五十八研究所,江苏,无锡,214035;江南大学信息工程学院,江苏,无锡,214036;中国电子科技集团公司第五十八研究所,江苏,无锡,214035;江南大学信息工程学院,江苏,无锡,214036;中国电子科技集团公司第五十八研究所,江苏,无锡,214035
【正文语种】中文
【中图分类】TN702
【相关文献】
1.基于改进型选择进位加法器的32位浮点乘法器设计 [J], 刘容;赵洪深;李晓今
2.32位并行浮点乘法器设计 [J], 张菁
3.一种高性能32位浮点乘法器的ASIC设计 [J], 赵忠武;陈禾;韩月秋
4.32位高速浮点乘法器优化设计 [J], 周德金;孙锋;于宗光
5.32位高性能浮点乘法器芯片设计研究 [J], 黄宁;朱恩
因版权原因,仅展示原文概要,查看原文内容请购买。
32位浮点加法器设计摘要:浮点数具有数值范围大,表示格式不受限制的特点,因此浮点数的应用是非常广泛的。
浮点数加法运算比较复杂,算法很多,但是为了提高运算速度,大部分均是基于流水线的设计结构。
本文介绍了基于IEE754标准的用Verilog 语言设计的32位浮点加法器,能够实现32位浮点数的加法运算。
虽然未采用流水线的设计结构但是仍然对流水线结构做了比较详细的介绍。
关键字:浮点数,流水线,32位浮点数加法运算,Verilog 语言设计32-bit floating point adder designCao Chi,Shen Jia- qi,Zheng Yun-jia(School of Mechatronic Engineering and Automation, Shanghai University, Shanghai ,China ) Abstract://沈佳琪搞定Key words :float; Assembly line; 32-bit floating-point adder 浮点数的应用非常广泛,无论是在计算机还是微处理器中都离不开浮点数。
但是浮点数的加法运算规则比较复杂不易理解掌握,而且按照传统的运算方法,运算速度较慢。
因此,浮点加法器的设计采用了流水线的设计方法。
32位浮点数运算的摄入处理采用了IEE754标准的“0舍1入”法。
1. 浮点数的介绍在处理器中,数据不仅有符号,而且经常含有小数,即既有整数部分又有小数部分。
根据小数点位置是否固定,数的表示方法分为定点表示和浮点表示。
浮点数就是用浮点表示法表示的实数。
浮点数扩大了数的表示范围和精度。
浮点数由阶符、阶码E 、数符、尾数N 构成。
任意一个二进制数N 总可以表示成如下形式:N=。
通常规定:二进制浮点数,其尾数数字部分原码的最高位为1,叫作规格化表示法。
因此,扩大数的表示范围,就增加阶码的位数,要提高精度,就增加尾数的位数。
基于与非门和D触发器的32位加法器【摘要】这次的课程设计的任务是设计一个输入范围为-(230-1)~(230-1)的加法器。
利用拨码开关输入二进制补码,再将二进制补码转化为串行信号,经过一位全加器后得到计算结果,再将计算结果转化为并行信号输出,并利用LED灯显示计算结果的二进制补码。
本次设计通过开关的闭合和断开来代表电平的高低,继而代表代表1和0来输入所要计算的十进制数的补码。
将并行输入转化为串行输出的模块和将串行输入转化为并行输出的模块是由与非门和D触发器构成的移位寄存器。
但是,这样并不能保证输出的稳定,所以我们在串入并出的移位寄存器的每个输出后面各加了一个D触发器,只有当32位补码全部并出时,D触发器才会触发,将结果显示,其余时候D触发器将保持上一个输出结果。
这样就能确保计算结果的稳定显示。
而控制并入串出信号的加载和最后结果稳定显示的控制电路是由与非门和D触发器构成的模32计数器,每次计32个时钟上升沿时便会产生一个上升沿。
用来控制移位寄存器移位动作和计数器的时钟信号,是由NE555电路产生的1KHz的脉冲信号。
【关键词】32位加法器:移位寄存器;计数器;NE555一、设计目的与要求1、设计目的1)掌握计数器、移位寄存器的电路设计与工作原理。
2)学会分析各模块之间的时延关系,并调节各个模块之间的时延关系。
3)掌握信号并入串出和串入并出的工作原理。
4)了解时钟信号的产生。
2、设计要求设计一个输入范围为-(230-1)~(230-1)的加法器。
具体要求如下:1)只能使用与非门和D触发器。
2)用两组拨码开关分别输入两个加数的二进制补码。
3)用二极管稳定显示计算结果的二进制补码。
4)利用Multisim设计仿真。
二、设计思路我们将加法器可以分为3级:第一级是并入串出模块;第二级是加法运算模块(一位全加器);第三级是串入并出模块。
第一级模块负责将拨码快关的并行输入转化为串行输出,作为第二级输入,输入到第二级加法运算模块,得到一个串行输出的计算结果,将该结果作为第三级输入,再由第三级模块转化为并行输出,最后由LED显示。
32位浮点加法器设计一、基本原理浮点数加法运算是在指数和尾数两个部分进行的。
浮点数一般采用IEEE754标准表示,其中尾数部分采用规格化表示。
浮点加法的基本原理是将两个浮点数的尾数对齐并进行加法运算,再进行规格化处理。
在加法运算过程中,还需考虑符号位、指数溢出、尾数对齐等特殊情况。
二、设计方案1. 硬件实现方案:采用组合逻辑电路实现浮点加法器,以保证运算速度和实时性。
采用Kogge-Stone并行加法器、冒泡排序等技术,提高运算效率。
2.数据输入:设计32位浮点加法器,需要提供两个浮点数的输入端口,包括符号位、指数位和尾数位。
3.数据输出:设计32位浮点加法器的输出端口,输出相加后的结果,包括符号位、指数位和尾数位。
4.控制信号:设计合适的控制信号,用于实现指数对齐、尾数对齐、规格化等操作。
5.流程控制:设计合理的流程控制,对各个部分进行并行和串行处理,提高加法器的效率。
三、关键技术1. Kogge-Stone并行加法器:采用Kogge-Stone并行加法器可以实现多位数的并行加法运算,提高运算效率。
2.浮点数尾数对齐:设计浮点加法器需要考虑浮点数尾数的对齐问题,根据指数大小进行右移或左移操作。
3.溢出判断和处理:浮点加法器需要判断浮点数的指数是否溢出,若溢出需要进行调整和规格化。
4.符号位处理:设计浮点加法器需要考虑符号位的处理,确定加法结果的符号。
四、性能评价性能评价是衡量浮点加法器设计好坏的重要指标。
主要从以下几个方面进行评价:1.精度:通过与软件仿真结果进行比较,评估加法器的运算精度,误差较小的加法器意味着更高的性能。
2.速度:评估加法器的运行速度,主要考虑延迟和吞吐量。
延迟越低,意味着加法器能够更快地输出结果;吞吐量越高,意味着加法器能够更快地处理多个浮点加法运算。
3.功耗:评估加法器的功耗情况,低功耗设计有助于提高整个系统的能效。
4.面积:评估加法器的硬件资源占用情况,面积越小意味着设计更紧凑,可用于片上集成、嵌入式系统等场景。
verilog-32位浮点加法器程序及代码解释module flowadd(ix, iy, clk, a_en, ost,oz);input ix, iy, clk, a_en;output oz, ost;wire[31:0] ix,iy;reg[31:0] oz;wire clk,ost,a_en;reg[25:0] xm, ym, zm;reg[7:0] xe, ye, ze;reg[2:0] state;parameter start=3'b000,zerock=3'b001,exequal=3'b010,addm=3'b011,infifl=3'b100,over =3'b110; assign ost = (state == over) ? 1 : 0; /*后端处理,输出浮点数*/always@(posedge ost)beginif(a_en)oz <= {zm[25],ze[7:0],zm[22:0]};endalways@(posedge clk) //状态机begincase(state)start: //前端处理,分离尾数和指数,同时还原尾数beginxe <= ix[30:23];xm <= {ix[31],1'b0,1'b1,ix[22:0]};ye <= iy[30:23];ym <= {iy[31],1'b0,1'b1,iy[22:0]};state <= zerock;endzerock:beginif(ix == 0)begin{ze, zm} <= {ye, ym};state <= over;endelseif(iy == 0)begin{ze, zm} <= {xe, xm};state <= over;endelsestate <= exequal;endexequal: //指数处理,使得指数相等beginif(xe == ye)state <= addm;elseif(xe > ye)beginye <= ye + 1;ym[24:0] <= {1'b0, ym[24:1]};if(ym == 0)beginzm <= xm;ze <= xe;state <= over;endelsestate <= exequal;endelsebeginxe <= xe + 1;xm[24:0] <= {1'b0,xm[24:1]};if(xm == 0)beginzm <= ym;ze <= ye;state <= over;endelsestate <= exequal;endendaddm: //带符号位和保留进位的尾数相加beginif ((xm[25]^ym[25])==0)beginzm[25] <= xm[25];zm[24:0] <= xm[24:0]+ym[24:0];endelseif(xm[24:0]>ym[24:0])beginzm[25] <= xm[25];zm[24:0] <=xm[24:0]-ym[24:0];endelsebeginzm[25] <= ym[25];zm[24:0] <=ym[24:0]-xm[24:0];endze <= xe;state <= infifl;endinfifl: //尾数规格化处理beginif(zm[24]==1)beginzm[24:0] <= {1'b0,zm[24:1]};ze <= ze + 1;state <= over;endelseif(zm[23]==0)beginzm[24:0] <= {zm[23:0],1'b0};ze <= ze - 1;state <= infifl;endelsestate <= over;endover:beginstate<= start;enddefault:beginstate<= start; end endcase end endmodule。
32位浮点加法器设计摘要:浮点数具有数值范围大,表示格式不受限制的特点,因此浮点数的应用是非常广泛的。
浮点数加法运算比较复杂,算法很多,但是为了提高运算速度,大部分均是基于流水线的设计结构。
本文介绍了基于IEE754标准的用Verilog语言设计的32位浮点加法器,能够实现32位浮点数的加法运算。
虽然未采用流水线的设计结构但是仍然对流水线结构做了比较详细的介绍。
关键字:浮点数,流水线,32位浮点数加法运算,Verilog语言设计32-bit floating point adder designCao Chi,Shen Jia- qi,Zheng Yun-jia(School of Mechatronic Engineering and Automation, Shanghai University, Shanghai ,China) Abstract://沈佳琪搞定Key words:float; Assembly line; 32-bit floating-point adder浮点数的应用非常广泛,无论是在计算机还是微处理器中都离不开浮点数。
但是浮点数的加法运算规则比较复杂不易理解掌握,而且按照传统的运算方法,运算速度较慢。
因此,浮点加法器的设计采用了流水线的设计方法。
32位浮点数运算的摄入处理采用了IEE754标准的“0舍1入”法。
1.浮点数的介绍在处理器中,数据不仅有符号,而且经常含有小数,即既有整数部分又有小数部分。
根据小数点位置是否固定,数的表示方法分为定点表示和浮点表示。
浮点数就是用浮点表示法表示的实数。
浮点数扩大了数的表示范围和精度。
浮点数由阶符、阶码E、数符、尾数N构成。
任意一个二进制数N总可以表示成如下形式:N=±M×2±E。
通常规定:二进制浮点数,其尾数数字部分原码的最高位为1,叫作规格化表示法。
因此,扩大数的表示范围,就增加阶码的位数,要提高精度,就增加尾数的位数。
浮点数表示二进制数的优势显而易见。
31 30 23 22 032位浮点数:64位浮点数:在IEEE754标准格式表示的32位浮点数中,S表示浮点数的符号位,0表示正数,1表示负数;M表示尾数,共23位,用小数表示,小数点放在尾数域的最前面;E表示阶码,共8位,采用移码方式表示正负指数。
移码方法对两个指数的大小的比较和对阶操作比较方便。
采用这种方式时,浮点数的指数真值e变成阶码E时,应将指数e加上一个固定的偏移地址127(二进制数01111111),即E=e+127。
在IEEE754标准中,一个规格化的32位浮点数X 的真值可表示为X=(-1)s×(1.M)×2E-127e=E-127一个规格化的64位浮点数x的真值为X=(-1)s×(1.M)×2E-1023e=E-1023为提高数据的精度,当尾数的值不为0时,尾域的最高有效位为1,否则修改阶码同时左右移动小数点,使其变成规格化表示的浮点数。
这一过程称之为规格化表示。
当浮点数的尾数为零时,不论阶码为何值或者阶码的值遇到比它所能表示的最小值还小时,不管其尾数为何值,计算机都把该浮点数当做零值。
原码非0值浮点数的尾数值最高位必定为1,在保存浮点数时,通过尾数左移(小数点向右移动)把该位去掉,用同样多的位数能多存一位二进制数,有利于提高数据表示精度,这种处理方案称之为隐藏位技术。
32位浮点数的表示范围有限,超过该范围的浮点数会产生溢出。
溢出分为正上溢和负上溢。
2.32位浮点数加法运算浮点数的加法运算与二进制数直接进行加法运算区别是很大的。
浮点数的加法运算分为以下几个步骤:(1)0操作数的检查;(2)比较阶码大小并完成对阶;(3)尾数进行加法运算;(4)结果进行规格化处理;(5)舍入处理;(6)溢出处理。
0操作数的检查是判断两个数据是否为零,若有一个数据为0则直接输出结果;比较两个数据的阶码大小,并通过尾数的移动来改变阶码使其相等。
对阶的过程要遵循阶码小的向阶码大的数对齐,小阶的尾数右移,每右移一位,阶码加一。
尾数求和运算与一般二进制数的加法运算相同;在尾数相加后得到的数可能不是规格化的数,为了提供运算的精度,就必须对求和的结果进行规格化处理。
当运算结果溢出时,进行右归。
左归时阶码做减法,右归时阶码做加法。
在IEEE754标准中,舍入处理提供了四种方法:(1)就近舍入:实质上就是通常所说的“四舍五入”。
(2)朝0舍入:朝数轴原点方向舍入,就是简单的截尾。
无论尾数是正数还是负数,截尾都使取值的绝对值比原值的绝对值小。
(3)朝+∞舍入:对正数来说,只要多余位不全为0则向最低有效位进1;对负数来说则是简单的截尾。
(4)朝—∞舍入:处理方法与朝+∞舍入情况相反。
对正数来说只要多余位不全为0则简单截尾;对负数来说,向最低有效位进1。
(5)与一般二进制数的加法运算相似,浮点数的加法运算也要是否溢出。
尾数之和出现01.xxxx或10.xxxx时,并不表示溢出,只有将此数进行右归后,再根据阶码来判断浮点运算结果是否溢出。
一般说浮点是否溢出均是指上溢(正上溢、下上溢)。
因此,浮点数是否溢出可由阶码来决定。
从以上加法的运算过程可以看出,浮点数加法运算步骤较多,体系结构相对比较复杂,目前比较常见的浮点加法器的结构有标准算法结构、LOP算法结构、双通道算法结构。
一般的标准算法结构首先比较阶数,得到阶差,根据阶差进行尾数的移位,然后送入定点加法器进行尾数相加,规格化单元对结果进行规格化,在规格化单元里有一个前导1检测电路,可检测出尾数中第一个1的位置,后移位器根据此位置对尾数进行左移,同时减去相应的值。
LOP算法与标准算法的区别在于它采用前导1预测电路代替了前导1检测电路代替了前导1检测电路。
LOP电路可以与尾数加法并行执行,这样减少整个系统的延迟。
双通道算法的结构有两个并行的数据通道,当指数差大于1时,选择far通道,指数对阶分配较长时间,尾数运算结果规范化时的移位分配较少的时间,否则选择close通道,此时尾数最多移一位,甚至不用移位,这样可以去掉前移位器。
在以上3种算法中,一般的标准算法延迟较大,但占用资源最少;双通道算法虽然延迟较小,但占用资源最多。
在进行后续的流水线设计时,由于结构复杂,因而不利于流水线寄存器的插入和流水级数的划分,从而导致了时序速度的下降。
LOP算法的速度和面积介于两者之间。
综合比较以上三种算法以及自己知识的局限性,因此采用一般的标准算法来进行32浮点数运算加法器的设计。
3.流水线设计结构流水线处理是高速设计中的一个常用设计手段。
如果某个设计的处理流程分为若干个步骤,而且是整个数据处理是“单流向”的,即没有反馈或者是迭代运算,前一个步骤的输出是下一个步骤的输入则可以考虑采用流水线设计方法提系统的工作频率。
流水线设计的结构如图所示:其基本结构为:将适当划分的单个操作步骤单流向串联起来。
流水线操作的特点和要求是,从时间上看数据流在各个步骤的处理是连续的。
如果将每个操作步骤简化假设为通过一个D触发器,那么流水线操作就类似一个移位寄存器组,数据流依次流经D触发器,完成每个步骤的操作。
流水线时序设计如下图:流水线设计的关键在于整个设计时序的合理安排。
要求每个操作步骤的划分合理。
如果前级操作时间恰好等于后级操作时间,设计最为简单,前级的输出直接汇入后级的输入即可。
如果前级操作时间大于后级的操作时间,则需要对前级的输出数据适当缓存,才能汇入后级的输入端。
如果前级操作时间恰好小于后级的操作时间,则必须通过复制逻辑,将数据分流,或者在前级对数据采用存储、后处理方式,否则会造成后级数据溢出。
流水线的处理方式相当于复制了处理模块,所以通过这种方式设计的芯片频率较高。
在本文中32位浮点加法器的设计虽然没有采用流水线的设计结构,但是仍然从中得到了启发。
4.32位浮点加法器的Verilog设计在进行Verilog语言设计32位浮点加法器时,要先画出流程图。
在画流程图之前,要理顺32位浮点加法器的顺序步骤,在此基础上画出其程图如图:从流程图可以看出,浮点加法运算器的完成可以分成阶码和尾数两部分。
阶码只有加减运算(左右移位),而尾数则有加减乘除4种运算。
因此,浮点加法运算器主要由两个定点运算部件组成,一个是阶码运算部件来完成阶码加减,以及控制对阶时小阶的尾数右移次数和规格化时对阶码的调整;另一个是尾数运算部件来完成尾数的加减运算并判断尾数是否已规格化。
除了这两个主要的运算部件之外,还需要一个溢出电路来判断是否溢出。
根据以上的流程图和分析,可以大致画出运算电路的结构图:两个操作数的阶码部分,分别放在寄存器E1和E2中,它们与并行加法器相连可以计算E1±E2。
阶码比较是通过E1-E2来实现的,相减结果放在计数器E。
然后按E的符号来决定哪一个阶码较大,并用E来控制其中一个尾数的移位次数。
E每递减1次,相应的尾数右移一位,直到E=0为止。
一旦尾数调整完毕,就可按通常的加、减方法处理,并将其结果的阶码放入E寄存器中。
在画出浮点加法运算器的内部电路后,就可以用Verilog语言来编写程序了。
在编写的程序中使用的是同步有限状态机来实现电路的功能的。
同步有限状态机的编写在理顺了浮点加法运算的运算步骤之后,很容易可以得到电路的几个状态,以及各个状态之间相互跳并的条件。
在弄清楚各个状态之间的跳并条件之后很容易就可以画出有限状态机的状态迁移图。
通过有限状态机的迁移图,可以比较方便的写出状态机的Verilog语言描述。
再结合电路结构框图,把电路的各部分功能加以实现填充到状态机中就完成了32位浮点加法器的Verilog语言设计。
此时,可以用软件进行仿真测试,得到仿真波形如下图:图中ix,iy为数据输入信号clk为时钟信号,reset为复位信号,oz为数据输出信号,ofw为判断是否溢出的信号输出。
同步有限状态机的源代码和测试程序代码如下://同步有限状态机代码----------------------module floatadder(clk,reset,ix,iy,oz,ofw);//定义模块端口;input clk,reset;//时钟、复位信号;input[31:0]ix, iy;//输入信号;output[31:0]oz;//输出信号;output ofw; //溢出位信号;reg[31:0]oz;reg[23:0]xm,ym,zm;//定义尾数;reg[7:0]xe,ye,ze; //定义阶码reg zs;//定义输出信号符号位reg mc;//尾数相加溢出位reg[2:0] state,nextstate;//状态parameter start =3'b000,zerock=3'b001,exequal=3'b010,addm =3'b011,infifl=3'b100,zerofl=3'b101,over=3'b110;assign ofw=(state==over)?1:0;//判断溢出位//每一个时钟产生一个可能的状态变化always@(posedge clk)if(!reset)state<=start;elsestate<=nextstate;//产生下一个状态的组合逻辑always@(state)case(state)start:beginxe<=ix[30:23];xm<={1'b1,ix[22:0]};ye<=iy[30:23];ym<={1'b1,iy[22:0]};nextstate<= zerock;end//操作数检查,判断操作数是否为0;zerock:beginif(xm==0)begin{ze,zm}<={ye,ym};nextstate<=over;endelseif(ym==0)begin{ze,zm}<={xe,xm};nextstate<=over;endelsenextstate<=exequal;end//对阶操作,使阶码相等;exequal:beginif(xe==ye)nextstate<=addm;elseif(xe>ye)beginye<=ye+1; //阶码左移,阶码加1;ym<={1'b0,ym[23:1]};if(ym==0)beginzm<=xm;ze<=xe;zs<=ix[31];oz<={zs,xe,zm[23:1]};nextstate<=over;endelsenextstate<=exequal;endelsebeginxe<=xe+1; //阶码左移,阶码加1;xm<={1'b0,xm[23:1]};if(xm==0)beginzm<=ym;ze<=ye;zs<=iy[31];oz<={zs,ze,zm[23:1]};nextstate<=over;endelsenextstate<=exequal;endend//尾数求和运算;addm:beginze<=xe;if(iy[31]){mc,zm}<=xm+(~ym);else{mc,zm}<=xm+ym;if(zm==24'b0)nextstate<=over;elsenextstate<=infifl;end//结果规格化操作;infifl:beginif(mc)beginzm<={mc,zm[23:1]};ze<=ze+1;zs<=ix[31];oz<={zs,ze,zm[22:0]};if(ze==8'b1111_1111) //溢出nextstate<=over;elsenextstate<=zerofl;endelsenextstate<=zerofl;end//结果做舍入处理;zerofl:beginif(zm[23]==1'b1)beginzm<={1'b0,zm[23:1]};// << 向左移位;ze<=ze-1;zs<=ix[31];oz<={zs,ze,zm[22:0]};nextstate<=zerofl;endelseif(zm[23:22]==2'b0)beginzm<={zm[22:0],1'b0}; // >> 向右移位;ze<=ze+1;zs<=ix[31];oz={zs,ze,zm[22:0]};if(ze==8'b1111_1111)nextstate<=over;elsenextstate<=zerofl;endelsenextstate<=over;endover:beginenddefault:state<=start;endcaseendmodule参考文献:[1]崔云娟.基于FPGA浮点运算器的设计及其在雷达中的应用[D].西安:西安电子科技大学,2007:18-21.[2]吉伟,黄巾,杨靓,黄士坦.基于FPGA的32位浮点加法器的设计[J].微电子学与计算机,2008,25(6):209-211.[3]杨靓,徐伟,黄士坦.FPGA上浮点加/减法器的设计[J].计算机工程与应用,2003,2(24) ,39-41.。