本文介绍Vivado中CORDIC V6.0的使用方法。
参考资料:pg105
文章目录
- IP核配置
- CORDIC算法
- Vector Rotation
- Polar to Rectangular
- Vector translation
- Sin and Cos
- Sinh and Cosh
- ArcTan
- ArcTanh
- Square Root
IP核配置
Configuration Options选项卡
Configuration Parameters:
Functional Selection:功能选择
Cordic IP核一共可以实现7种运算操作,上表分别是7种操作所对应的输入和输出端口,1表示该通道的子字段存在,0表示该子字段不存在。各通道的数据结构分别如下图所示。
Architectural Configuration:体系结构配置
Parallel:并行,单周期数据吞吐量。
Word Serial:串行,多周期吞吐量。
Pipelining Mode:流水线模式
None:无流水线。
Optimal:最优,采用尽可能多的流水线阶段实现,而不使用任何额外的LUT。
Maximum:最大,在每次子迭代后使用流水线来实现。
Data Format:数据格式
SignedFraction:有符号小数,X和Y的输入输出默认表示为具有2位整数宽度的定点二进制补码。
UnsignedFraction:无符号小数,X和Y的输入输出表示为具有1位整数宽度的无符号定点数。仅适用于平方根功能配置。
Phase Format:相位格式
Radians:弧度,表示为一个整数宽度为3位的二进制补码,单位为弧度。
Scaled Radians:归一化弧度,表示为一个整数宽度为3位的二进制补码,单位为
π
\pi
π弧度。
XQN格式的数字是一个1+X+N位二进制补码;符号位后接X个整数位和N位小数位,表示范围为
−
2
X
-2^X
−2X到
2
X
−
2
(
−
N
)
2^X-2^{(-N)}
2X−2(−N)
对于Radians,PHASE_IN的范围是
[
−
π
,
π
]
[-\pi,\pi]
[−π,π],例如使用Fix11_8格式时,有
01100100100
=
>
011.00100100
=
>
+
3.14
10011011100
=
>
100.11011100
=
>
−
3.14
\begin{array}{l} 01100100100=>011.00100100=>+3.14\\ 10011011100=>100.11011100=>-3.14 \end{array}
01100100100=>011.00100100=>+3.1410011011100=>100.11011100=>−3.14
对于Scaled Radians,PHASE_IN的范围是
[
−
1
,
1
]
[-1,1]
[−1,1],例如使用Fix10_7格式时,有
0010000000
=
>
001.0000000
=
>
+
1.0
1110000000
=
>
111.0000000
=
>
−
1.0
\begin{array}{l} 0010000000=>001.0000000=>+1.0\\ 1110000000=>111.0000000=>-1.0 \end{array}
0010000000=>001.0000000=>+1.01110000000=>111.0000000=>−1.0
Input/Output Options:
Input Width:输入数据宽度,范围8-48。
Output Width:输出数据宽度,范围8-48。
Round Mode:一共四种,分别是Truncate截断、Positive Infinity向上取整(相当于
floor
(
x
+
0.5
)
\text{floor}(x+0.5)
floor(x+0.5)、Pos Neg Infinity四舍五入(相当于
round
(
x
)
\text{round}(x)
round(x)、Nearest Even最接近偶数取整。
Advanced Configuration Parameters:
Iterations: 迭代次数。当Iterations设置为零时,执行的迭代次数由输出所需的精度决定。默认情况下,设置为零,因此迭代次数将自动确定。在这种情况下,对于除平方根以外的所有运算,设置的基本迭代次数是输出宽度。
Precision: 精度。当Precision设置为零时,内部精度将根据输出所需的精度和内部迭代次数自动确定。默认情况下,设置为零,因此会自动确定内部精度。
当Precision设置为(Input_Width+Output_Width+log2(Output_Width))时,无论输入幅度如何,输出相位都精确到全输出宽度。
Coarse Rotation: 粗略旋转。如果禁用了Coarse Rotation,则输入/输出范围仅限于第一象限(-Pi/4到+Pi/4)。标准CORDIC算法在第一象限上运行。粗略旋转通过将输入样本旋转到第一象限并将输出样本反向旋转回适当象限,将CORDIC操作范围扩展到完整的圆。
Compensation Scaling: 补充缩放。CORDIC幅度缩放影响矢量旋转和矢量平移功能配置。它不影响Sin、Cos、Sinh、Cosh、ArcTan、ArcTanh和平方根函数配置。对于后一种配置,补充缩放设置为No Scale Compensation。一共有四种设置,分别是No Scale Compensation(输出X和Y不进行补偿,而是按比例
Z
i
Z_i
Zi生成)、LUT Based(输出X和Y使用基于LUT的恒定系数乘法器进行补偿)、BRAM(输出X和Y使用基于块RAM的恒定系数乘法器进行补偿)、Embedded Multiplier(输出X和Y使用DSP Slice进行补偿)。
AXI4-Stream Options:
该选项卡用于配置AXI4接口,不再详细介绍。
CORDIC算法
CORDIC算法将矢量旋转通过一系列连续的较小旋转来执行,每次执行的角度为
atan
(
2
−
i
)
\text {atan}(2^{-i})
atan(2−i),第
i
i
i次迭代的表达式为
x
i
+
1
=
x
i
−
α
i
⋅
y
i
⋅
2
−
i
y
i
+
1
=
y
i
+
α
i
⋅
x
i
⋅
2
−
i
θ
i
+
1
=
θ
i
+
α
i
⋅
atan
(
2
−
i
)
\begin{array}{l} x_{i+1}=x_{i}-\alpha_{i} \cdot y_{i} \cdot 2^{-i} \\ y_{i+1}=y_{i}+\alpha_{i} \cdot x_{i} \cdot 2^{-i}\\ \theta_{i+1}=\theta_{i}+\alpha_{i} \cdot \operatorname{atan}\left(2^{-i}\right) \end{array}
xi+1=xi−αi⋅yi⋅2−iyi+1=yi+αi⋅xi⋅2−iθi+1=θi+αi⋅atan(2−i)
其中,
α
i
=
(
+
or
−
)
1
\alpha_i = (+ \text{or} -)1
αi=(+or−)1,为旋转方向。
Vector Rotation
矢量旋转使矢量
(
X
,
Y
)
(X,Y)
(X,Y)旋转一个角度,产生一个新的矢量
(
X
′
,
Y
′
)
(X^{'},Y^{'})
(X′,Y′)。
输入输出信号如下表。
X
′
=
Z
i
×
(
cos
(
θ
)
×
X
−
sin
(
θ
)
×
Y
)
Y
′
=
Z
i
×
(
cos
(
θ
)
×
Y
+
sin
(
θ
)
×
X
)
\begin{array}{l} X^{\prime}=Z_{i} \times(\cos (\theta) \times X-\sin (\theta) \times Y) \\ Y^{\prime}=Z_{i} \times(\cos (\theta) \times Y+\sin (\theta) \times X) \end{array}
X′=Zi×(cos(θ)×X−sin(θ)×Y)Y′=Zi×(cos(θ)×Y+sin(θ)×X)
该功能配置下,IP核默认设置粗略旋转和选择补偿缩放模块。
Polar to Rectangular
使用该功能实现极坐标到直角坐标的转换,此时输入矢量为
(
X
2
+
Y
2
,
0
)
(\sqrt{X^2+Y^2},0)
(X2+Y2,0),输入角度为
θ
\theta
θ。如输入
(
1
,
0
)
和
π
4
(1,0)和\frac{\pi}{4}
(1,0)和4π,则输出应为
(
0.707
,
0.707
)
(0.707, 0.707)
(0.707,0.707)。输入输出数据位宽设置为10bits时,仿真结果如下。
Vector translation
该功能配置下,使用CIRDIC算法旋转输入矢量
(
X
,
Y
)
(X,Y)
(X,Y),直到Y分量为零。输出幅值
Z
i
∗
Mag
(
X
,
Y
)
Z_i * \text{Mag}(X,Y)
Zi∗Mag(X,Y)和输出相位
Atan
(
X
/
Y
)
\text{Atan}(X/Y)
Atan(X/Y),即可完成直角坐标到极坐标的转换。
如输入
(
0.707
,
0.25
)
(0.707,0.25)
(0.707,0.25)时,输出幅值为0.75和相位为0.336,使用也需注意粗略旋转和补偿缩放。
Sin and Cos
该函数功能的输入输出信号如下表。
当设置粗略旋转时,输入PHASE_IN的范围
(
−
π
,
π
)
(-\pi,\pi)
(−π,π)。超出此范围的输入会产生不可预测的结果。如果未设置选项,则必须将输入约束为位于第一象限,即
(
−
π
4
,
π
4
)
(-\frac{\pi}{4},\frac{\pi}{4})
(−4π,4π)。
设置输入数据单位为Radians,设置输入/输出宽度为10位,则输入数据为fix10_7格式,输出数据为fix10_8格式。
若不设置粗略旋转,当输入角度数据
θ
\theta
θ为1.78125 rad,输出数据
s
i
n
(
θ
)
sin(\theta)
sin(θ)为0.81640和
c
o
s
(
θ
)
cos(\theta)
cos(θ)为0.57421。
正确输出数据为
此时勾选粗略旋转功能后,重新仿真,得到如下正确输出数据接。
Sinh and Cosh
对于该函数配置,粗略旋转模块被禁用,因为它不适用于双曲变换。
ArcTan
ArcTanh