新闻中心

EEPW首页 > 汽车电子 > 设计应用 > 基于CORDIC算法的32位浮点三角超越函数之正余弦函数的FPGA实现

基于CORDIC算法的32位浮点三角超越函数之正余弦函数的FPGA实现

——
作者:桂林电子科技大学 通信与信息工程系 李全 陈石平 付佃华时间:2006-11-03来源:电子产品世界收藏

摘要: 本文在传统算法的基础之上,通过增加迭代次数,对参数进行了优化筛选,提高了运算精度,使设计出的软核能够在精度要求较高的场合中运行,如实时语音、图像信号处理、滤波技术等。输出数据经过,能够直接兼容大多数处理器,扩展了其应用范围。最终在Altera公司NiosⅡ处理器中通过增加的方式完成了硬件实现。

关键词: 

引言

浮点超越函数的应用领域十分广泛,涉及航空航天、机器人技术、实时语音、图像信号处理、滤波技术、FFT变换等领域。因此,设计并实现浮点三角超越函数是非常重要的。硬件实现的超越函数算法,按照数学公式和对应的实现方式的不同,可以分为查表法、多项式近似法、基于查表的多项式结合方法、有理数近似和逐位法五类。经过对这些算法进行分析和比较,本文选择 作为超越函数的算法,并用Altera公司的CycloneⅡ芯片完成硬件实现。

CORDIC内核及前后处理单元设计

CORDIC内部结构


在迭代式架构下,内部CORDIC结构如图1所示。

图1  经典CORDIC硬件实现架构

图1中架构由控制单元,选择器,移位寄存器,ROM,加法器组成。系统的控制单元采用有限状态机的实现形式,进行迭代和数据格式转换的流程控制。ROM中存放的是预先计算好的反正切数据值,供迭代运算中调用。从架构中可以看出只有移位与加减运算,因此特别适合于用硬件实现。每次迭代运算后,再将数据返回,直到足够的次数执行完成后,才将结果输出。每次迭代之前要对角度值Z进行判断,根据Z的符号来决定图1中的符号。

实现该部分的关键代码如下:
if(~z[31])
 begin
  x <= x - (y >>> counter);
  y <= y + (x >>> counter);
  z <= z - atan;
  end
else
 begin
  x <= x + (y >>> counter);
  y <= y - (x >>> counter);
  z <= z + atan;
 end  

前置处理单元

由于迭代本身的限制,最大旋转角度用公式表示为:

     (1)
为了扩展输入角的范围,需要对输入角进行预处理,使其落在第一象限范围之内。即对输入角度进行取模,根据所处的象限进行符号判断和正余弦交换。在CORDIC内核设计中,对0_范围内的角度用一个32位的二进制整数来表示,即101101100000101101100000(即十进制数11930464)。

后置处理单元

后置处理将内部CORDIC计算出来的结果在输出前转换成IEEE-754标准格式,即形式,其结构如图2所示。

图2  后置处理单元硬件结构

图2中的LZDC(Leading zero detection circuit)为前导零检测电路,其功能是用来统计数据从最高位开始连续“0”的个数,再根据它把计算出来的数值转换成IEEE-754标准格式。在转换过程中需要对尾数进行左移,才能表示为,此位移量再与前置处理器单元传来的参考指数值相减,得到输出指数值。符号位直接由前置处理过程得到。最后将符号位、指数数值、小数按位连接得到IEEE-754格式的数据,并从硬件接口输出端输出。

设计及软件仿真波形

用Quartus II对本设计进行了软件波形仿真,选取角度值分别为、、和(即-)。

以为例,iAngle的十进制数为(/360)*88.8= 1059425266(小数部分忽略),十六进制表示为3F258BF2。oCos的内部仿真结果十六进制值为3FFD8131,对应的IEEE-754标准格式值oCos_IEEE754为3F7FF804,即十进制数0.020942,正弦的计算过程同理。

仿真结果对照如表1所示。

从表中可以看出,在(0_)输入范围内,用本设计计算仿真出的结果误差小于10-6,在单精度表示范围内误差为0,且输出表示为标准IEEE754类型。一次计算所需时钟周期数为34。



Altera公司NiosⅡ处理器增加了多达256条用户自定义指令,这是其它SOC系统无法比拟的。用户自定义就是让NiosⅡ软核完成一个用HDL描述的电路模块功能。用户自定义指令可以在几个时钟周期之内完成复杂算法的处理能力,访问存储器或系统外的逻辑单元,加快专项任务的执行,以达到优化目的。通过用户自定义指令可以把系统中用软件处理中的耗时多的关键算法用硬逻辑电路来实现,大大提高处理器的效率。由于CORDIC内核的特性,正余弦函数可以同时计算出来,因此适合于采用扩展用户自定义指令来实现,即用一个硬件模块来完成两种函数的计算。通过一个附加的参数n来决定输出是正弦或余弦,这样可以节约一半的硬件资源。本文在NIOSⅡ中增加了正余弦自定义指令,其宏定义代码如下:

#define MYCORDIC_N 0x00000002
#define MYCORDIC_N_MASK ((1<<1)-1)
#define FLOAT_COS(A)  __builtin_custom_fni(MYCORDIC_N+( 1&MYCORDIC_N_MASK),(A))
#define FLOAT_SIN(A)  __builtin_custom_fni(MYCORDIC_N+ (0&MYCORDIC_N_MASK),(A))

加入指令后,在NiosⅡ的IDE中进行软硬件同时调试,相应的C语言测试代码在此省略,给出对比结果如图3和图4所示。

图3

图4

本系统硬件验证平台采用DE2开发板,其中NiosⅡ处理器配置为full功能,分别使用16K数据cache和16K指令cache,增加了硬件乘法器和硬件除法器,开启了流水线功能,已达到了NiosⅡ软核处理器的最高性能。

从结果对比中看出,使用硬件指令后对完全相同的正余弦角度进行计算时,其运算速度大大提高。需要说明的是,软件运算随着输入角度的不同所使用的计算时间有很大差别,而使用硬件指令运算是,其计算时间基本不变。详细对比如表2所示。

误差方面,软硬件运算在六位小数范围内其误差值为0,可见本设计确实达到了高精度的要求。

结语

本设计以提高处理器精度和速度为目标,通过在NiosⅡ处理器中添加用户自定义指令的方式以更多的硬件资源换取更快的计算速度,从而满足现代实时通讯处理的要求。在传统CORDIC算法的基础之上,巧妙的改进了算法,达到了更高精度和更快的速度,具有较广泛的应用价值。当然,本设计只完成了正余弦函数的硬件IP部分,还有更多的工作等待我们去完成,相信通过不断的努力,我们会完成更多的函数硬件IP。

参考文献
1.  Volder. The CORDIC trigonometric computing teclu}ique. IRE Trans. Electronic Computers, 1959, EC-8(3): 334-334.
2.  Richard Herveille. Cordic Core Specification . 18, 2001
3.  潘宏亮.浮点指数类超越函数的运算算法研究与硬件实现.西北工业大学 2006.3
4.  IEEE organise.IEEE Standard for Binary Floating-Point Arithmetic Inc 345 East 47th Street, New York, NY 10017, USA
5.  王博立.浮点运算CORDIC之实现与其在3D图形学之应用.台湾国立中山大学 2002.6
6.  www.Altera.com
7.  www.opencore.org
8.  www.edacn.net



评论


相关推荐

技术专区

关闭