一种基于SystemVerilog的CORDIC算法IP核实现方案*

2020-03-25 07:35盛业斐
通信技术 2020年1期
关键词:常量坐标系代码

盛业斐

(南京邮电大学 海外教育学院,江苏 南京 210023)

0 引 言

坐标旋转数字运算法(Coordinate Rotation Digital Computer,CORDIC)是一种坐标旋转算法,常用来计算向量旋转、三角与反三角函数以及乘、除法等初等函数值[1]。随着现代电子通信技术的发展,特别是数字通信领域,包括OFDM信道估计与均衡、峰值因子降低(Crest Factor Reduction,CFR)、数字预失真(Digital Pre-Distortion,DPD)、接收机载波同步与相位补偿、直接序列扩频捕获与跟踪等场景,对数字通信信号的处理往往涉及到复数乘除法、矩阵QR分解及相位补偿等运算[2]。CORDIC算法由于低复杂度、精度和延迟的可控性得到了大规模应用。然而,CORDIC算法形式多样,包括三种坐标形式和两种旋转模式,分别对应着不同的初等函数运算结构。虽然J.Walther在1971年给出了CORDIC算法在三种坐标系下的统一数学表达式[3],可以方便地在软件编程上实现不同的CORDIC运算,但是在实际应用中特别是在通信物理层信号处理前端,CORDIC运算往往需要在FPGA硬件中实现。常规做法是根据不同函数运算需求设计特定的RTL代码,导致代码灵活性和可移植性受到了极大限制。尽管市面上FPGA生产厂家已经将CORDIC算法IP核集成到各自的EDA开发工具中,用户可以免费调用,但是不同厂家提供的IP核之间无法兼容,加之用户无法获得其IP源码,进而无法在不同厂家平台开发之间进行移植,且代码仿真效率不高。本文根据CORDIC各种运算形式和特性,利用SystemVerilog语言实现了CORDIC算法通用IP核制作,大大提高了RTL代码的可读性、灵活性和可移植性,并且在FPGA中进行了仿真验证和性能分析。

1 CORDIC算法原理

CORDIC是一种依靠角度旋转逼近计算目标的算法[4]。它的基本推导来自直角坐标系下的坐标旋转变换。xoy坐标系点(x1,y1)旋转θ角度后到点(x2,y2),则点(x1,y1)到点(x2,y2)的变换满足:

如果忽略cosθ对系统的影响,得到伪变换形式为:

令tanθi=(1/2)i,每次旋转arctan((1/2)i)角度,累计旋转角度与给定的角度θ之差记为z。

当z>0,则下一次旋转对应于第i+1次将沿反方向旋转,且旋转角度为-arctan((1/2)i)。如此经过多次变换后,最终旋转角度将无限逼近(1/2)i,此时z数值也将趋于0。伪变换与旋转变换区别在于受到旋转因子cosθi的影响,多次变换后的结果值将会产生总的幅度畸变因子为:

当N→+∞时,上述值趋向于0.607 3,即畸变补偿因子为K=1.647。

经过如上简化后,计算点(x1,y1)旋转θ角度后的坐标值,只需要经过N次旋转,旋转角度分别为θ1,θ2,θ3,…,θN。其中,每旋转一个角度只需要进行一次判断、两次移位操作和三次加(减)法。与其他计算方法相比,无需使用乘法器和大量的查找表,大大降低了硬件实现的复杂度,因此得到了大规模应用。

以上推导为CORDIC算法在圆周坐标系下的表达式。J.Walther在1971年给出了CORDIC算法在圆周坐标、线性坐标和双曲坐标共3种坐标系下统一数学表达式:

针对3种不同坐标系,基于旋转和向量模式得到以下6种不同的CORDIC形式。它在各种不同模式下取不同的输入量,对应不同输出结果作为初等函数运算,最终归纳出其对应关系如表1所示。例如,要计算sinθ的数值,从表1可以看出其对应旋转模式且μ=1,每次旋转角度为arctan2-i,di=sign(z(i)),初始输入值为x0=1/K,y0=0,z0=θ。经过N次旋转后最终结果为:

则xN即为最终计算结果。

2 SystemVerilog介绍

常见支持可编程逻辑门阵列(Field Programable Gate Array,FPGA)开发的硬件描述语言有VHDL和Verilog两种。SystemVerilog简称为SV语言,建立在Verilog语言的基础上,是IEEE 1364 Verilog-2001标准的扩展增强,兼容Verilog 2001,于2009年成为了IEEE 1800-2009标准[5]。目前,SystemVerilog语言发展已经逐渐成熟,几乎所有的RTL编译和仿真器均支持它。SystemVerilog将硬件描述语言(Hardware Description Language,HDL)与现代高层级验证语言(Hardware Verification Language,HVL)结合起来[6],支持多维压缩数组的操作,使得原来使用Verilog需要多种重复性的操作,直接通过generate循环对寄存器数组操作,大大精简了代码量,提升了代码可维护性、灵活性和可移植性[7]。本文充分利用SystemVerilog语言特点,结合各种CORDIC算法形式,实现了CORDIC算法IP核的制作,并且通过Quartus II和Modelsim对代码进行综合与仿真,在FPGA中进行了验证和性能分析。

表1 CORDIC算法不同形式关系总结表

3 CORDIC算法IP核制作与验证

根据表1给出3种坐标系及其对应的2种模式,共有6种不同CORDIC算法结构。本文充分对比6种不同结构的核心共性,结合J.Walther提出的统一表达式,利用支持现代高层级验证语言的SystemVerilog进行硬件RTL描述,设计了CORDIC算法硬件IP核。以下将从CORDIC算法硬件实现流程出发,对设计的IP核进行仿真验证,最后给出本IP核性能分析。

3.1 CORDIC算法IP核硬件实现

根据理论推导,设计CORDIC算法IP核的硬件功能框图如图1所示,主要包括常量计算与存储、输入数据预处理、流水线CORDIC以及输出数据处理等部分。

图1 CORDIC算法硬件实现架构

3.1.1 常量计算与存储

从J.Walther提出的CORDIC统一表达式出发,根据表1提出的6种结构形式可知,不同坐标系对应着不同的旋转角度因子常量e(i)和伸缩因子K,不同旋转模式对应着不同的模式符号di。因此,实现CORDIC算法IP核的制作,首先需要针对表1提出的6种结构计算6组e(i)、K、di常量表。另外,由于在硬件FPGA中实现时考虑到速度与资源的平衡,一般采用定点运算,需要对e(i)、K、di常量进行定点化。本设计充分利用SystemVerilog支持现代高层级验证的特点,设计18个二维寄存器数组来存取定点化后的e(i)、K、di常量,并且根据6种结构的CORDIC分别进行宏定义,由用户在代码编译之前根据需要选择不同的宏来配置不同其需要的运算模式。

3.1.2 输入数据预处理

输入数据预处理是对用户输入数据进行等价变换,防止CORDIC溢出和迭代不收敛。例如,利用CORDIC计算sinθ,由表1可知对应于圆周坐标系的CORDIC,且有μ=1,e(i)=arctan2-i,每次旋转的角度为±arctan2-i。经过无数次迭代旋转后,角度旋转之和最大值为:

因此,如果输入角度不在这个范围,可以利用三角函数性质,总能将其转换后满足θ∈[-π/2,π/2]。

3.1.3 CORDIC算法核心模块处理

从式(1)可以看出,每旋转一个角度只需要进行一次判断、两次移位操作和三次加(减)法,硬件结构如图2所示。N次旋转共需N级架构相同的操作模块,其硬件延时为N个时钟周期,且前一级运算结果作为后一级输入,不存在反馈过程。在FPGA硬件实现时,非常合适用流水线的方式去完成,N次旋转共需要N级流水线。

图2 单级CORDIC算法核心模块硬件结构

3.2 CORDIC算法IP核硬件RTL仿真验证

为了验证本设计CORDIC算法RTL代码功能与时序的正确性,本文以经过14次旋转的CORDIC算法实现除法运算为例,在Matlab中产生256点随机定点数作为硬件仿真中被除数和除数点,并以文本形式保存。编写Testbench仿真程序,将该文件读取后以特定时序送入CORDIC算法模块,最终硬件仿真所得结果如图3所示。

图3 CORDIC算法IP核时序仿真结果

将硬件仿真结果与Matlab计算结果进行对比,得到相对误差曲线如图4所示,统计得到相对误差平均值为0.072%,说明本设计的CORDIC算法完全符合实际应用的需求。

图4 软硬件仿真结果对比

3.3 CORDIC算法IP核性能分析

以除法和反正切角度计算为例,硬件输入以16比特定点量化,根据不同旋转次数N,对本设计的CORDIC算法IP核代码进行配置,利用Quarters II硬件编译器对其进行综合布局布线,得到资源损耗与性能结果如表2所示。从表2可以看出,随着旋转次数N的增加,硬件资源使用会越来越多,计算精度将越来越高,但是FPGA能最大工作时钟仍能维持在200 MHz以上,完全符合IP化的要求。

表2 CORDIC算法IP核性能分析表

4 结 语

本文首先通过对CORDIC算法统一表达式进行研究,总结了CORDIC算法在不同坐标系、不同模式下所对应的计算对象及其之间的联系。然后,利用SystemVerilog将表征不同CORDIC结构的旋转角度因子常量e(i)、伸缩因子K和旋转模式符号di以二维寄存器组进行统一化存取,并设计宏定义提供用户配置接口,最终实现CORDIC算法IP核制作,并且在FPGA中进行了仿真验证和性能分析。硬件仿真和实际应用证明,本设计的IP核由于采用SystemVerilog语言描述,大大提高了RTL代码的可读性、灵活性和可移植性,在通信和信号处理领域具有一定的参考和应用价值。

猜你喜欢
常量坐标系代码
科学照亮世界
——卡文迪什测定万有引力常量
独立坐标系椭球变换与坐标换算
一次函数的学习引导
创世代码
创世代码
创世代码
创世代码
坐标系背后的故事
三角函数的坐标系模型
求坐标系内三角形的面积