毕业设计(论文)-基于FPGA的单精度浮点除法器的设计.doc_第1页
毕业设计(论文)-基于FPGA的单精度浮点除法器的设计.doc_第2页
毕业设计(论文)-基于FPGA的单精度浮点除法器的设计.doc_第3页
毕业设计(论文)-基于FPGA的单精度浮点除法器的设计.doc_第4页
毕业设计(论文)-基于FPGA的单精度浮点除法器的设计.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

学科分类号 本科生毕业论文(设计)题目(中文): 基于fpga的单精度浮点除法器的设计 (英文)fpga-based single-precision floating-point divider design 学生姓名: 学号: 系别: 专业: 指导教师: 起止日期: 年 月 日怀化学院本科毕业论文(设计)诚信声明作者郑重声明:所呈交的本科毕业论文(设计),是在指导老师的指导下,独立进行研究所取得的成果,成果不存在知识产权争议。除文中已经注明引用的内容外,论文不含任何其他个人或集体已经发表或撰写过的成果。对论文的研究做出重要贡献的个人和集体均已在文中以明确的方式标明。本声明的法律结果由作者承担。本科毕业论文(设计)作者签名:年 月 日目 录摘 要1关键词1abstract1key words1前言21 软件开发系统altera quartus简介32 fpga 设计方法简述42.1 原理图输入的设计方法42.2 硬件描述语言43 浮点数的表示54 浮点除法器设计思路54.1 浮点数除法器的实现54.2尾数部分除法运算模块设计64.3浮点数除法器结构64.4浮点数除法器的改进75 总体设计编译与仿真95.1 数据分解部分:spf32_data_div.vhd模块105.2 阶码相减模块(e_sub.vhd)115.3 尾数相除部分:m_divider.vhd模块125.4 特殊数据判断电路:spcd_judge.vhd模块145.5 数据调整输出部分:adj_out.vhd模块145.6 仿真156 结论:18参考文献18致 谢20附录 相关模块程序21基于fpga的单精度浮点除法器的设计摘 要基于fpga的浮点除法器的硬件实现方法,根据除法的本质是移位相减的原理,及浮点数规格化的要求,在浮点乘法器的基础上,采用模块化设计方法分别对各模块进行设计。目前,多数fpga上可以实现整数和标准逻辑矢量的运算,但不支持浮点乘法运算,因此使得fpga在数值计算,数据分析等方面受到很大的限制。采用vhdl语言,在fpga上实现了32位单精度浮点除法器的设计,在quartus上进行综合仿真测试后,证明该模块运算准确、快速、精度高达到了预期的效果。关键词fpga; 单精度;浮点数; 除法器;仿真fpga-based single-precision floating-point divider designabstractfpga-based floating point divider implementation method. according to the nature of division by the principle of phase shift, and the requirements of normalized floating-point numbers, on the basis of floating-point multiplier, modular design of the modules were designed. at present, on most fpga may realize the integer and the standard logical vector operation, but does not support the floating point operation, decide that fpga in the numerical calculus, data analysis etc is limited.using the vhdl, 32 single precision floating point divider has been realized on fpga, test and simulation use quartus. it proves that this module can operate accurately, high-speed and apply in other fields. key wordsfpga; single precision; floating point numbers; divider; simulation前言fpga(field programmable gate array现场可编程门阵列)是近几年来微电子工业中发展最快的技术之一。面对掩膜制造成本呈倍数攀升,过去许多中、小用量的芯片无法用先进的工艺来生产,对此不是持续使用旧工艺来生产,就是必须改用fpga芯片来生产, fpga一词于1984年就已经出现,至今已经超过20年以上的时间,不过过去十多年时间内fpga都未受到太多的重视,原因是fpga的功耗用电、电路密度、频率效能、电路成本等都不如asic,在这十多年时间内,fpga多半只用在一些特殊领域,例如芯片业者针对新产品测试市场反应,即便初期产品未达量产规模,也能先以fpga制成产品测试。随着现代通信的发展, fpga也正在高速发展,由于它具有现场可编程的特点,所以利用fpga可以提高产品的设计速度,可以立刻检验设计的真确性而无需承担任何风险,从而降低了新产品的开发成本,缩短产品的设计周期。从原则上讲,采用fpga可实现所有的数字运算与控制,如逻辑控制、时序控制、数学运算、数字信号处理等。现在fpga已经成为多种数字信号处理(dsp)应用的强有力解决方案,其可编程解决方案可以更好地适应快速变化的标准、协议和性能的需求。并且fpga相对于高端dsp处理器,具有集成优势和更低的系统成本。更为重要的是利用fpga设计的浮点数乘法器、除法器以及加/减法器等模块具有很好的移植性,可以根据需要嵌入到不同的设计中,并且根据系统的要求自行定义内部运算的浮点数格式以达到运算精度与资源占用之间的平衡。该毕业设计的基于fpga的单精度浮点数除法器最终采用vhdl语言编写,通过参数打包可以方便的改变浮点数的结构。实践证明,本毕业设计的基于fpga的单精度浮点数除法器运结果稳定正常,资源占用较少具有很强的移植性。1 软件开发系统altera quartus简介 quartus ii 是altera公司的综合性pld开发软件,支持原理图、vhdl、veriloghdl以及ahdl(altera hardware description language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整pld设计流程。quartus ii可以在xp、linux以及unix上使用,除了可以使用tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。quartus ii支持altera的ip核,包含了lpm/megafunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方eda工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放eda工具。 quartus ii 通过和dsp builder工具与matlab/simulink相结合,可以方便地实现各种dsp应用系统;支持altera的片上可编程系统(sopc)开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。2 fpga 设计方法简述用fpga进行数字电路的设计,主要有以下方法:2.1 原理图输入的设计方法 在eda技术发展的早期,原理图输入时主要的也是最传统的方法,它的优点是整个电路系统比较直观,设计者对各个逻辑器件之间的连线比较清楚,但是用原理图的输入的设计方法有以下的缺点: (1)当设计的规模比较大、电路比较复杂的时候,原理图输入的设计方法就显得比较繁琐,设计的效率低。 (2)设计的过程与具体的工艺有关。2.2 硬件描述语言为了把待设计系统的逻辑功能、实现该功能的算法、选用的电路结构和逻辑模块,以及系统的各种非逻辑的约束输入计算机,就必须有相应的描述工具。硬件描述语言(hardware description language, hdl)便应运而生。硬件描述语言能够实现从抽象的行为和功能描述到具体的门级电路描述,并且硬件描述与工艺的实现无关。因此,电路设计者只要用hdl语言描述自己的系统,然后用eda工具进行综合和仿真,就能实现自己的设计。现在用得最广泛的硬件描述语言主要有:vhdl和verilog hdl.它们都已经成为ieee标准,这两种hdl语言各有自己的特色,一般来说,vhdl在系统的设计方面要比verilog hdl好,但是vhdl的学习比较麻烦,不利于初学者学习,而verilog hdl在门级电路设计方面比vhdl强很多,并且由于verilog hdl与c语言很相似,因此,对具有c语言编程基础的学习者,可以迅速地掌握和运用verilog hdl语言进行电路设计。本设计采用vhdl语言进行电路设计。3 浮点数的表示根据ieee标准,单精浮点数的格式如图3.1所示。图中“1”、“8”、“23”分别表示该部分所占位数。1823s e m图3.1浮点数格式示意图通常表示如下.其中,s表示符号,0表示正数,1表示负数;m是尾数,e是阶码。r称作“阶的基数”,等于2。通常阶码e表示范围为0255,这里将其减去偏移量使其表示范围为-128127,其中为阶码长度。尾数m表示整数部分为1的小数二进制数,即1.xxxx。而在浮点数标准格式中,整数部分的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位(23 downto 0)的二进制数.所以先把ma和mb的最高位拼接上1得到24位的数据,再调用quartusii 库里面的24位除法器,得到24位的商和24位的余数,把商截位并按位存储,把余数反馈循环移位做为被除数。最后取商的高23位为结果的m位即可。(4) 尾数规格化,需要把尾数相乘的48位结果数据变成24位的数据,分3步进行:两者相乘后的应该为48位(47 downto 0)的二进制数,且最高两位只有三种情况,即为01,10,11,这可以从十进制来理解,1.xxxx与1.yyyy相乘,结果最大也就是3.zzzz,即整数位为1、2、3均有可能。由于最终输出要规范成单精度浮点数,故,当输出的48位二进制最高两位为01时,显然结果已经是一个规范的单精度浮点数的形式了,只需用要取48位数据的(45 downto 23)作为输出即可;当输出的48位二进制最高两位为10或11时,显然由于整数位已经超过1,故应向阶码进1,进1以后,尾数部分相应应除以2,即应取48位数据的(46 downto 24)作为尾数的输出结果。对尾数进行舍入操作,使尾数为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 数据分解模块设计文件如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity spf32_data_div is port(spfin : in std_logic_vector(31 downto 0); s :out std_logic; e :out std_logic_vector(7 downto 0); m :out std_logic_vector(22 downto 0) );end spf32_data_div;architecture behav of spf32_data_div is beginprocess(spfin) begin s=spfin(31); e=spfin(30 downto 23); m=spfin(22 downto 0);end process;end behav;5.2 阶码相减模块(e_sub.vhd)其主要作用为:对输入的两个8位二进制阶码进行求差运算。在此模块中,采用vhdl硬件描述语言编写。根据ieee754标准,先对输入的阶码ea和eb进行减127的运算,其结果再进行求差运算,再进行最后加127的运算。图5.3 阶码想减模块程序源代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity e_sub is port( ea:in std_logic_vector(7 downto 0); eb:in std_logic_vector(7 downto 0); ea_b:out std_logic_vector(7 downto 0) );end e_sub;architecture behav of e_sub is begin ea_b=(ea-01111111)-(eb-01111111)+01111111; end behav;end behav;5.3 尾数相除部分:m_divider.vhd模块其主要作用为:对输入的两个23位的尾数进行规范化,即在其前面均加一个“1”变成24位的二进制数。然后元件例化一个现成的除法器模块进行运算。其设置为两路输出数据宽度为24,结果输出宽度为24。 图5.4 尾数相处模块程序源代码如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;library lpm;use lpm.lpm_components.all;entity m_divider is port(ma : in std_logic_vector(22 downto 0); mb : in std_logic_vector(22 downto 0); m :out std_logic_vector(23 downto 0); yushu :out std_logic_vector(23 downto 0) );end m_divider;architecture behav of m_divider is signal sma,smb:std_logic_vector(23 downto 0); begin sma=1&ma; smb24,lpm_widthn=24,lpm_drepresentation = unsigned) port map(numer=sma,denom=smb,quotient=m,remain=yushu);end behav;5.4 特殊数据判断电路:spcd_judge.vhd模块其主要作用:当输入数据为无穷、零或nan时,不需进行计算,直接输出结果。当然它们的输出作为adj_out的输入,通过adj_out来控制输出。(模块程序见附录)图5.5 特殊数据判断电路模块5.5 数据调整输出部分:adj_out.vhd模块 其主要作用为:对前面已经得到符号位,阶码及尾数进行调整并规范化成单精度浮点数进行输出。此模块完成的调整如下:判断输入的尾数最高位的取值。若为0,则此时,直接将所得的符号位、阶码及尾数运算结果的(23 downto 1)合并成32位的数据输出;若为1,则要将尾数取(22 downto 0)作为尾数的输出,并要将阶码加1。因此在此模块中也例化了一个加法器进行加“1”运算。(模块程序见附录)图5.6 数据调整输出模块以上各个模块设计完成以后,在顶层文件中对它们进行调用,并完成整个浮点除法器的运算单元。如下图所示 图5.7 结构图5.6 仿真最后的数据仿真波形图如下:(1)两个正数相除图5.8 仿真图二进制数: 被除数:data_a=01000000010100000000000000000000 除数 : data_b=01000000000000000000000000000000 结果:results: 01000000010000000000000000000000转化成十进制: data_a=1.25*4=5 data_b=1.0*2=2 results=1.25*2=2.5(2) 两个负数相除图5.9 仿真图data_a=1100001011100000000000000000000data_b=11000000111000000000000000000000results=01000001100000000000000000000000转换成十进制:data_a=-1.75*64=-112data_b=-1.75*2=-3.5results=1.0*32=32笔算结果:(-112)/(-3.5)=32(3)一个正数除以一个负数图5.10 仿真图data_a=0100000111010000000000000000000000data_b=1100000000001000000000000000000000results=11000000100010000000000000000000笔算结果-26/2.125=-12.235转换成十进制data_a=-1.625*16=-26data_b=1.0625*2=2.125results=-1.53125*8=-12.25 图中,data_a为32位的输入被除数,data_b为32输入除数,results为32位输出结果。通过对以上多组数据分析、验证得出,本设计是正确的,基本上达到了单精度浮点除法运算的要求。6 结论: 本次毕业设计对我来说比较有难度,经过指导老师的指导和我自身的努力,我的毕业设计终于完成。在这次毕业设计中我获益不少,从理论方面来说,我进一步掌握了数字系统设计这门课程的中有关vhdl语言的编写,通过查找资料,我接触了一些乘法器、除法器的基本知识,熟知除法器是在乘法器的基础上加以修改,并认识到除法器有不同的分类。在实践方面,我掌握了vhdl语言的编写方法,并熟悉操作quartus5.1这个仿真软件。这对我在今后的学习和科研都将是一笔宝贵的财富。在理论知识和熟悉应用软件的基础上,我完成了单精度浮点除法器的设计和仿真,实现了浮点除法器的功能且进行了验证,从而方便嵌入到其他设计中,实践证明收到了良好的效果。 总的来讲,本次设计基本上成功了,在探索如何完成本次设计中,我学到很多东西,同时也发现自己欠缺了很多东西了,理论知识不可少,实践更重要。他提醒着我,在今后的学习中,要不断的自我完善,提高自己的理论知识和实践能力。参考文献1刘杰.高速整数除法器的实现及仿真j.福建电脑2007年第10期.2甘子平,韩应征,张立毅,鲁峰.浮点数除法器的fpga实现j.太原理工大学学报,2008.3胡修林,杨志专,张蕴玉.基于 fpga 的快速除法算法设计与实现j.自动化技术与应用,2006.4朱建银,沈海斌.高性能单精度除法器的实现m.浙江大学,微电子学与计算机,2007.5朱卫华,郑留平.可任意设定计算精度的整数除法器的vhdl 设计理论与方法m.2008.6王飞.在fpga中实现高精度快速除法m.经验交流,2003.7夏泽中,柴庆芬.循环冗余校验码算法的分析及vhdl 语言实现m.计算机与数字工程,第33 卷2004.8栗素娟,阎保定,朱清智.基于fpga的快速浮点除法器ip核的实现m.河南科技大学电子信息工程学院.2008.9陈玉丹,齐京礼,陈建泗.基于vhdl的8位除法器的实现m.微计算机信息,2006.10潘明,许勇.基于加减交替法除法器的fpga设计与实现j.桂林电子科技大学,pld/cpld/fpga应用.2009.11郝建新,谢剑斌.用fpga实现先行进位单元阵列除法器m.国防科技大学电子技术系,第19卷第1期,1997.12孙亮,周忠海,廉月仙,刘军礼.阵列除法器的fpga实现m.中国海洋大学, 2008.致 谢经过半年的忙碌和工作,我的毕业设计终于完成,作为一个本科生的毕业设计,由于经验的匮乏,难免有许多考虑不周全的地方,如果没有指导老师的督促和指导,相信这个设计是很难完成的。这次毕业设计对我的压力比较大,但总的来说是成功的。在实践中我的见识、知识和经验都长进了不少。首先,要感谢我的指导老师左伟华老师,是他在一开始就帮助我定下了明确的设计思路;在整个设计过程中我遇到许多问题,也是他不断的给予我鼓励和悉心教导。在毕业设计的后期,又对我的论文作了认真的校审。然后,要感谢大学四年来所有的老师,为我们打下电子信息科学与技术方面的专业基础。同时要感谢在我身边关心着我的同学们,谢谢你们对我的关心、鼓励和支持。最后要感谢我的母校四年来对我的栽培和教育。附录 相关模块程序特殊数据判断电路模块程序如下:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity spcd_judge is port(dataa : in std_logic_vector(31 downto 0); datab : in std_logic_vector(31 downto 0); is_spd:out std_logic; spd_typ:out std_logic_vector(1 downto 0) );end spcd_judge;architecture behav of spcd_judge is signal ais_spd,bis_spd:std_logic; signal aspd_typ,bspd_typ:std_logic_vector(1 downto 0); begin process(dataa) begin if(dataa(30 downto 0)=0000000000000000000000000000000) then ais_spd=1; aspd_typ=00; -dataa=0 elsif(dataa(30 downto 23)=11111111 and dataa(22 downto 0)=00000000000000000000000) then ais_spd=1; aspd_typ=01; -dataa= elsif(dataa(30 downto 23)=11111111 and dataa(22 downto 0)/=00000000000000000000000) then ais_spd=1; aspd_typ=10; -dataa=nan(not a number) else ais_spd=0; aspd_typ=11; -dataa is not special data; end if; end process; process(datab) begin if(datab(30 downto 0)=0000000000000000000000000000000) then bis_spd=1; bspd_typ=00; -datab=0 elsif(datab(30 downto 23)=11111111 and datab(22 downto 0)=00000000000000000000000) then bis_spd=1; bspd_typ=01; -datab= elsif(datab(30 downto 23)=11111111 and datab(22 downto 0)/=00000000000000000000000) then bis_spd=1; bspd_typ=10; -datab=nan(not a number) else bis_spd=0; bspd_typ=11; -datab is not special data; end if; end process; process(ais_spd,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论