基于VHDL的8位除法器的实现TheDesignof8DivisionWithVHDL摘要:介绍了利用VHDL实现八位除法,采用层次化设计,给出了实现除法的子模块程序。使用Altera公司的MAX+PLUSII10.2开发软件进行功能仿真并给出仿真波形。关键词:二进制除法VHDLMAX+PLUS2Abstract:Thedesignofdivision(8/8)byhierarchytechniqueisproposed.SchematicdocumentsandsubmoduleprogramwithVHDLlanguagearealsogiven.Attheendofthearticle,usingMAX+PLUS2,theflowcharisgivenandthesimulationresultisattached.Keywords:divisionVHDLMAX+PLUS2引言除法是数值计算和数据分析中最常用的运算之一,许多高级运算如平方根、指数、三角函数等都与其有关。在FPGA中,有加、减、乘、除的算法指令,但除法中除数必须是2的幂,因此无法实现除数为任意数的除法。本文用VHDL编写了除法运算,可实现任意八位数的除法。除法器的设计本文所采用的除法原理是:对于八位无符号被除数A,先对A转换成高八位是0低八位是A的数C,在时钟脉冲的每个上升沿C向左移动一位,最后一位补零,同时判断C的高八位是否大于除数B,如是则C的高八位减去B,同时进行移位操作,将C的第二位置1。否则,继续移位操作。经过八个周期后,所得到的C的高八位为余数,第八位为商。从图(1)可清楚地看出此除法器的工作原理。此除法器主要包括比较器、减法器、移位器、控制器等模块。1、比较模块设计中所用的八位比较器是由两个四位比较器级联而成的。比较器的原理是先对高位进行比较,如果不相等,则得出结论,否则,再对下一位进行比较。设计的四位比较器可以级联成任意位的比较器。比较器输出信号决定减法器是否进行减法运算。2、运算控制模块控制模块的主要在外部运算时钟和起始信号的作用下,产生控制其他模块所需的数据调用、运算同步时钟以及乘法运算结束标志信号等。其VHDL语言描述如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYARICTLIS——除法运算控制器PORT(CLK,START:INSTD_LOGIC;CLKOUT,RSTALL,ARIEND:OUTSTD_LOGIC);ENDARICTL;ARCHITECTUREBEHAVOFARICTLISSIGNALSIGN:STD_LOGIC_VECTOR(3DOWNTO0);BEGINRSTALL=START;CLKOUT=CLK;PROCESS(CLK,START)BEGINIFSTART='1'THEN——高电平清零计数器SIGN=0000;ELSIFCLK'EVENTANDCLK='1'THENIFSIGN8THEN——小于八则计数,等于八则表明运算已经结束SIGN=SIGN+1;ENDIF;ENDIF;ENDPROCESS;PROCESS(CLK,SIGN,START)BEGINIFSTART='0'THENIFSIGN8THEN——除法运算正在进行ARIEND='0';ELSEARIEND='1';——如果余数小于除数则运算结束,否则,再进行一个周期的运算ENDIF;ELSEARIEND='0';ENDIF;ENDPROCESS;ENDBEHAV;图(1)3、减法器减法器接收比较器所输出的信号,如果AB,则进行减法,输出A-B,否则输出A,减法器的输出到移位器中进行循环。4、移位器这是除法器实现中的核心部分,主要实现数据的移位和最后结果的输出,其VHDL程序如下:LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYREG16BISPORT(CLK,CIN,LOAD,ARIEND:INSTD_LOGIC;A:INSTD_LOGIC_VECTOR(7DOWNTO0);D:INSTD_LOGIC_VECTOR(7DOWNTO0);QL,QH:OUTSTD_LOGIC_VECTOR(7DOWNTO0));ENDREG16B;ARCHITECTUREBEHAVOFREG16BISSIGNALR16S:STD_LOGIC_VECTOR(15DOWNTO0);BEGINPROCESS(CLK,LOAD,ARIEND)BEGINIF(CLK'EVENTANDCLK='1')THENIF(ARIEND='0')THENIFLOAD='1'THEN——装载新数据R16S(15DOWNTO0)=00000000&A(7DOWNTO0);ELSIF(LOAD='0')THENR16S(15DOWNTO9)=D(6DOWNTO0);R16S(8DOWNTO1)=R16S(7DOWNTO0);——数据左移R16S(0)='0';——最后一位补0IF(CIN='1')THEN——如果比较器的输出为1,则第二位值为1R16S(1)='1';ENDIF;ENDIF;ELSEIF(CIN='1')THEN——最后余数如果大于除数则再进行一次减法R16S(15DOWNTO8)=D(7DOWNTO0);R16S(7DOWNTO0)=R16S(7DOWNTO0)+1;——商加1ENDIF;ENDIF;ENDIF;ENDPROCESS;QH=R16S(15DOWNTO8);——余数的输出QL=R16S(7DOWNTO0);——商的输出ENDBEHAV;MAX+PLUS2仿真采用ALTERA公司的MAX+PLUS2对除法器进行仿真,图(2)为仿真波形图。结论由于除法运算包含了减法、试商、移位等多种操作过程,因此运算比较复杂,在现有的参考资料中,主要都基于乘法器的设计,除法器设计资料较少。本文作者的创新点是:参考文献[3]的乘法器设计,利用VHDL语言实现了八位数的除法器设计,该除法器采用了VHDL的混合输入方式,将除法器分成若干个子模块后,对各个子模块分别设计,各自生成功能模块,最后用一个图形文件调用这些子模块的功能模块,完成整体设计,实现了任意八位无符号数的除法。参考文献:[1]赵岩岭,刘春,曹源等.在MAX+PLUS2平台下用VHDL进行数字电路设计[J].微计算机信息,2004,20(4):9-11[2]陈耀和.VHDL语言设计技术[M].北京:电子工业出版社,2004.[3]于敦山,田泽.328乘法器完成3232乘加器的算法及实现[J].微电子学与计算机,2002,3:21-23.[4]冯涛,王程.可编程逻辑器件开发技术—MAX+PLUS2入门与提高[M].北京:人民邮电出版社,2002图(2)