引言:本文旨在通過該算法產生正余弦波形(不使用IP核)。歡迎大家一起交流,Q群:912014800。
一。仿真波形

如上所示,dout_sin 和dout_cos 通過補碼形式輸出三角函數的值,其中使用dout_vld指示信號的有效性,其中正余弦頻率與clk有關系,這里360個連續clk為對應角度0 - 359,周期為360 * clk。
二。代碼下載
點我下載,然后自己加入到modelsim中就可以仿真了(具體方法略。。)。
信號說明:

如上所示,只要給din_vld 和din即可,din的范圍是0 - 359,din_vld用來指示din的有效性。
dout_sin 和 dout_cos 是輸出的三角函數值,dout_vld 用來指示dout_sin和dout_cos的有效性。
三。推薦知識參考
參考資料,請先看下這份資料,或者查閱相關資料做個鋪墊。
四。關於cordic算法的個人理解
(1)這里我們采用逼近的手段,如下圖:

在單位圓中,假設P2旋轉一定的角度到P1點,則如上所示,那如果我們每次都移動一定的角度呢?則會和下圖類似:

結論:當旋轉多次后(注:旋轉的角度有順時針和逆時針兩個方向),最終將會接近X軸,xn -> 1,yn - >0。
在上圖中,我們可以令每次移動的角度滿足一定的規律,這里我們可以這樣做,令tan(α) = 2 - i(2的 - i次方),旋轉的角度可以通過電腦的計算器算出一系列的 α 值,而2-i可以通過一系列的右移操作得到,便於在fpga實現。
接下里引用一幅截圖,該圖片指示了重復這個過程16次的部分結果,如下:

從圖中,可以看到 θi 是每次移動的角度,cos θ是每次對應的余弦值,∏cos θi是累乘的結果,最后是1/∏cos θi的結果。當經過16次移動后,cos 的值已經非常趨近於1 ,說明經過16次移動后,已經非常接近X軸了。
(2)反方向推導過程

如上圖所示,在單位圓中,假設P1點旋轉 θ 到P2,P2旋轉θ2到P3。
這里令P1的X坐標為x1,Y坐標y1,P2同理。則可以得到以下式子(這里僅針對順時針,逆時針[如P2旋轉一定角度到P1]可自行推導):
P1: x1 = cos (α)
y1 = sin (α)
P2:x2 = cos(θ + α) = cos(θ) * cos(α) - sin (θ) * sin(α) = x1*cos(θ) - y1*sin(θ) = cos(θ) * (x1 - y1*tan(θ) )=cos(θ) * x2'
y2 = sin(θ + α) = sin(θ) * cos(α) + sin(α) * cos(θ) = x1*sin(θ) + cos(θ)*y1 = cos(θ) * (y1 + x1*tan(θ) )=cos(θ) * y2'
P3(令β = θ + α,且x2 = cos(β),y2 = sin(β) ):
x3 = cos(β + θ2) = cos(β) * cos(θ2) - sin (β) * sin(θ2) = x2*cos(θ2) - y2*sin(θ2) = cos(θ2) * (x2 - y2*tan(θ2) )
= cos(θ) * cos(θ2) * (x2' - y2'*tan(θ2)) = cos(θ) * cos(θ2) * x3'
y3 = sin(β + θ2) = sin(β) * cos(θ2) + sin(θ2) * cos(β) = y2*cos(θ2) + sin(θ2)*x2 = cos(θ2) * (y2 + x2*tan(θ2) )
= cos(θ) * cos(θ2) * (y2' + x2'*tan(θ2)) = cos(θ) * cos(θ2) * y3'
......
根據規律可以得到如下的公式:
1)假設經過一次旋轉后得到xn和yn(引用上式的紅色部分公式),則:
xn = x1*cos(θ) - y1*sin(θ)
yn = x1*sin(θ) + cos(θ)*y1
2)假設經過很多次旋轉后,得到近似的xn''和yn''(應用上式的藍色部分公式),則:
∏cosθi * xn' = xn''
∏cosθi * yn' = yn''
3)當經過16次后,(xn''和y'')已經和(xn和yn)非常接近了,若忽略誤差,這里令xn'' = xn,yn'' = yn,則可以得到如下的式子:
xn' = 1/∏cosαi * ( x1*cos(θ) - y1*sin(θ) )
yn' = 1/∏cosαi( y1* cos(θ) +sin(θ) *x1 )
現在假設我們從x軸旋轉得到我們要得到的坐標,則上述公式中,x1 = ∏cosαi , y1 = 0; 則經過一定次數(16次)旋轉后, xn' = cos (θ) , yn' = sin (θ)。
五。程序解釋(后續更新)
