CORDIC之线性坐标系旋转

关于CORDIC的原理及两个模式(旋转模式及向量模式),Xilinx的一份ppt已经讲得非常非常详细了。最近在写处理器时遇到了问题:手写的乘、除法器占用资源巨大(为了同步减少延时不能用流水线设计),尝试了dsp_elements,乘法器可以,但是除法器用不了dsp资源。64位的乘除法器综合下来总共占用10K左右的LUTs,比较浪费。因此想到了几个月前的CORDIC,当时没看懂,现在理解了一下,很是惊奇。这样就可以重复利用乘法器、除法器以及三角函数计算器。公式如下:

旋转模式(就是正向,乘法):

X(i+1)=X(i)

Y(i+1)=Y(i)+2^(-i)*X(i)

Z(i+1)=Z(i)=2^(-i)

标准的乘法器代码如下:

Multiply=(A[00]?(B<<00):0)+(A[01]?(B<<01):0)+(A[02]?(B<<02):0)+(A[03]?(B<<03):0)+(A[04]?(B<<04):0)+(A[05]?(B<<05):0)+(A[06]?(B<<06):0)+(A[07]?(B<<07):0)+
(A[08]?(B<<08):0)+(A[09]?(B<<09):0)+(A[10]?(B<<10):0)+(A[11]?(B<<11):0)+(A[12]?(B<<12):0)+(A[13]?(B<<13):0)+(A[14]?(B<<14):0)+(A[15]?(B<<15):0)+
(A[16]?(B<<16):0)+(A[17]?(B<<17):0)+(A[18]?(B<<18):0)+(A[19]?(B<<19):0)+(A[20]?(B<<20):0)+(A[21]?(B<<21):0)+(A[22]?(B<<22):0)+(A[23]?(B<<23):0)+
(A[24]?(B<<24):0)+(A[25]?(B<<25):0)+(A[26]?(B<<26):0)+(A[27]?(B<<27):0)+(A[28]?(B<<28):0)+(A[29]?(B<<29):0)+(A[30]?(B<<30):0)+(A[31]?(B<<31):0)+
(A[32]?(B<<32):0)+(A[33]?(B<<33):0)+(A[34]?(B<<34):0)+(A[35]?(B<<35):0)+(A[36]?(B<<36):0)+(A[37]?(B<<37):0)+(A[38]?(B<<38):0)+(A[39]?(B<<39):0)+
(A[40]?(B<<40):0)+(A[41]?(B<<41):0)+(A[42]?(B<<42):0)+(A[43]?(B<<43):0)+(A[44]?(B<<44):0)+(A[45]?(B<<45):0)+(A[46]?(B<<46):0)+(A[47]?(B<<47):0)+
(A[48]?(B<<48):0)+(A[49]?(B<<49):0)+(A[50]?(B<<50):0)+(A[51]?(B<<51):0)+(A[52]?(B<<52):0)+(A[53]?(B<<53):0)+(A[54]?(B<<54):0)+(A[55]?(B<<55):0)+
(A[56]?(B<<56):0)+(A[57]?(B<<57):0)+(A[58]?(B<<58):0)+(A[59]?(B<<59):0)+(A[60]?(B<<60):0)+(A[61]?(B<<61):0)+(A[62]?(B<<62):0)+(A[63]?(B<<63):0);

其实就是列竖式的计算方法,移位相加.公式的第二行就是这个意思,只不过和三角函数共用了。

除法的Verilog实现比较复杂,但其实也是列竖式.到CORDIC里来就是向量模式(就是反向,可以做arctriangle function,不知道为什么叫向量)。

这样只要通过改变几个因子(Xilinx叫u还有角度集(用查找表))就可以使用三角函数和乘法除法。

你可能感兴趣的:(算法)