基于FPGA的单精度浮点除法器的设计本科生毕业论文.docx
《基于FPGA的单精度浮点除法器的设计本科生毕业论文.docx》由会员分享,可在线阅读,更多相关《基于FPGA的单精度浮点除法器的设计本科生毕业论文.docx(32页珍藏版)》请在冰豆网上搜索。
基于FPGA的单精度浮点除法器的设计本科生毕业论文
学科分类号
本科生毕业论文(设计)
题目(中文):
基于FPGA的单精度浮点除法器的设计
(英文)FPGA-basedsingle-precisionfloating-pointdividerdesign
毕业设计(论文)原创性声明和使用授权说明
原创性声明
本人郑重承诺:
所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。
尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。
对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。
作者签名:
日 期:
指导教师签名:
日 期:
使用授权说明
本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:
按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。
作者签名:
日 期:
怀化学院本科毕业论文(设计)诚信声明
作者郑重声明:
所呈交的本科毕业论文(设计),是在指导老师的指导下,独立进行研究所取得的成果,成果不存在知识产权争议。
除文中已经注明引用的内容外,论文不含任何其他个人或集体已经发表或撰写过的成果。
对论文的研究做出重要贡献的个人和集体均已在文中以明确的方式标明。
本声明的法律结果由作者承担。
本科毕业论文(设计)作者签名:
年月日
基于FPGA的单精度浮点除法器的设计
摘要
基于FPGA的浮点除法器的硬件实现方法,根据除法的本质是移位相减的原理,及浮点数规格化的要求,在浮点乘法器的基础上,采用模块化设计方法分别对各模块进行设计。
目前,多数FPGA上可以实现整数和标准逻辑矢量的运算,但不支持浮点乘法运算,因此使得FPGA在数值计算,数据分析等方面受到很大的限制。
采用VHDL语言,在FPGA上实现了32位单精度浮点除法器的设计,在QuartusⅡ上进行综合仿真测试后,证明该模块运算准确、快速、精度高达到了预期的效果。
关键词
FPGA;单精度;浮点数;除法器;仿真
FPGA-basedsingle-precisionfloating-pointdividerdesign
Abstract
FPGA-basedfloatingpointdividerimplementationmethod.Accordingtothenatureofdivisionbytheprincipleofphaseshift,andtherequirementsofnormalizedfloating-pointnumbers,onthebasisoffloating-pointmultiplier,modulardesignofthemodulesweredesigned.Atpresent,onmostFPGAmayrealizetheintegerandthestandardlogicalvectoroperation,butdoesnotsupportthefloatingpointoperation,decidethatFPGAinthenumericalcalculus,dataanalysisetcislimited.
UsingtheVHDL,32singleprecisionfloatingpointdividerhasbeenrealizedonFPGA,TestandsimulationuseQuartusⅡ.Itprovesthatthismodulecanoperateaccurately,high-speedandapplyinotherfields.
Keywords
FPGA;singleprecision;floatingpointnumbers;divider;simulation
前言
FPGA(FieldProgrammableGateArray现场可编程门阵列)是近几年来微电子工业中发展最快的技术之一。
面对掩膜制造成本呈倍数攀升,过去许多中、小用量的芯片无法用先进的工艺来生产,对此不是持续使用旧工艺来生产,就是必须改用FPGA芯片来生产,FPGA一词于1984年就已经出现,至今已经超过20年以上的时间,不过过去十多年时间内FPGA都未受到太多的重视,原因是FPGA的功耗用电、电路密度、频率效能、电路成本等都不如ASIC,在这十多年时间内,FPGA多半只用在一些特殊领域,例如芯片业者针对新产品测试市场反应,即便初期产品未达量产规模,也能先以FPGA制成产品测试。
随着现代通信的发展,FPGA也正在高速发展,由于它具有现场可编程的特点,所以利用FPGA可以提高产品的设计速度,可以立刻检验设计的真确性而无需承担任何风险,从而降低了新产品的开发成本,缩短产品的设计周期。
从原则上讲,采用FPGA可实现所有的数字运算与控制,如逻辑控制、时序控制、数学运算、数字信号处理等。
现在FPGA已经成为多种数字信号处理(DSP)应用的强有力解决方案,其可编程解决方案可以更好地适应快速变化的标准、协议和性能的需求。
并且FPGA相对于高端DSP处理器,具有集成优势和更低的系统成本。
更为重要的是利用FPGA设计的浮点数乘法器、除法器以及加/减法器等模块具有很好的移植性,可以根据需要嵌入到不同的设计中,并且根据系统的要求自行定义内部运算的浮点数格式以达到运算精度与资源占用之间的平衡。
该毕业设计的基于FPGA的单精度浮点数除法器最终采用VHDL语言编写,通过参数打包可以方便的改变浮点数的结构。
实践证明,本毕业设计的基于FPGA的单精度浮点数除法器运结果稳定正常,资源占用较少具有很强的移植性。
1软件开发系统AlteraQuartusⅡ简介
QuartusII是Altera公司的综合性PLD开发软件,支持原理图、VHDL、VerilogHDL以及AHDL(AlteraHardwareDescriptionLanguage)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。
QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。
具有运行速度快,界面统一,功能集中,易学易用等特点。
QuartusII支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。
对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。
QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统(SOPC)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。
2FPGA设计方法简述
用FPGA进行数字电路的设计,主要有以下方法:
2.1原理图输入的设计方法
在EDA技术发展的早期,原理图输入时主要的也是最传统的方法,它的优点是整个电路系统比较直观,设计者对各个逻辑器件之间的连线比较清楚,但是用原理图的输入的设计方法有以下的缺点:
(1)当设计的规模比较大、电路比较复杂的时候,原理图输入的设计方法就显得比较繁琐,设计的效率低。
(2)设计的过程与具体的工艺有关。
2.2硬件描述语言
为了把待设计系统的逻辑功能、实现该功能的算法、选用的电路结构和逻辑模块,以及系统的各种非逻辑的约束输入计算机,就必须有相应的描述工具。
硬件描述语言(HardwareDescriptionLanguage,HDL)便应运而生。
硬件描述语言能够实现从抽象的行为和功能描述到具体的门级电路描述,并且硬件描述与工艺的实现无关。
因此,电路设计者只要用HDL语言描述自己的系统,然后用EDA工具进行综合和仿真,就能实现自己的设计。
现在用得最广泛的硬件描述语言主要有:
VHDL和VerilogHDL.它们都已经成为IEEE标准,这两种HDL语言各有自己的特色,一般来说,VHDL在系统的设计方面要比VerilogHDL好,但是VHDL的学习比较麻烦,不利于初学者学习,而VerilogHDL在门级电路设计方面比VHDL强很多,并且由于VerilogHDL与C语言很相似,因此,对具有C语言编程基础的学习者,可以迅速地掌握和运用VerilogHDL语言进行电路设计。
本设计采用VHDL语言进行电路设计。
3 浮点数的表示
根据IEEE标准,单精浮点数的格式如图3.1所示。
图中“1”、“8”、“23”分别表示该部分所占位数。
1
8
23
SEM
图3.1 浮点数格式示意图
通常表示如下
.
其中,S表示符号,‘0’表示正数,‘1’表示负数;M是尾数,E是阶码。
R称作“阶的基数”,等于2。
通常阶码E表示范围为0~255,这里将其减去偏移量
使其表示范围为-128~127,其中为阶码长度。
尾数M表示整数部分为‘1’的小数二进制数,即1.XXX…X。
而在浮点数标准格式中,整数部分的‘1’是被省去的,也就是说
.
故数A除以数B可表示为
(1)
4浮点除法器设计思路
4.1浮点数除法器的实现
由式
(1)可以看出,除法器运算可以分为三个部分,即阶码运算,尾数运算以及符号运算。
4.2 尾数部分除法运算模块设计
尾数部分除法运算需要将数据规格化后的尾数补1并相除。
在QuartusII中自带有的除法运算的兆模块lpm_division。
lpm_div_24是在QuartusII中生成的25位的除法器。
然而,该除法运算模块是将输入数据相除并把结果以商与余数的形式输出,而在浮点数位数除法运算中需要得到整数位为1位,小数为23位的输出结果。
根据浮点数规格化形式以及二进制除法运算原理,发现可以将余数循环移位反馈,并把每次余数循环运算所得到的商截位重组便可得到所需的结果。
浮点数除法器尾数运算部分结构图如4.1所示。
数据A的尾数作为被除数输入给storage1模块,storage1模块通过控制信号将被除数输入给除法模块,而除数B的尾数则直接输入给除法模块。
将运算结果中的商截位并按位存储至storage模块中,
图4.1浮点数除法器尾数部分结构框图
同时将余数反馈到storage1模块,在storage1模块中进行移位并再次传递至除法模块。
如此循环运算并得到最终结果。
4.3 浮点数除法器结构
根据规格化要求,阶码经减法器lmp_sub_8相减后必须加偏移量“01111111”。
而我们在实现时利用改变偏移量常数,同时配合加法
图4.2尾数部分除法运算模块图
器进位位的运用完成尾数部分除法运算输出结果规格的化判断与实现。
如果输出的商首位为‘1’则通过向加法器lmp_add_c输出进位位cin实现阶码加‘1’;如果首位为‘0’则阶码不变,尾数左移一位。
符号位进行异或运算后,DAT_COM按照浮点数格式组合并输出32位除法运算结果DATA_out。
浮点数除法器结构图。
4.4 浮点数除法器的改进
利用QuartusII中自带有的除法运算的兆模块可以使设计的可靠性提高,但其资源占用较大,综合后的浮点数除法器占用299个逻辑单元。
通过分析我们发现,由于浮点数尾数的特殊性,可以大大简化尾数除法模块。
改进的除法模块将输入的两数据进行比较,数据A大于数据B则输出‘1’,反之则输出‘0’。
将输出的‘1’或‘0’按位存储在storage模块中,组合得到除法运算结果。
在对输入数据比较后选择性的进行减法运算,得出的结果作为余数移位并存储到storage1模块中。
然后storage1将余数输出,再与被除数同时为除法模块提供数据输入做循环运算。
经过改进后,顶层浮点数除法运算模块的资源占用减少到125个逻辑单元,节省了58%的资源。
图4.3除法器仿真波形图
(1)符号位相减只需取Sa和Sb的异或,因为同号,则相除输出为正,异号相除输出为负,故输出数据的符号位为Sa和Sb的异或关系
(2)指数位相减。
即输出的单精度浮点数的指数为,为dataa和datab的指数位之差。
由于单精度浮点数采用的是偏移码,故,ea-eb时应先对Ea和Eb先减去127,再相减;相减完成由于要变成规范的单精度浮点进行输出,故需要再加一个127变成偏移码;
(3)尾数相乘即ma/mb。
由于
,
,其中
和
为23位的二进制数,而最高位1为隐藏位,因此两者相除后的应该为24位(23DOWNTO0)的二进制数.所以先把ma和mb的最高位拼接上‘1’得到24位的数据,再调用QuartusII库里面的24位除法器,得到24位的商和24位的余数,把商截位并按位存储,把余数反馈循环移位做为被除数。
最后取商的高23位为结果的M位即可。
(4)尾数规格化,需要把尾数相乘的48位结果数据变成24位的数据,分3步进行:
①两者相乘后的应该为48位(47DOWNTO0)的二进制数,且最高两位只有三种情况,即为01,10,11,这可以从十进制来理解,1.XXX…X与1.YYY…Y相乘,结果最大也就是3.ZZZ…Z,即整数位为1、2、3均有可能。
由于最终输出要规范成单精度浮点数,故,当输出的48位二进制最高两位为01时,显然结果已经是一个规范的单精度浮点数的形式了,只需用要取48位数据的(45DOWNTO23)作为输出即可;当输出的48位二进制最高两位为10或11时,显然由于整数位已经超过1,故应向阶码进1,进1以后,尾数部分相应应除以2,即应取48位数据的(46DOWNTO24)作为尾数的输出结果。
②对尾数进行舍入操作,使尾数为24位,包括整数的隐藏位。
③把结果数据处理为32位符合IEEE浮点数标准的,包括1位符号位,8位结果阶码位,结果23尾数位。
5总体设计编译与仿真
清楚了单精度浮点数的乘法、除法运算规则以后,下面将利用VHDL语言给予描述和仿真。
并最终通过下载到FPGA芯片上进行实现。
根据其运算规则可知,应该将输入的dataa和datab进行分段,分解成符号位,阶码和尾数三段。
并对它们分别进行各自的运算处理。
其实现电路总体设计数据流程图如下:
其中包括几个部分,
图5.1总体流程图
5.1数据分解部分:
spf32_data_div.vhd模块
其主要作用为,对输入的32位单精度浮点数进行分解成1位符号位,8位阶码位及23位的尾数位进行输出。
由于有两路数据输入,因此,要用到两片数据分离模块。
图5.2数据分解模块
设计文件如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYspf32_data_divIS
PORT(spfin:
INSTD_LOGIC_VECTOR(31DOWNTO0);
s:
OUTSTD_LOGIC;
e:
OUTSTD_LOGIC_VECTOR(7DOWNTO0);
m:
OUTSTD_LOGIC_VECTOR(22DOWNTO0)
);
ENDspf32_data_div;
ARCHITECTUREbehavOFspf32_data_divIS
BEGIN
PROCESS(spfin)
BEGIN
s<=spfin(31);
e<=spfin(30DOWNTO23);
m<=spfin(22DOWNTO0);
ENDPROCESS;
ENDbehav;
5.2阶码相减模块(E_SUB.vhd)
其主要作用为:
对输入的两个8位二进制阶码进行求差运算。
在此模块中,采用VHDL硬件描述语言编写。
根据IEEE754标准,先对输入的阶码Ea和Eb进行减127的运算,其结果再进行求差运算,再进行最后加127的运算。
图5.3阶码想减模块
程序源代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityE_SUBisport(
ea:
INSTD_LOGIC_VECTOR(7DOWNTO0);
eb:
INSTD_LOGIC_VECTOR(7DOWNTO0);
ea_b:
OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);
ENDE_SUB;
ARCHITECTUREbehavofE_SUBis
begin
ea_b<=(ea-"01111111")-(eb-"01111111")+"01111111";
endbehav;
endbehav;
5.3尾数相除部分:
m_divider.vhd模块
其主要作用为:
对输入的两个23位的尾数进行规范化,即在其前面均加一个“1”变成24位的二进制数。
然后元件例化一个现成的除法器模块进行运算。
其设置为两路输出数据宽度为24,结果输出宽度为24。
图5.4尾数相处模块
程序源代码如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
LIBRARYlpm;
USElpm.lpm_components.ALL;
ENTITYm_dividerIS
PORT(ma:
INSTD_LOGIC_VECTOR(22DOWNTO0);
mb:
INSTD_LOGIC_VECTOR(22DOWNTO0);
m:
OUTSTD_LOGIC_VECTOR(23DOWNTO0);
yushu:
OUTSTD_LOGIC_VECTOR(23DOWNTO0)
);
ENDm_divider;
ARCHITECTUREbehavOFm_dividerIS
SIGNALsma,smb:
STD_LOGIC_VECTOR(23DOWNTO0);
BEGIN
sma<='1'&ma;
smb<='1'&mb;
mul:
lpm_divide
GENERICMAP(LPM_WIDTHD=>24,LPM_WIDTHN=>24,
lpm_drepresentation=>"UNSIGNED")
PORTMAP(numer=>sma,denom=>smb,quotient=>m,remain=>yushu);
ENDbehav;
5.4特殊数据判断电路:
spcd_judge.vhd模块
其主要作用:
当输入数据为无穷、零或NaN时,不需进行计算,直接输出结果。
当然它们的输出作为adj_out的输入,通过adj_out来控制输出。
(模块程序见附录)
图5.5特殊数据判断电路模块
5.5数据调整输出部分:
adj_out.vhd模块
其主要作用为:
对前面已经得到符号位,阶码及尾数进行调整并规范化成单精度浮点数进行输出。
此模块完成的调整如下:
判断输入的尾数最高位的取值。
若为‘0’,则此时,直接将所得的符号位、阶码及尾数运算结果的(23DOWNTO1)合并成32位的数据输出;若为‘1’,则要将尾数取(22DOWNTO0)作为尾数的输出,并要将阶码加1。
因此在此模块中也例化了一个加法器进行加“1”运算。
(模块程序见附录)
图5.6数据调整输出模块
以上各个模块设计完成以后,在顶层文件中对它们进行调用,并完成整个浮点除法器的运算单元。
如下图所示
图5.7结构图
5.6仿真
最后的数据仿真波形图如下:
(1)两个正数相除
图5.8仿真图
二进制数:
被除数=010*********
除数=010*********
结果:
RESULTS:
010*********
转化成十进制:
data_a=1.25*4=5
data_b=1.0*2=2
RESULTS=1.25*2=2.5
(2)两个负数相除
图5.9仿真图
data_a=110000*********0000000000000000
data_b=110000*********00000000000000000
=010*********
转换成十进制:
data_a=-1.75*64=-112
data_b=-1.75*2=-3.5
RESULTS=1.0*32=32
笔算结果:
(-112)/(-3.5)=32
(3)一个正数除以一个负数
图5.10仿真图
=010*********
data_b=1100000000001000000000000000000000
RESULTS=11000000100010000000000000000000
笔算结果-26/2.125=-12.235
转换成十进制
data_a=-1.625*16=-26
data_b=1.0625*2=2.125
RESULTS=-1.53125*8=-12.25
图中,data_a为32位的输入被除数,data_b为32输入除数,RESULTS为32位输出结果。
通过对以上多组数据分析、验证得出,本设计是正确的,基本上达到了单精度浮点除法运算的要求。
6结论:
本次毕业设计对我来说比较有难度,经过指导老师的指导和我自身的努力,我的毕业设计终于完成。
在这次毕业设计中我获益不少,从理论方面来说,我进一步掌握了数字系统设计这门课程的中有关VHDL语言的编写,通过查找资料,我接触了一些乘法器、除法器的基本知识,熟知除法器是在乘法器的基础上加以修改,并认识到除法器有不同的分类。
在实践方面,我掌握了VHDL语言的编写方法,并熟悉操作QuartusⅡ5.1这个仿真软件。
这对我在今后的学习和科研都将是一笔宝贵的财富。
在理论知识和熟悉应用软件的基础上,我完成了单精度浮点除法器的设计和仿真,实现了浮点除法器的功能且进行了验证,从而方便嵌入到其他设计中,实践证明收到了良好的效果。
总的来讲,本次设计基本上成功了,在探索如何完成本次设计中,我学到很多东西,同时也发现自己欠缺了很多东西了,理论知识不可少,实践更重要。
他提醒着我,在今后的学习中,要不断的自我完善,提高自己的理论知识和实践能力。
参考文献
[1]刘杰.高速整数除法器的实现及仿真[J].福建电脑2007年第10期.
[2]甘子平,韩应征,张立毅,鲁峰.浮点数除法器的