色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

使用Verilog HDL設計實現Cordic算法

lp7u_bia ? 來源:硅農 ? 作者:硅農 ? 2021-08-16 11:21 ? 次閱讀

任何適合產品實現的算法,都是將簡易實現作為第一目標。CORDIC算法是建立在適應性濾波器、FFT、解調器等眾多應用基礎上計算超越函數的方法。其核心思想是二分逐次逼近。

CORDIC(Coordinate Rotation Digital Computer)算法即坐標旋轉數字計算方法,是J.D.Volder1于1959年首次提出,主要用于三角函數、雙曲線、指數、對數的計算。該算法通過基本的加和移位運算代替乘法運算,使得矢量的旋轉和定向的計算不再需要三角函數、乘法、開方、反三角、指數等函數。

本文是基于使用Verilog HDL設計實現Cordic算法,實現正弦、余弦、反正切函數的實現。將復雜的運算轉化成RTL擅長的加減法和乘法,而乘法運算可以用移位運算代替。Cordic算法有兩種模式,旋轉模式和向量模式。可以在圓坐標系、線性坐標系、雙曲線坐標系使用。本文初步實現在圓坐標系下的兩種模式的算法實現。

cfefd67e-fdb9-11eb-9bcf-12bb97331649.png

旋轉模式,迭代位移算法。假設有一點P0(x0,y0),經過逆時針旋轉角度θ,到達點Pm(xm,ym),我們根據數學運算可以得到公式如下:

xm = x0cosθ - y0sinθ

= cosθ(x0 – y0tanθ)

ym = x0sinθ +y0cosθ

=cosθ(x0tanθ+y0)

如果不考慮旋轉后的向量模值,只考慮旋轉角度,即去掉cosθ,得到如下方程式。這里旋轉的角度的正確的,但xm和ym的值增加。cosθ值是小于等于1的,它的倒數值大于等于1,所以xm和ym模值增大了。去掉cosθ項可以方便我們后面的坐標平面旋轉的計算。這里稱為偽旋轉。

xm = x0 – y0tanθ ym =x0tanθ+y0

Cordic的方法核心就是偽旋轉,將旋轉角θ細化成若干個大小固定的角度θi,規定θi滿足tanθi = 2^-i,通過一系列的迭代旋轉,每次旋轉θi,i為迭代次數,規定∑θi的范圍即旋轉角度θ的范圍為[-99.7, 99.7]。如果θ的大于這個范圍則可通過三角運算操作轉化到該范圍的角度。

我們通過事先將所有每次旋轉的角度計算出來,由于每次旋轉的角度是固定的,所以經過i次旋轉的∑θi可能會超過θ,所以就必須設置一個方向值di,如果旋轉角度之和已經小于θ,則di為1,下次旋轉繼續為逆時針旋轉,如果旋轉角度之和大于θ,則di為-1,下次旋轉為順時針。設置zi+1為旋轉剩余角度,zi+1 = z0 – di *zi,z0 = θ,隨著i值的增大,zi+1會趨向于0時,即旋轉結束。di與zi的符號位相同。

采用偽旋轉的方法,每次提出一個cosθi,旋轉結束后會產生一個∏cosθi的累乘,一旦我們確定了迭代次數,∏cosθi就是一個常數,迭代公式可寫為。這是將cosθi提出、tanθi 替換成 2^-i后的結果。di與zi的符號位相同。

xi+1 = xi - di * yi * 2^-i yi+1 = yi + di * xi * 2^-i zi+1 = z0 - di * θi

設迭代i = n - 1,那么旋轉n次后得到Pm的坐標應該為(xn * ∏cosθi, yn * ∏cosθi)。因為每次迭代都會提出一個cosθi,旋轉n次后的xn和yn就會少乘一個∏cosθi,所以實際上最終的Pm坐標角度近似于(xn * ∏cosθi, yn * ∏cosθi)。

xn * ∏cosθi = x0cosθ - y0sinθ yn * ∏cosθi = y0cosθ + x0sinθ xn = 1/∏cosθi (x0cosθ – y0sinθ) yn = 1/∏cosθi (y0cosθ +x0sinθ)

伸縮因子,KN = 1 / ∏cosθi,已知迭代次數,我們可以預先計算KN的值。如下這是使用MATLAB計算出的迭代結果數值。

xn =KN (x0cosθ – y0sinθ) yn = KN (y0cosθ +x0sinθ)

從上表可以得出,我們預先計算出KN的值,然后令x0 = ∏cosθi,y0 = 0,則上述公式可化簡為

xn = cosθ yn = sinθ 即可實現正弦、余弦操作了。旋轉模式

Cordic算法旋轉模式使用Verilog HDL的實現流程

確定迭代次數,將每次迭代的角度計算出來,預先定義為參數,為了避免浮點運算,將角度值向左移位16位,取整數部分。

根據迭代公式進行迭代計算,本設計取16次迭代,從上表可以看出,當迭代次數越大時,1/∏cosθi會趨向于一個確定值。如果對結果精度要求更高,可以設置更高的迭代次數,根據迭代次數,可以將伸縮因子KN = 1/∏cosθi計算出來。同樣將其左移16位。

xi+1 = xi - di * yi * 2^-i yi+1 = yi + di * xi * 2^-i zi+1 = z0 - di * θi

設置x0 = ∏cosθi,y0 = 0,則求出x16 = cosθ,y16 = sinθ。

這里需要注意的是,我們在進行迭代運算的時候,將2^-i變成移位運算,對于正余弦來說是有正負的,所以在一開始定義的時候,就應該定義成有符號數,Verilog中也可以定義有符號數,最高位表示符號位,定義如下

d05925c0-fdb9-11eb-9bcf-12bb97331649.jpg

迭代寄存器定義為有符號數,那么我們移位運算就不能用>>邏輯右移<<邏輯左移或來移位了,而是用>>>算術右移和<<<算術左移。邏輯左移也就相當于算數左移,右邊統一添0?,邏輯右移,左邊統一添0?,算數右移,左邊添加的數和符號有關。

例如1010_1010, []是添加的位 邏輯左移一位:0101_010[0] 算數左移一位:0101_010[0] 邏輯右移一位:[0]101_0101 算數右移一位:[1]101_0101

迭代運算采用16級流水線進行運算,最終需要判斷輸出的正余弦值在哪個象限,前面講旋轉角度θ的范圍為[-99.7,99.7],不在這個范圍我們要進行三角運算使其滿足這個范圍,當輸入的角度小于90度即可進行計算,當輸入角度大于90度小于180度,將輸入角度減去90度并設定當前角度處于第二象限,然后進行計算,當輸入角度大于180度小于270度,將輸入的角度減去180度設置當前角度處于第三象限,進行計算,當輸入的角度大于270度,減去270設置當前角度處于第四象限,進行計算。象限的設定通過quarant寄存器實現。

如果角度在第一象限,sin(x) = sin(a),cos(x) = sin(a)最后的結果x16 = cosθ, y16 = sinθ,這里我想起了那句口訣,一全正,二正弦,三正切,四余弦

如果角度在第二象限,

sin(x) = sin(a+90) = cos(a),

cos(x) = cos(a+90) = -sin(a)

如果角度在第三象限,

sin(x) = sin(a+180) = -sin(a),

cos(x) = cos(a+180) = -cos(a)

如果角度在第四象限,

sin(x) = sin(a+270) = cos(a),

cos(x) = cos(a+270) = -sin(a)

d0a88142-fdb9-11eb-9bcf-12bb97331649.png

對于正數,我們直接賦值輸出,負數,這里使用有符號數表示,將其取反加1即可。最終使用modelsim對算法進行仿真,從波形圖上看已經初步實現了sin,cos函數。

向量模式

Cordic算法在向量模式下的計算方法和旋轉模式基本上是類似的,設有一點P0(x0, y0),經過旋轉一定角度到與x軸重合,得到點Pm(xm, ym),即ym = 0。

xm = x0cosθ - y0sinθ

= cosθ(x0 – y0tanθ)

ym = y0cosθ + x0sinθ

= cosθ(y0 +x0tanθ) = 0

我們設置x0 = x, y0 = y, z0 = 0,迭代次數為16,經過16次迭代后得到zn = θ = arctan(y/x)和坐標所代表的向量的模值d = xm = xn * ∏cosθi,di與yi方向相反,即當時結束運算。實現方法為判斷yi的符號位,符號位為1,di為1,符號位為0,di為-1。

xi+1 = xi - di * yi * 2^-i

yi+1 = yi + di * xi * 2^-i

zi+1 = z0 - di * θi

關于反正切函數,由于在[-99.7°,99.7°]范圍內,所以我們輸入向量P0(x0, y0)時,需要保證其在第一、四象限。

d0feb292-fdb9-11eb-9bcf-12bb97331649.png

下面是使用MATLAB計算出來的數據和FPGA計算出來的數據進行比較。

d11d1bc4-fdb9-11eb-9bcf-12bb97331649.jpg

d141af8e-fdb9-11eb-9bcf-12bb97331649.jpg

從FPGA計算出的結果與MATLAB來比較,和實際結果之間的誤差還是挺小的,畢竟是硬件計算出來的數據,向量的誤差就比較大了,如果對于精度比較高的計算,我們可以通過提高迭代次數來提高精度

使用ISE進行綜合并下載工程到開發板上實驗結果比較。

旋轉模式

Sin的理論數據

Chipscope抓取到的數據

d159baca-fdb9-11eb-9bcf-12bb97331649.jpg

Cos的理論數據

d1a7c7ec-fdb9-11eb-9bcf-12bb97331649.jpg

Chipscope抓取到的數據

d1c563e2-fdb9-11eb-9bcf-12bb97331649.jpg

向量模式

Arctan(y/x)理論數值

d1eb7820-fdb9-11eb-9bcf-12bb97331649.jpg

Chipscope抓取到的數據

d20cba58-fdb9-11eb-9bcf-12bb97331649.jpg

坐標的模值的理論數據

責任編輯:haq

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

    關注

    28

    文章

    1351

    瀏覽量

    110154
  • HDL
    HDL
    +關注

    關注

    8

    文章

    327

    瀏覽量

    47409

原文標題:基于Verilog的Cordic算法實現

文章出處:【微信號:bianpinquan,微信公眾號:變頻圈】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Verilog 與 ASIC 設計的關系 Verilog 代碼優化技巧

    Verilog與ASIC設計的關系 Verilog作為一種硬件描述語言(HDL),在ASIC設計中扮演著至關重要的角色。ASIC(Application Specific Integrated
    的頭像 發表于 12-17 09:52 ?148次閱讀

    Verilog與VHDL的比較 Verilog HDL編程技巧

    Verilog 與 VHDL 比較 1. 語法和風格 VerilogVerilog 的語法更接近于 C 語言,對于有 C 語言背景的工程師來說,學習曲線較平緩。它支持結構化編程,代碼更直觀,易于
    的頭像 發表于 12-17 09:44 ?212次閱讀

    數字系統設計與Verilog HDL

    數字系統設計與Verilog HDL 1.兼職職位 ,不坐班,等待公司分配任務,時間自由 2.薪資: 200-5000不等可具體協商 3.要求:國內985/211院校在讀或畢業,或者國外前100的院校 4.英語水平:四級500+/六級440+/雅思6.5+/托福90+
    發表于 11-06 17:57

    Verilog硬件描述語言參考手冊

    一. 關于 IEEE 1364 標準二. Verilog簡介三. 語法總結四. 編寫Verilog HDL源代碼的標準五. 設計流程
    發表于 11-04 10:12 ?2次下載

    Verilog HDL的基礎知識

    本文繼續介紹Verilog HDL基礎知識,重點介紹賦值語句、阻塞與非阻塞、循環語句、同步與異步、函數與任務語法知識。
    的頭像 發表于 10-24 15:00 ?480次閱讀
    <b class='flag-5'>Verilog</b> <b class='flag-5'>HDL</b>的基礎知識

    FPGA Verilog HDL有什么奇技巧?

    相加去乘? A:硬件乘法器具有重要意義,主要體現在以下幾個方面: 速度優勢:在數字電路中,直接使用移位相加的方法實現乘法在速度上通常比通過軟件或簡單的邏輯運算(如在 Verilog 中直接寫 a * b
    發表于 09-12 19:10

    FPGA verilog HDL實現中值濾波

    今天給大俠簡單帶來FPGA verilog HDL實現中值濾波,話不多說,上貨。一、實現步驟: 1、查看了中值濾波實現相關的網站和pa
    發表于 06-18 18:50

    fpga 工程師應該掌握的

    1.熟悉FPGA架構及應用,熟悉圖像算法的FPGA實現。 2.熟悉verilog hdl,熟悉Xilinx或Intel等開發工具。 3.有AI算法
    發表于 05-30 17:08

    FPGA設計中 Verilog HDL實現基本的圖像濾波處理仿真

    今天給大俠帶來FPGA設計中用Verilog HDL實現基本的圖像濾波處理仿真,話不多說,上貨。 1、用matlab代碼,準備好把圖片轉化成Vivado Simulator識別的格式,即每行一
    發表于 05-20 16:44

    深度解析CORDIC算法原理

    CORDIC算法的思想是通過迭代的方法,使得累計旋轉過的角度的和無限接近目標角度。它是一種數值計算逼近的方法,運算只有移位和加減。
    的頭像 發表于 04-29 16:48 ?2891次閱讀
    深度解析<b class='flag-5'>CORDIC</b><b class='flag-5'>算法</b>原理

    有什么好用的verilog HDL編輯工具可用?

    有什么好用的verilog HDL編輯工具可用?最好能集成實時的verilog HDL語法檢測、自定義模塊識別觸發等功能,最好能夠免費;
    發表于 04-28 11:00

    verilog function函數的用法

    Verilog 是一種硬件描述語言 (HDL),主要用于描述數字電子電路的行為和結構。在 Verilog 中,函數 (Function) 是一種用于執行特定任務并返回一個值的可重用代碼塊。函數在
    的頭像 發表于 02-22 15:49 ?5836次閱讀

    Verilog HDL數字集成電路設計方法概述

    電子發燒友網站提供《Verilog HDL數字集成電路設計方法概述.zip》資料免費下載
    發表于 02-03 09:27 ?2次下載

    通過HDL制作了一個4位計數組件VERILOG ,如何設置像這些標準組件這樣的API?

    我通過 HDL 制作了一個 4 位計數組件 VERILOG ,如何設置像這些標準組件這樣的 API? 例如 counter_writeCounter ()、counter_readCounter () 的命令。
    發表于 01-25 06:06

    #2024,立Flag了嘛? #spinal HDL的基本模塊結構

    ]):Unit = { SpinalVerilog(new Demo01)// 生成對應的Verilog HDL文件 } } 生成對應的Verilog HDL // Gener
    發表于 01-21 11:15
    主站蜘蛛池模板: 天津相声广播在线收听| 好硬好湿好爽再深一点视频| 99久久精品国产交换| 国产成人精品免费视频大全办公室| 狠狠色香婷婷久久亚洲精品| 日本一二三区视频在线| 一本久道久久综合狠狠躁AV| 在线免费观看国产视频| 超碰在线vip| 美女视频黄a视频全免费网站色窝 美女伸开两腿让我爽 | 女bbbbxxx孕妇| 翁止熄痒禁伦短文合集免费视频| 52色擼99热99| 久久成人亚洲| 亚洲蜜芽在线观看精品一区| 国产白丝JK被疯狂输出视频| 欧美午夜特黄AAAAAA片| 0951影音在线| 久久久久九九| 亚洲人成无码久久久AAA片| 国产精品青草久久福利不卡 | 国产成人在线视频网站| 日韩中文网| 囯产愉拍亚洲精品一区| 亚洲 欧美 国产 伦 综合| 国产自啪偷啪视频在线| 伊人久久影院大香线蕉| 毛片在线全部免费观看| GOGOGO高清在线播放韩国| 日日射日日操| 簧片在线免费观看| 91久久99久91天天拍拍| 日本妈妈JMZZZZZ| 国产欧美日韩网站| 亚洲视频中文字幕在线| 美国xaxwaswaskino| 成片在线看一区二区草莓| 亚洲 欧美 国产 伦 综合| 久久精品亚洲AV高清网站性色| 99视频精品全部免费观看| 熟女久久久久久久久久久|