一种CORDIC协处理器核的设计与实现
随着航天技术的发展,航天任务对于导航计算机的性能要求越来越高。导航计算机除了要对传感器数据进行采集,与控制系统进行实时通讯,还要能进行实时的计算。尽管目前航天任务中使用的处理器芯片性能越来越强,但大多数CPU并没有处理常用超越函数(sin,cos,arctan,exp,sqrt,ln等)的专用指令。而通过纯软件循环迭代求解超越函数往往需要CPU数十甚至上百个周期,这极大降低了导航计算机的实时性。本文提出了一种高实时性、低复杂度的CORDIC协处理器核,提供了高吞吐率的超越函数运算能力,从而提高了导航计算机的并行运算能力。此IP核使用verilog编写,由于其资源占用率低,可以非常容易地被集成入各种航天用FPGA中。
1 CORDIC算法
1.1 CORDIC旋转
CORDIC算法最早由Volder提出,用于求解一般三角函数,之后由Walther改进,使得CORDIC可以用于计算双曲函数和进行乘除运算。由于几乎所有的通用CPU都具有硬件乘法除法功能,因此对数坐标模式所提供的乘除功能很少被实际使用,故CORDIC算法的主要应用是三角函数和双曲函数的运算。CORDIC的基本思想是通过一系列预定大小角度的旋转,使得输入向量被旋转到所期望的位置,从而求解出一系列函数。CORDIC的旋转方程可以表示为
![](../img/eep/emb/emb-49710qiihv30nujw.jpg)
其中m为1时CORIDC工作在圆坐标系下,m为-1时工作在双曲坐标系下。dn为1时向量按顺时针方向旋转,当dn为-1时按逆时针方向旋转。
虽然每一步迭代只需要进行加减操作和固定位的移位操作,但由(1)可知,CORIDC每一次旋转都会改变向量的模。所以为了得到正确的向量分量x和y,需要补偿旋转后的向量,而由于向量模的变化与旋转的方向无关,这可以通过一个常数乘法器实现。补偿常数为:
![](../img/eep/emb/emb-49711n02kje5j5nf.jpg)
CORDIC每次旋转的方向由工作模式决定。在旋转模式下,CORDIC试图让向量与x轴之间的夹角z趋近于0。在向量模式下,CORDIC试图让向量的y分量趋近于0。故每次旋转的方向由运行模式和向量的yz分量符号决定:
![](../img/eep/emb/emb-49712z55qr3bnx4a.jpg)
综上,各个模式下CORDIC的迭代结果以及可实现的函数如表1所示。
![](../img/eep/emb/emb-49713im22pohexyr.jpg)
1.2 收敛性
Cordic能输出正确结果的前提是旋转结束时向量能够被旋转到预期的位置(在误差范围内),即旋转收敛。可以通过递归证明的是,对于圆坐标模式,对于任意n总有
![](../img/eep/emb/emb-49714r0xndfxdhkw.jpg)
2 系统实现
为了保证协处理器能够提供足够的计算吞吐量并使协处理器的计算延迟可预测,本文使用流水线实现整个CORDIC核。协处理器的流水线结构如图1所示。
![](../img/eep/emb/emb-49715mgbbsls3dcp.jpg)
2.1 系统输入
协处理器核从输入FIF0获得初始输入数据,包括3个坐标分量以及1个控制命令字。输入参数的格式为1位符号位,2位整数位,小数位的位数作为IP核的参数可以在例化时调整。这样的输入格式使得此IP核可以容易地被应用于使用定点运算的许多DSP处理器。对于浮点数运算,实际上CPU可以通过简单的移位缩放操作使得输入范围外的xyz分量落到协处理器可接受的范围内,这是由于规格化浮点数的尾数本来就在区间[1,2)内。相对的,已有的很多CORDIC协处理器实现使用了浮点数进行中间运算,然而这不仅显著地增加了资源的使用,而且使得每一个CORDIC旋转需要通过多级流水线完成,增大了每个运算的延迟。
此外,为了降低CPU和协处理器之间交互次数,本IP核允许CPU在计算某些函数时不对所有的输入寄存器进行写入。对于输入参数少于3个的函数,协处理器自动生成其他分量的输入。比如对于cos(x),CPU只需要对协处理器的a0寄存器和控制字寄存器写入即可触发cos(x)的运算,CORDIC协处理器会自动把x分量初始化成2.0,y分量初始化成0,z分量初始化成a0。对于有效位数较小的配置如18位,可以进一步将控制命令字和a0放到同一个32位寄存器中,则对于单输入函数,CPU只需向一个地址写入数据即可完成操作。18位数据精度时的输入寄存器格式如图2所示。
![](../img/eep/emb/emb-49716msyhuolggao.jpg)
2.2 预处理单元
如表1所示,CORDIC的运算结果并不直接对应所要求的函数,故需要对与输入参数进行处理。例如对于ln(a)和sqrt(a)运算,需要令x=a+1,y=a-1,对于cos(x),sin(x)等运算,需要生成相应的其他分量输入。此外,由于双曲坐标的性质,arctanh1并不存在,故双曲坐标模式只能从i=1开始迭代,而圆坐标系可以从i=0开始迭代,这导致了两种模式的旋转过程不同。为了能用同一个流水线实现2种模式的操作,本文令所有模式都从i=1开始迭代。但这样会导致在圆坐标模式下的收敛域过小,只有。解决的办法是在预处理单元加入象限折叠,即通过三角函数关系,将[-π,π]上的向量折叠到[0,π/4]上,再在后处理单元对结果进行修正。
2.3 旋转单元
旋转单元是CORDIC协处理器的核心,实现(1)所描述的向量旋转操作。其结构如
- 在采用FPGA设计DSP系统中仿真的重要性 (06-21)
- 基于 DSP Builder的FIR滤波器的设计与实现(06-21)
- 基于FPGA的快速并行FFT及其在空间太阳望远镜图像锁定系统中的应用(06-21)
- 3DES算法的FPGA高速实现(06-21)
- 用FPGA实现FFT算法(06-21)
- FPGA的DSP性能揭秘(06-16)