VHDL 除法运算可综合性分析与除法器设计

2012-07-02 00:51于德海邢永强
兵器装备工程学报 2012年6期
关键词:被除数除数整数

曾 鑫,熊 波,于德海,邢永强

(1.海军某工程建设指挥部,北京 100036;2.海军航空工程学院,山东 烟台 264001;3.92514 部队,山东 烟台 264001)

除法是数值计算和数据分析中最常用的运算之一,许多高级运算如平方根、指数、三角函数等都与其有关[1]。当前的EDA 工具能对“+”、“-”及部分“* ”运算符进行综合,但是并不能综合“/”运算,而且,在FPGA 中,提供的乘除法设计向导或提供LPM 宏函数对除法运算而言,能处理的除数必须是2 的幂,因此无法实现除数为任意数的除法。所以,本文旨在设计一种能被综合而且除数能是任意整数的除法器。

1 VHDL 除法运算的可综合性

VHDL 并非是针对硬件设计而开发的语言,只是被用来设计硬件。VHDL 是在美国国防部的指导下,出于采购电子设备的需要,为了不涉及商业机密和知识产权问题,同时以保证采购厂商即使破产,也能由其他厂商迅速生产出代用品而开发的。它仅仅用来描述供应商的集成电路芯片的行为,以便让其他厂商按照VHDL 文档的描述,设计出行为与其相同的芯片,因此,制订语言标准时,并没有考虑这些代码如何用硬件来实现[2]。所以,VHDL 语法标准的代码是对硬件行为的一种描述,但不能直接对应成电路的设计信息。行为描述可以基于不同的层次,如系统级,算法级,寄存器传输级(RTL)、门级等等。目前大部分EDA 软件只能综合RTL 或更低层次的行为描述。

对除法而言,要想实现两个变量相除的运算,如写下代码“ans=x/y”,几乎任何EDA 软件都不能将其综合成硬件。经典的除法计算方式是,每次比较余数和除数的大小,确定商,每做一次减法,保持余数不动,低位由被除数低位补进,再减去右移后的除数;对于补码除法运算,先将除数和被除数取模,然后按照原码的计算方法求出商和余数,再根据符号对计算结果进行修正[3]。比较被除数数(余数)与除数的大小需要比较器,求余需要减法器,商数和余数的中间结果必须有寄存器存储,下一次比较之前对余数移位需移位器,时序控制需要状态机等等,因而上述代码的运算不可能在一个时钟周期里完成。部分FPGA 的配套EDA 软件提供除法的运算模块,也只能支持直接调用,而且对除数要求必须是2的幂,不支持把形如“ans =x/y”的语句综合成除法模块,因此编写由VHDL 设计的、对任意数值均能适用的、可综合的除法器对FPGA 数据处理十分必要。

2 除法器设计

除法器算法主要有两种:迭代法与循环法[4-5]。迭代法所提供的商的最低位不准确。循环算法是以减法运算为基础的算法,需要多个循环周期。该算法的实现比较简单,所需的硬件资源较少,非常利于芯片的设计。通常情况下,高精度的除法运算在FPGA 实现中往往要消耗大量逻辑资源。Oberman 和Flynn 的研究[6-7]表明循环算法可以取得较好的时延和资源消耗,而且在计算时延要求较低的应用中,以加长处理时间来降低FPGA 内部资源消耗的运算方法具有一定的应用价值。

2.1 循环算法原理

减法运算是除法运算的基础,除法运算可以由减法运算来实现[7]。在笔算除法时,习惯是从高位以除数的位数为单元进行比较,直到当前比较位的被除数减去除数的整数倍后得到的余数小于除数时,确定当前位的商,再移入右边一位,再做重复比较运算[8]。在FPGA 中,可用VHDL 通过减法运算来实现两个任意整数的除法运算。设计的除法器计算方法并不像笔算那样,从高位以除数位数为单元逐一进行比较,其原理是先将被除数与除数作减法运算,将被减后的被除数再次与除数作减法运算,每进行一次减法运算,计数器计数加一,直至被除数被减后的余数小于除数(被除数和除数在作减法运算时作为被减数和减数)。这时计数器的值就是商的整数部分,对商的整数部分的每一位数值的确定通过判断计数器计数值的大小,比如计数值大于10 000时,对计数值作减10 000处理,直到计数值大小小于10 000,这个减法操作的次数,就是万位上的数值,同理得到千位、百位、十位、个位上的数值。之后计算商的小数部分,首先将余数乘10再与除数作减法运算,操作过程和整数部分的减法相同,直至余数小于除数,计数值得到小数的十分位,再对余数乘10作同样的运算,得到百分位数值,一直这样按相同的运算步骤做下去。如果需要保留小数点后n 位,则需作n +1 次相同的小数部分运算步骤,判断第n+1 位小数的值,用以进行四舍五入运算,再对之前的n 位小数位和商的整数位进行修正。

3.2 除法器设计

除法器设计采用VHDL 有限状态机来实现,设计的除法器的两个操作数在(0,40002]之间(根据应用需要而定的),运算精度要求保留小数点后两位。设计流程如图1 所示。

图1 除法器软件设计流程

3.3 仿真结果分析

对设计的除法器,在Quartus II 平台上进行了时序和功能仿真,并与采用浮点运算算法编写的除法器[9]进行了比较,在处理两操作数大小相当的运算时,本文设计的除法器运算速度与浮点运算算法相当,但占用系统资源远远小于浮点运算算法,这对某些占用资源多,模块划分细的大型系统设计而言,在FPGA 内部资源优化设计上,尤为重要。除法器的仿真结果如图2 与图3 所示。

图2 与图3 的区别主要在算法的时延不同,由图中时间条可以看出,当两操作数相差较大时(图2),计算结果时延较大,约为132.5 μs,而当两操作数相差较小时(图3),计算结果时延小,约为153 ns,图中clk 信号的周期和占空比相同。所以设计的除法器对操作数相当的情况下,运算速度快。运算结果经四舍五入处理后,精确到小数点后两位。

3 结束语

本文以VHDL 编写了能在FPGA 中可综合成硬件的除法器代码,由于设计的除法器应用场合是求出前后两次采集数据的比值,而且两数据大小相当,由仿真结果可知,设计在时延上能很好的满足要求,同时,综合后消耗FPGA 的资源相对较低。笔者在进行高精度测试仪设计过程中使用了该模块,测试结果准确,运算速度较快。

[1]陈玉丹,齐京礼,陈建泗.基于VHDL 的8 位除法器的实现[J].微计算机信息,2006,22(12):277-278.

[2]姜立东.VHDL 语言程序设计及应用[M].北京:北京邮电大学出版社,2007.

[3]陈国军,万明康,王大鸣等.乘除法和开方运算的FPGA串行实现[J].微计算机信息,2008,24(5):167-168.

[4]刘志刚,汪旭东,郑关东.基于SPT 算法的单精度浮点除法器[J].电子设计应用,2008,33(7):59-62.

[5]岳伟甲,刘昌锦.一种基于FPGA 的32 位快速加法器设计[J].四川兵工学报,2011,32(7):78-81.

[6]Oberman S F,Flynn M J.Division algorithm and implementations.IEEE transactions on computers,1997,46(8):833-854.

[7]Oberman S F.Design issuses in high performance floating point arithmetic units.PHD thesis,stanford university,Electrical & electronic department,1997,1.

[8]朱卫华,郑留平.可任意设定计算精度的整数除法器的VHDL 设计[J]. 国外电子测量技术,2008,27(2):16-18.

[9]许秋华,刘伟.基于FPGA 的浮点运算单元的设计方法[J].大众科技,2009,10:17-19.

猜你喜欢
被除数除数整数
商一定小于被除数吗
求被除数
除法中的数学问题
除法中的简便计算
你会算吗——以“除数是一位数的除法”为例
被除数可能是几
余数一定要比除数小
一类整数递推数列的周期性
被除数可能是多少
答案