FPGA除法器课程设计.docx
《FPGA除法器课程设计.docx》由会员分享,可在线阅读,更多相关《FPGA除法器课程设计.docx(30页珍藏版)》请在冰豆网上搜索。
FPGA除法器课程设计
一.背景介绍
近几十年来,数字信号处理技术作为信号与信息处理学科的一个主要研究方向,在电子学、计算机、应用数学等学科得到了广泛的应用,许多信号处理和控制需要用到除法算法。
一般的数字信号处理器中没有现成的除法指令,而是用现有的减法或乘法指令进行叠加来完成除法运算,这样其运算的复杂度和精确度就难以达到要求,这就致使一些带有除法的好的算法在信号处理中难以得到应用,严重影响了信号处理领域中的数据处理。
虽然近几十年人们花在算术运算单元的设计越来越多,努力设计高性能的运算单元,但是,为了提高性能所做的大部分努力都花在设计更快的加/减法器和乘法器上,除法器设计相对来说所作的关注较少。
在无线通信、语音通信、图像处理等领域中,往往涉及大量的数据处理,而且数据计算精度和实时性要求很高,需要很高的处理能力来提高系统的执行效率,Soerquist等人指出,在四中基本运算中,除法的执行速度最慢。
虽然除法占所有运算的比例很少,大概3%,但这并不表示除法对处理器性能的影响很小,在因为指令阻塞等待而引起的处理器性能下降的因素中,除法指令大约占到40%,因此设计一种执行效率高的除法结构具有很重要的意义。
而随着半导体技术的发展,FPGA逐渐步入人们的视野,成为系统设计的首选,本设计就是基于FPGA实现各种除法算法,那什么是FPGA?
又为什么选择FPGA呢?
FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。
它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。
以硬件描述语言(Verilog或VHDL)所完成的电路设计,可以经过简单的综合与布局,快速的烧录至FPGA上进行测试,是现代IC设计验证的技术主流。
这些可编辑元件可以被用来实现一些基本的逻辑门电路(比如AND、OR、XOR、NOT)或者更复杂一些的组合功能比如解码器或数学方程式。
在大多数的FPGA里面,这些可编辑的元件里也包含记忆元件例如触发器(Flip-flop)或者其他更加完整的记忆块。
FPGA一般来说比ASIC(专用集成电路)的速度要慢,实现同样的功能比ASIC电路面积要大。
但是他们也有很多的优点比如可以快速成品,可以被修改来改正程序中的错误和更便宜的造价。
厂商也可能会提供便宜的但是编辑能力差的FPGA。
因为这些芯片有比较差的可编辑能力,所以这些设计的开发是在普通的FPGA上完成的,然后将设计转移到一个类似于ASIC的芯片上。
另外一种方法是用CPLD(ComplexProgrammableLogicDevice,复杂可编程逻辑器件)。
主要特点:
①采用FPGA设计ASIC电路(专用集成电路),用户不需要投片生产,就能得到合用的芯片。
②FPGA可做其它全定制或半定制ASIC电路的中试样片。
③FPGA内部有丰富的触发器和I/O引脚。
④FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
⑤FPGA采用高速CMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。
用户可以根据不同的配置模式,采用不同的编程方式。
加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。
掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。
FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。
当需要修改FPGA功能时,只需换一片EPROM即可。
这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。
因此,FPGA的使用非常灵活。
1984年,Xilinx公司推出了世界上第一个FPAG芯片,其目标是将LS工/VLSI门阵列技术的高密度和通用性和现场可编程逻辑器件的设计灵活及产品的有效性结合起来。
他的特点是:
复杂互连、性能依赖于设计和较高的逻辑密度。
适于通信设备中复杂数据通路和工业控制的数据采集系统。
随着CAD开发工具功能的日渐完善以及FPGA的优良性能日益显露,FPGA己经受到广大电子科技人员的普遍重视并得到了越来越为广泛的应用。
现今,利用FPGA来进行系统集成设计己成为一种极为普遍的现象。
用FPGA来实现除法主要有以下儿几点优点:
1)FGPA非常适合于各种算术运算,包括含有大量乘、加运算的数字信号处理算法。
充分利用硬件资源,并在性能上超过其他的器件。
2)相对于单片机和DPS处理器而言,FGPA可以由设计者根据算法的内在结构设计合适的处理阵列,避免前者串行执行指令的低效。
3)相对ASCI而言,采用FPGA可避免初期巨大的开发投资,同时拥有微处理器的通用性和灵活性。
在算法修改时,短时间内就将新的算法付诸实际。
当然由于FPGA仍然属于通用器件,效率比ASIC低,但其灵活性的优势仍然可以很大程度上弥补其缺点。
因此利用FPGA完成快速除法器的算法是一种方便、快捷、最具优势的优化设计方案。
基于上述原因,利用FPGA来实现快速除法器算法这一设计思想将具有十分重要的应用价值。
二.设计要求与任务
除法器设计以下两种要求任选一种
1设计一个除法器,能在Basys2开发板上实际运行。
被除数为16位,除数为8位,被除数和除数都用按键输入,结果用数码管显示,设置一个使能开关,开关朝上拨时才进行运算。
由于数码管和按键等资源数量较少,因此可以考虑采取下面的方案实现。
LD2LD1LD0指示状态,000是起始状态,001用于输入被除数高8位,010用于输入被除数低8位,011用于输入除数(8位),100用于显示结果,101用于显示被除数和除数
btn1和btn0和数码管配合,用于改变准备输入的数据
btn2用于将数码管显示的数据输入到相应的地方,同时切换状态。
btn3的功能也是切换状态,如果用btn3切换状态,则不改变原来的数据。
sw6如果为1表示允许进行除法运算,为0则表示不允许。
因为LD2-LD0为100和101时需要显示6位16进制数,而数码管只有4个,所以用sw7进行切换。
LD2-LD0为100时,sw7为0时显示商,为1时显示余数,LD2-LD0为101时,sw7为0时显示被除数,为1时显示除数。
②设计一个除法器,能在Basys2开发板上实际运行。
被除数为16位,除数为8位,被除数和除数都用按键输入,结果用数码管显示,设置一个使能开关,开关朝上拨时才进行运算。
由于数码管和按键等资源数量较少,因此可以考虑采取下面的方案实现。
使用2个开关决定状态,例如SW1和SW0,SW1-SW0为00时用于输入被除数,通过4个按键输入4位16进制数,输入的数通过数码管显示;01时用于输入除数,通过2个按键输入2位16进制数,输入的数通过数码管显示;10时显示商;11时显示余数。
我们选择第二种方案。
三.现有的除法算法
MichaelJ.Flynn与StuartF.0berman按照硬件操作的不同将浮点数除法算法分为5大类:
数值循环法(digitrecurrence)、Newton-Raphson算法、Talyor级数展开法、高基数法(veryhighradix)、以及可变延迟法(variablelatency)等。
1.数值循环法(DigitRecurrence)
该算法的实现主要有三种方法:
恢复余数算法、不恢复余数算法以及SRT算法。
大多数除法器都是采用数值循环算法,纯数学意义的整数除法的原始表达式如下:
式(3-1)中,Z是被除数,d是除数,Q是商,R是余数。
根据整数除法的定义,余数R需要满足两个条件:
①绝对值小于除数,②与被除数同号(0除外)。
在实际的运算过程中,商Q是逐位产生的,不妨把Q与Z写成逐位相加的形式:
其中qk-1,qk-2···q0就是在运算过程中逐个产生的商位(digit),r为基数(radix)。
把式(3-2)代入式(3-1),就得到:
式(3-3)可以进一步改写为如下形式:
式(3-4)具备了循环迭代的形式,如果再设置一个中间变量W[j],那么式(3-4)又可以改写成式(3-5):
式(3-5)反映了DigitRecurrence算法的一般实现方式,我们称它为一般迭代公式,它显示了被除数通过多轮的减法运算最终得到余数,并在中间运算中逐位产生商的过程。
式中的中间变量W[j]是过程余数,它是被除数(输入)与余数(输出)之间的中间形式。
DigitRecurrence算法大体上都具有式(3-5)的形式。
对于不同的实现可以选取不同的参数,例如基数r,商位qj的取值范围等等。
这些参数不同时,循环需要的次数k也不同。
2.Newton-Raphson除法算法
牛顿迭代法是将非线性方程线性化,从而得到迭代序号的一种方法。
它的基本思想是用乘法代替除法运算,例如a/b=a×(1/b),如何计算1/b是牛顿迭代算法的核心所在。
对于方程f(X)=0,设x0为它的一个近似根,如图3-1,则函数f(x)在x0附近截断高次项可用一阶泰勒多项式展开为:
f(X)=f(x0)+f'(x0)(X-x0)(3-6)
图3-1Newton-Raphson除法算法
牛顿迭代法可以描述成求解f(X)=0,具体可以归纳成以下几个步骤:
第一步:
设函数f(X)在x0处的值是Y0,则f(x0)=Y0
第二步:
在点(x0,Y0)处做切线与X轴的交点为x1,与Y轴的交点为Y1。
第三步:
根据一阶泰勒公式有
第四步:
根据第三步公式可得
第五步:
以x1为下一次的逼近值,依次类推可得f(X)=0的解
牛顿迭代中,函数原型的的选择非常的重要,其决定着倒数结果的形式,在多种函数原型中应用最广泛的是
,在除法算法中我们所需求的商位
,等式两边同时取倒数,则有
(3-7)
3.Talyor级数展开法
将一个函数展开成泰勒级数,直接展开法可按下列步骤进行:
第一步:
求出函数的各阶导数f'(x),f'(x),···f(n)(x),···,
第二步:
求函数f(x)及其各阶导数在f(x0),f'(x0),f'(x0),···,f(n)(x0),···,
第三步:
写出泰勒级数
4.高基数法
在整数表示中,对于整数N,各个位上的数值是nm、nm-1、nm-2…n1、n0,则N可以表示成
,其中的r就是基数,我们日常用的数值都是基数为10的表示,而在计算机当中,数是用二进制的补码表示的,数字集为{0,1},因此计算机用的是基数为2的数。
基数感念用到除法算法中,我们同样用r表示基数,它是用来表征在一次除法循环过程中产生多少位商的参数,和商的位数的具体关系为n=log2r,式中n就是在一次循环过程中产生的商的位数。
例如我们常说的基-4是指在一次循环过程中产生两位二进制商值。
在高基数的除法中,每次除法循环可以得到较多位数的二进制商,但是这种一次性得到很多位商的算法是以硬件资源消耗和速度的减慢为代价的,为了把各种算法的优势和硬件资源以及速度能够有一个很好的平衡,提出了这种高基数算法,即最大程度的发挥一次循环产生较多位商的优点,又尽可能的减少硬件资源和硬件的时间延迟来提高速度。
该算法同Talyor级数展开法一样建立在乘法操作,加法操作,查找表的基础之上。
四.硬件及软件环境概述
1.XilinxFPGA的硬件基本结构
Xilinx公司生产的FPGA基本内部结构大致可以划分为六个部分:
可编程输入输出单元、基本可编程逻辑单元、完整的时钟管理、嵌入块式RAM、丰富的布线资源、内嵌的底层功能单元和专用硬件模块。
1、可编程输入输出单元(IOB)
可编程输入/输出单元简称I/O单元,是芯片与外界电路的接口电路,外部输入的信号可以通过IOB模块的存储单元输入到FPGA的内部,也可以直接输入到FPGA内部。
IOB模块不仅完成基本的I/O口功能,它通过把IOB模块划分成不同的组,能够独立的支持不同的I/O口标准。
2、基本可编程逻辑单元(CLB)
基本可编程逻辑单元是FPGA内的基本逻辑单元。
FPGA芯片由大量的CLB单元和其它的一些模块组成。
一个CLB基本单元包含一个可配置开关矩阵,此矩阵由4或6个输入、一些选型电路(多路复用器等)和触发器组成,另外每个CLB单元都会由多个相同的Slice和附加逻辑构成。
每个CLB模块都含有4个Slice模块,Slice是Xilinx公司定义的基本逻辑单元,一个Slice由两个4/6是输入的查找表、算术逻辑、进位逻辑、存储逻辑和函数发生器组成。
每一款FPGA的CLB数量和特性会根据其功能不同而有差别,但是每一个CLB模块的都可以配置用来完成组合电路、时序电路等,这就决定了FPGA强大的功能,能够实现各种简单的、复杂的逻辑电路,并且灵活,容易配置。
3、完整的时钟管理(DCM)
Xilinx公司生产的FPGA都会自带一个数字时钟管理模块,这个模块提供数字时钟管理和相位环路锁定功能,常利用DCM或PLL可以进行分频或倍频以及相位移动等操作。
DCM实际上可以称作管理时钟的硬核,硬件资源已有,我们用时只需进行简单的软件参数设置即可,使用很方便。
4、嵌入块式RAM
很多的FPGA都内嵌有RAM模块,这些RAM块可以由用户自由进行配置,可以把它配置成单端口RAM、双端口RAM、内容地址存储器(CAM)或者FIFO等存储器,其中的CAM在路由交换领域有广泛的应用。
在基本逻辑单元Slice中的LUT,当用户对它进行配置后也可以用作RAM、ROM和FIFO等存储单元使用。
5、丰富的布线资源
布线是指把设计中用到的底层逻辑门按照一定的要求和规则进行连接,布线资源连通FPGA芯片内部的所有单元,所以芯片内部有着丰富的布线资源。
根据工艺、长度、宽度和分布位置的不同划分为4类:
全局布线资源、长线资源、短线资源、分布式布线资源。
在实际的使用中,布线是通过布局布线器完成的。
布局布线器根据输入的逻辑网表的拓扑结构和约束条件自动的连通所用到的各个逻辑单元模块,这些逻辑网表和约束条件同设计有着直接的关系,设计的繁简,是否优化直接影响布局布线的结果。
6、内嵌的底层功能单元
这个模块指的是嵌入到芯片内的一些软处理核,主要有DLL(DelayLockedLoop)、PLL(PhaseLockedLoop)、DSP和CPU等,这些内嵌模块也可以叫做内嵌处理器(EmbededProcessor)。
这些内嵌的处理器具有丰富的功能,正因为如此使得FPGA称为系统级的设计工具。
7、内嵌专用硬核
这里的硬核模块是相对于软核而言,主要指常用的一些硬核RAM快、硬核乘发器等,另外高端产品中内嵌了CPU模块并且集成了吉比特收发器(MGT)模块。
这些模块专用性很强,进一步完善了FPGA的功能,使得FPGA向SoC(片上系统)开发发展。
2.FPGA的开发步骤
具体的FPGA开发是指运用现代EDA开发软件和各种开发工具在芯片上进行开发的过程,这个过程通常有一套通用的开发流程,在具体的实践中,这个过程中的某些步骤可以省略,但这个流程的大体方向是不会改变的,这个流程包括:
电路功能设计、设计输入、功能仿真、综合优化、综合后仿真、实现、布局布线后仿真、板级仿真以及芯片编程与调试等,开发流程的大体结构如图4-1所示:
图4-1FPGA开发的主流程图
本设计开发软件采用Xilinx公司推出的设计工具套件ISEDesignSuite14.5,它的主要功能包括设计输入、综合、仿真、实现和下载,涵盖了FPGA开发的全过程,从功能上讲,其工作流程无需借助任何第三方EDA软件。
开发环境如下:
图4-2XilinxISE开发的环境
根据图4-2,FPGA开发的流程具体分为以下几个部分:
1电路功能设计
电路功能设计是指在系统设计之前进行的系统方案论证以及芯片选型等工作。
根据系统要求选择合理可行的方案,参考价格、功能、等参数选择方案所需的FPGA芯片。
设计一般采取自顶向下的设计思路,按功能进行逐次向下分解,直到可以用FPGA实现每个模块为止。
2设计输入
设计输入就是根据模块所实现的功能,以开发软件所认可的语言或其它方式表达出来的过程。
FPGA最常用的两种开发方式是硬件描述语言(HDL)和原理图输入。
其中硬件描述语言又包括VerilogHDL和VHDL两种,它们各自有各自的一套语法格式,该语言移植性较好,使用较广泛。
3功能仿真
功能仿真是指在编译之前对用户所设计的电路进行逻辑功能验证,也叫前仿真。
方法是在仿真前建立好波形测试文件,然后用仿真软件(本设计用ISE自带的仿真软件ModelSim)进行仿真,观察仿真结果,该结果不包含任何延时只是对设计的功能性验证,若结果不对,对设计输入进行改进直到仿真结果正确。
4综合
综合是指将较高级抽象层次的描述转化成较低级层次的描述。
将源文件调入逻辑综合软件进行综合,即把语言综合成最简的布尔表达式和信号的连接关系。
可以理解为把设计输入转化编译成由与门、或门、非门、RAM、触发器等基本的逻辑单元组成的逻辑连接网表,并非真正的门级电路。
本设计采用ISE自带的综合工具Synplicity)。
5综合后仿真
综合后仿真是将综合生成的标准延时文件反标注到综合仿真模型中,再次利用仿真软件进行仿真。
仿真结果报告可以估计门延时。
该步骤主要还是用来检查错误。
6设计实现与布局布线
该步是指将设计好的逻辑配置放到FPGA芯片上,这个逻辑配置是指由综合生成的逻辑网表。
这一步真正把设计输入语言与底层硬件单元联系起来。
布局布线必须采用芯片开发商提供的工具。
7时序仿真
需要利用在布局布线中获得的精确参数,用仿真软件验证电路的时序(也叫后仿真),该仿真包含门延时和线延时,能较好的反映芯片的实际工作情况。
8板级仿真和验证
该步骤主要用在高速电路设计中,一般都要用到第三方软件作为工具。
9编程下载
编程下载是指将生成的比特流文件下载到芯片中进行验证,可以借助第三方软件进行硬件测试以检查设计的实现与否。
五.设计过程
整体结构如图5-1所示:
图5-1整体结构图
程序及注释见附录
添加程序到ISE软件,双击“GenerateProgrammingFile”或右键后点击reRunAll运行程序,直到出现三个绿色的勾表示程序编译正确,如图5-2所示:
图5-2编译图
将生成的bit格式文件用“Adept”软件下载到开发板,如图5-3所示:
图5-3下载程序
六.结果
被除数显示(当SW1-SW0为00时):
除数显示(当SW1-SW0为01时):
商显示(当SW1-SW0为10时):
余数显示(当SW1-SW0为11时):
七.设计心得
从最开始的毫无头绪,无从下手,到最后在开发板上正常运行,虽然其中可能有不完美,我还是体会到了成功的喜悦。
通过这次课设的锻炼使我受益匪浅。
在设计的过程中遇到的问题,可以说是困难重重,这毕竟第一次做,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。
不过在所遇的问题处理过程中有成功也有失败,但这却实加强了自己的动手能力,最终我还是体会到了成功的喜悦。
在实验完成的时候我的心情真是无比的开心,从最初的一无所知到最后一直坚持着实验的做完,感觉自己像是完成了一项伟大的任务,内心无比的激动与自豪。
同时,在此过程中我也遇到了不少问题,同学们也都热情的给与了帮助,这也让我感觉到了团队的智慧终究不是单个人所能比拟的。
总而言之这次实验,让我收获颇丰。
参考文献
[1](美)帕尔尼卡(SamirPalnitkar)著夏宇闻,胡燕祥,刁岚松等译.VerilogHDL数字设计与综合:
aguidetodigitaldesignandsynthesis(第二版)[M].北京:
电子工业出版社,2009
[2]安然.基于FPGA的除法器的设计和实现[D].成都理工大学,2011.
八.程序附录
#Inputs
NET"clk"LOC="B8";//时钟接芯片B8管脚
#NET"clk"CLOCK_DEDICATED_ROUTE=FALSE;
NET"reset"LOC="N3";#SW7//SW7为复位键
NET"en"LOC="E2";#SW6//使能开关SW6连芯片上E2管脚
NET"sw1"LOC="L3";#SW1//SW1连芯片的L3管脚
NET"sw0"LOC="P11";#SW0//SW0连芯片的P11管脚
NET"btn3"LOC="A7";#BTN3//BTN3连芯片上的A7管脚
NET"btn2"LOC="M4";#BTN2//BTN2连芯片上的M4管脚
NET"btn1"LOC="C11";#BTN1//BTN1连芯片上的C11管脚
NET"btn0"LOC="G12";#BTN0//BTN0连芯片上的G12管脚
#Outputs
NET"an0"LOC="F12";//an0连芯片上的F12
NET"an1"LOC="J12";//an1连芯片上的J12
NET"an2"LOC="M13";//an2连芯片上的M13
NET"an3"LOC="K14";//an3连芯片上的K14
NET"dp"LOC="N13";//dp连芯片上的N13
NET"cg"LOC="M12";//cg连芯片上的M12
NET"cf"LOC="L13";//cf连芯片上的L13
NET"ce"LOC="P12";//ce连芯片上的P12
NET"cd"LOC="N11";//cd连芯片上的N11
NET"cc"LOC="N14";//cc连芯片上的N14
NET"cb"LOC="H12";//cb连芯片上的H12
NET"ca"LOC="L14";//ca连芯片上的L14
modulechufaqi(reset,clk,sw1,sw0,btn3,btn2,btn1,btn0,en,an0,an1,an2,an3,dp,cg,cf,ce,cd,cc,cb,ca);
inputreset,clk,sw1,sw0,btn3,btn2,btn1,btn0;
outputan0,an1,an2,an3,dp,cg,cf,ce,cd,cc,cb,ca;
inputen;//定义输入输出管脚
reg[3:
0]disp_data0,disp_data1,disp_data2,disp_data3;
wire[15:
0]dividend;//被除数
wire[7:
0]divisor;//除数
wire[15:
0]res;//商
wire[7:
0]rm;//余数
regdividend_key0,dividend_key1,dividend_key2,dividend_key3;
regdivisor_key0,divisor_key1;
always@(*)//所有变量都选,只要有一个为高电平就满足
begin
if({sw1,