chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

FPGA實現(xiàn)Cordic算法求解arctanθ

FPGA研究院 ? 來源:FPGA之旅 ? 2023-09-27 09:30 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一. 簡介

由于在項目中需要使用的MPU6050,進行姿態(tài)解算,計算中設計到arctan 和 sqr(x*2 + y * 2),這兩部分的計算,在了解了一番之后,發(fā)現(xiàn)Cordic算法可以很方便的一次性求出這兩個這兩部分的計算。另外也可以一次性求出sin和cos的值。另外該算法還可以計算其他的一些公式(沒做過多的了解)。

二.Cordic算法

該算法的核心實現(xiàn)就是旋轉(zhuǎn)逼近,每次旋轉(zhuǎn)一定的角度,無限的逼近所給定的角度值。

1. 理論基礎

首先有向量P0,現(xiàn)在要將其旋轉(zhuǎn)θ角度,到Pm。那么Pm的坐標值如下

xm = x0cosθ - y0sinθ = cosθ(x0 – y0tanθ)

ym = x0sinθ + y0cosθ = cosθ(y0 + x0tanθ)

P0和Pm均在單位圓上,另外假設現(xiàn)在P0在X軸上,即 X0 = 1,y0 = 0。上式就可以變?yōu)槿缦嘛@示

xm = x0cosθ - y0sinθ = cosθ

ym = x0sinθ + y0cosθ = sinθ

可以看到Pm的坐標值,就是sinθ 和 cosθ的值。這就是理論基礎。

52cb0070-5cc5-11ee-939d-92fbcf53809c.png

2. sinθ 和 cosθ 算法實現(xiàn)

有了理論支持后,我們只需要求解Pm的坐標即可。直接旋轉(zhuǎn)θ不太可能,但是我們可以每次旋轉(zhuǎn)特定的角度θi (tanθi = 1/2^i),讓我們的角度值逼近θ即可。于是就有了如下迭代公式。

x(i+1) = cosθi* (xi – yi * tanθi)

y(i+1) = cosθi * (yi + xi * tanθi)

θ(i+1) = θi (+-) dθi

如果當前角度小于設定角度,那么就加dθ ,大于設定角度 , 那么就減dθ。由于每次旋轉(zhuǎn)的dθ,會越來越小,所以旋轉(zhuǎn)的當前角度會越來越來接近設定角度。

計算過程中 ,cosθi,只充當縮放因子,對旋轉(zhuǎn)方向沒有影響??梢韵仍谲浖刑崛〖夹g出來。每次旋轉(zhuǎn)角度值 和 對應的 cos值如下。

52d742ea-5cc5-11ee-939d-92fbcf53809c.png

3. arctan (x,y)和 sqr(x*2 + y * 2)算法實現(xiàn)

在求解sinθ 和 cosθ 的時候,知道,給定一個角度,按照上述方法就可以求解?,F(xiàn)在將其反過來,給定sinθ 和 cosθ的值,也就是Pm的坐標(可能不在單位圓上,只是模值縮放了),現(xiàn)在只需要將其旋轉(zhuǎn)到X軸的正半軸上,即Y = 0 ,X > 0的時候,所旋轉(zhuǎn)過的角度值即arctan (x,y)。

然后P0的X坐標值即sqr(x*2 + y * 2)。旋轉(zhuǎn)過程中,向量的模值是不會改變的,而Pm的模值就是sqr(x*2 + y * 2)。

三.Cordic算法實現(xiàn)

首先將上述角度值,存儲到verilog中,需要進行擴大處理。由于tanθi = 1/2^i),所以對應的tanθ也是知道的。在相乘的時候,只需要將對應的數(shù)右移對應的位數(shù)即可

`define rot0 32'd2949120    //45度*2^16
`define rot1 32'd1740992    //26.5651度*2^16
`define rot2 32'd919872    //14.0362度*2^16
`define rot3 32'd466944    //7.1250度*2^16
`define rot4 32'd234368    //3.5763度*2^16
`define rot5 32'd117312    //1.7899度*2^16
`define rot6 32'd58688     //0.8952度*2^16
`define rot7 32'd29312     //0.4476度*2^16
`define rot8 32'd14656     //0.2238度*2^16
`define rot9 32'd7360     //0.1119度*2^16
`define rot10 32'd3648     //0.0560度*2^16
`define rot11 32'd1856     //0.0280度*2^16
`define rot12 32'd896      //0.0140度*2^16
`define rot13 32'd448      //0.0070度*2^16
`define rot14 32'd256      //0.0035度*2^16
`define rot15 32'd128      //0.0018度*2^16

然后就是迭代過程了,迭代16次足夠了。最后的Zn和Xn就是想要結果。

//旋轉(zhuǎn)
genvar i;
generate
  for( i = 1 ;i < 17 ;i = i+1)
 ? begin: loop2
 ? ? ? always@(posedge clk or negedge rst_n)
 ? ? ? begin
 ? ? ? ? ? if( rst_n == 1'b0)
 ? ? ? ? ? begin
 ? ? ? ? ? ? ? Xn[i] <= 'd0;
 ? ? ? ? ? ? ? Yn[i] <= 'd0;
 ? ? ? ? ? ? ? Zn[i] <= 'd0;
 ? ? ? ? ? end
 ? ? ? ? ? else if( cal_delay[i -1] == 1'b1)
 ? ? ? ? ? begin
 ? ? ? ? ? ? ? if( Yn[i-1][31] == 1'b0)
 ? ? ? ? ? ? ? begin
 ? ? ? ? ? ? ? ? ? Xn[i] <= Xn[i-1] + (Yn[i-1] >>> (i-1));
          Yn[i] <= Yn[i-1] - (Xn[i-1] >>> (i-1));
          Zn[i] <= Zn[i-1] + rot[i-1];
 ? ? ? ? ? ? ? end
 ? ? ? ? ? ? ? else
 ? ? ? ? ? ? ? begin
 ? ? ? ? ? ? ? ? ? Xn[i] <= Xn[i-1] - (Yn[i-1] >>> (i-1));
          Yn[i] <= Yn[i-1] + (Xn[i-1] >>> (i-1));
          Zn[i] <= Zn[i-1] - rot[i-1];
 ? ? ? ? ? ? ? end
 ? ? ? ? ? end
 ? ? ? ? ? else
 ? ? ? ? ? begin
 ? ? ? ? ? ? ? Xn[i] <= Xn[i];
 ? ? ? ? ? ? ? Yn[i] <= Yn[i];
 ? ? ? ? ? ? ? Zn[i] <= Zn[i];
 ? ? ? ? ? end
 ? ? ? end
 ? end
endgenerate

這里沒有乘cosθ,最后的Xn會比真實值大1.64倍左右,所以還需要對其進行一個縮小操作,通過右移來近似實現(xiàn)。

assign cordic_ack = cal_delay[16];
assign theta   = Zn[16];
assign amplitude = (Xn[16] >>> 1) + (Xn[16] >>> 3); ////幅度,偏大1.64倍,這里做了近似處理

然后就是仿真了,給了X=Y=15,也就是角度為45度,幅值21.213,擴大65536倍為1,376,256??梢钥吹浇Y果近似。

52e5fc36-5cc5-11ee-939d-92fbcf53809c.png








審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FPGA
    +關注

    關注

    1653

    文章

    22270

    瀏覽量

    629772
  • 存儲器
    +關注

    關注

    39

    文章

    7712

    瀏覽量

    170775
  • CORDIC算法
    +關注

    關注

    0

    文章

    17

    瀏覽量

    9951
  • Verilog語言
    +關注

    關注

    0

    文章

    113

    瀏覽量

    8721
  • 姿態(tài)解算

    關注

    0

    文章

    49

    瀏覽量

    8585

原文標題:【經(jīng)驗分享】FPGA實現(xiàn)Cordic算法求解arctanθ

文章出處:【微信號:FPGA研究院,微信公眾號:FPGA研究院】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    FPGA使用Cordic算法求解角度正余弦值

    在進行坐標變換的時候,需要計算角度的正余弦值,而在FPGA中是不能直接進行求解的,需要采用其它的方式進行求解。
    的頭像 發(fā)表于 06-19 09:54 ?1122次閱讀
    <b class='flag-5'>FPGA</b>使用<b class='flag-5'>Cordic</b><b class='flag-5'>算法</b><b class='flag-5'>求解</b>角度正余弦值

    基于改進的CORDIC算法的FFT復乘及其FPGA實現(xiàn)

    ,所以CORDIC算法的移位、加減法運算和流水線結構更容易在FPGA實現(xiàn)。本文在Altera公司的QuartusⅡ7.2軟件環(huán)境下使用VHDL,利用上述各種
    發(fā)表于 07-11 21:32

    CORDIC 算法

    我現(xiàn)在寫著一個CORDIC 的 verilog 代碼,但在邏輯上遇到問題。https://www.edaplayground.com/x/3tHk , 為何 y[2] == 0 ? -->
    發(fā)表于 05-14 00:32

    請問能不能用CORDIC算法代替ROM表,用FPGA實現(xiàn)CORDIC算法來控制AD9910?

    正在做一個課題,用FPGA控制AD9910,但是本人想把基于ROM表的改成基于CORDIC算法的,這樣還能不能用FPGA實現(xiàn)控制AD9910
    發(fā)表于 12-01 08:47

    LabVIEW FPGA CORDIC IP核的arctan使用方法

    使用LabVIEW FPGA模塊中的CORDIC IP核,配置arctan(X/Y)算法,配置完成之后,IP核只有一個輸入。我參考網(wǎng)上VHDL CO
    發(fā)表于 09-10 20:07

    FPGA設計中必須掌握的Cordic算法

    大多數(shù)工程師在碰到需要在 FPGA實現(xiàn)諸如正弦、余弦或開平方這樣的數(shù)學函數(shù)時,首先會想到的是用查找表,可能再結合線性內(nèi)插或者冪級數(shù)(如果有乘法器可用)。不過對這種工作來說,CORDIC
    發(fā)表于 09-19 09:07

    怎么利用CORDIC算法FPGA實現(xiàn)高速自然對數(shù)變換器?

    本文利用CORDIC算法FPGA實現(xiàn)了高速自然對數(shù)變換器。
    發(fā)表于 04-30 06:05

    高性能HPOR CORDIC算法實現(xiàn)

    CORDIC 算法在通信和圖像處理等各個領域有著廣泛的應用,但是浮點CORDIC 由于迭代延時大且實現(xiàn)復雜沒有得到很好的應用,本文提出了一種修正浮點
    發(fā)表于 12-15 14:27 ?15次下載

    利用CORDIC算法FPGA實現(xiàn)可參數(shù)化的FFT

    針對在工業(yè)中越來越多的使用到的FFT,本文設計出了一種利用CORDIC算法FPGA實現(xiàn)快速FFT的方法。CORDIC
    發(fā)表于 08-09 15:39 ?55次下載

    基于CORDIC算法2FSK調(diào)制器的FPGA設計

    本文提出了應用CORDIC(Coordinate Rotation Digital Computer)算法實時計算正弦值的方案,并基于CORDIC算法
    發(fā)表于 05-31 10:22 ?2185次閱讀
    基于<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>2FSK調(diào)制器的<b class='flag-5'>FPGA</b>設計

    雙模式CORDIC算法FPGA實現(xiàn)

    CORDIC算法將復雜的算術運算轉(zhuǎn)化為簡單的加法和移位操作,然后逐次逼近結果。這種方法很好的兼顧了精度、速度和硬件復雜度,它與VLSI技術的結合對DSP算法的硬件實現(xiàn)具有極大的意義
    發(fā)表于 06-27 17:27 ?66次下載
    雙模式<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>的<b class='flag-5'>FPGA</b><b class='flag-5'>實現(xiàn)</b>

    基于FPGACordic算法實現(xiàn)的設計與驗證

    本文是基于FPGA實現(xiàn)Cordic算法的設計與驗證,使用Verilog HDL設計,初步可實現(xiàn)正弦、余弦、反正切函數(shù)的
    發(fā)表于 07-03 10:18 ?3365次閱讀
    基于<b class='flag-5'>FPGA</b>的<b class='flag-5'>Cordic</b><b class='flag-5'>算法</b><b class='flag-5'>實現(xiàn)</b>的設計與驗證

    基于CORDIC的高速Sobel算法實現(xiàn)

    為提高圖像邊緣檢測的處理速度,提出一種基于CORDIC的高速Sobel算法實現(xiàn)。
    的頭像 發(fā)表于 10-05 09:54 ?4038次閱讀
    基于<b class='flag-5'>CORDIC</b>的高速Sobel<b class='flag-5'>算法</b><b class='flag-5'>實現(xiàn)</b>

    如何使用FPGA實現(xiàn)CORDIC算法在跟蹤環(huán)中的應用

    主要介紹了坐標旋轉(zhuǎn)數(shù)字計算(CORDIC算法在US,g,鑒別器中的應用,包括碼跟蹤環(huán)、鎖頻環(huán)和鎖相環(huán)鑒別器,并進行了FPGA實現(xiàn)。在設計中,采用統(tǒng)一
    發(fā)表于 01-22 16:12 ?9次下載
    如何使用<b class='flag-5'>FPGA</b><b class='flag-5'>實現(xiàn)</b><b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>在跟蹤環(huán)中的應用

    基于流水線CORDIC算法通用數(shù)字調(diào)制器的FPGA實現(xiàn)方案

    電子發(fā)燒友網(wǎng)站提供《基于流水線CORDIC算法通用數(shù)字調(diào)制器的FPGA實現(xiàn)方案.pdf》資料免費下載
    發(fā)表于 10-27 09:46 ?1次下載
    基于流水線<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>通用數(shù)字調(diào)制器的<b class='flag-5'>FPGA</b><b class='flag-5'>實現(xiàn)</b>方案