基於CORDIC算法的32位浮點三角超越函數之正餘弦函數的FPGA實現

2020-12-17 電子產品世界

摘要: 本文在傳統CORDIC算法的基礎之上,通過增加迭代次數,對參數進行了優化篩選,提高了運算精度,使設計出的軟核能夠在精度要求較高的場合中運行,如實時語音、圖像信號處理、濾波技術等。輸出數據經過IEEE-754標準化處理,能夠直接兼容大多數處理器,擴展了其應用範圍。最終在Altera公司NiosⅡ處理器中通過增加自定義指令的方式完成了硬體實現。

關鍵詞: CORDIC自定義指令IEEE-754標準化處理

引言

浮點超越函數的應用領域十分廣泛,涉及航空航天、機器人技術、實時語音、圖像信號處理、濾波技術、FFT變換等領域。因此,設計並實現浮點三角超越函數是非常重要的。硬體實現的超越函數算法,按照數學公式和對應的實現方式的不同,可以分為查表法、多項式近似法、基於查表的多項式結合方法、有理數近似和逐位法五類。經過對這些算法進行分析和比較,本文選擇 CORDIC作為超越函數的算法,並用Altera公司的CycloneⅡ晶片完成硬體實現。

CORDIC內核及前後處理單元設計

CORDIC內部結構


在迭代式架構下,內部CORDIC結構如圖1所示。

圖1  經典CORDIC硬體實現架構

圖1中架構由控制單元,選擇器,移位寄存器,ROM,加法器組成。系統的控制單元採用有限狀態機的實現形式,進行迭代和數據格式轉換的流程控制。ROM中存放的是預先計算好的反正切數據值,供迭代運算中調用。從架構中可以看出只有移位與加減運算,因此特別適合於用硬體實現。每次迭代運算後,再將數據返回,直到足夠的次數執行完成後,才將結果輸出。每次迭代之前要對角度值Z進行判斷,根據Z的符號來決定圖1中的符號。

實現該部分的關鍵代碼如下:
if(~z[31])
 begin
  x <= x - (y >>> counter);
  y <= y + (x >>> counter);
  z <= z - atan;
  end
else
 begin
  x <= x + (y >>> counter);
  y <= y - (x >>> counter);
  z <= z + atan;
 end  

前置處理單元

由於迭代本身的限制,最大旋轉角度用公式表示為:

     (1)
為了擴展輸入角的範圍,需要對輸入角進行預處理,使其落在第一象限範圍之內。即對輸入角度進行取模,根據所處的象限進行符號判斷和正餘弦交換。在CORDIC內核設計中,對0_範圍內的角度用一個32位的二進位整數來表示,即101101100000101101100000(即十進位數11930464)。

後置處理單元

後置處理將內部CORDIC計算出來的結果在輸出前轉換成IEEE-754標準格式,即形式,其結構如圖2所示。

圖2  後置處理單元硬體結構

圖2中的LZDC(Leading zero detection circuit)為前導零檢測電路,其功能是用來統計數據從最高位開始連續「0」的個數,再根據它把計算出來的數值轉換成IEEE-754標準格式。在轉換過程中需要對尾數進行左移,才能表示為,此位移量再與前置處理器單元傳來的參考指數值相減,得到輸出指數值。符號位直接由前置處理過程得到。最後將符號位、指數數值、小數按位連接得到IEEE-754格式的數據,並從硬體接口輸出端輸出。

設計及軟體仿真波形

用Quartus II對本設計進行了軟體波形仿真,選取角度值分別為、、和(即-)。

以為例,iAngle的十進位數為(/360)*88.8= 1059425266(小數部分忽略),十六進位表示為3F258BF2。oCos的內部仿真結果十六進位值為3FFD8131,對應的IEEE-754標準格式值oCos_IEEE754為3F7FF804,即十進位數0.020942,正弦的計算過程同理。

仿真結果對照如表1所示。

從表中可以看出,在(0_)輸入範圍內,用本設計計算仿真出的結果誤差小於10-6,在單精度表示範圍內誤差為0,且輸出表示為標準IEEE754類型。一次計算所需時鐘周期數為34。

自定義指令

Altera公司NiosⅡ處理器增加了多達256條用戶自定義指令,這是其它SOC系統無法比擬的。用戶自定義就是讓NiosⅡ軟核完成一個用HDL描述的電路模塊功能。用戶自定義指令可以在幾個時鐘周期之內完成複雜算法的處理能力,訪問存儲器或系統外的邏輯單元,加快專項任務的執行,以達到優化目的。通過用戶自定義指令可以把系統中用軟體處理中的耗時多的關鍵算法用硬邏輯電路來實現,大大提高處理器的效率。由於CORDIC內核的特性,正餘弦函數可以同時計算出來,因此適合於採用擴展用戶自定義指令來實現,即用一個硬體模塊來完成兩種函數的計算。通過一個附加的參數n來決定輸出是正弦或餘弦,這樣可以節約一半的硬體資源。本文在NIOSⅡ中增加了正餘弦自定義指令,其宏定義代碼如下:

#define MYCORDIC_N 0x00000002
#define MYCORDIC_N_MASK ((1<<1)-1)
#define FLOAT_COS(A)  __builtin_custom_fni(MYCORDIC_N+( 1&MYCORDIC_N_MASK),(A))
#define FLOAT_SIN(A)  __builtin_custom_fni(MYCORDIC_N+ (0&MYCORDIC_N_MASK),(A))

加入指令後,在NiosⅡ的IDE中進行軟硬體同時調試,相應的C語言測試代碼在此省略,給出對比結果如圖3和圖4所示。

圖3

圖4

本系統硬體驗證平臺採用DE2開發板,其中NiosⅡ處理器配置為full功能,分別使用16K數據cache和16K指令cache,增加了硬體乘法器和硬體除法器,開啟了流水線功能,已達到了NiosⅡ軟核處理器的最高性能。

從結果對比中看出,使用硬體指令後對完全相同的正餘弦角度進行計算時,其運算速度大大提高。需要說明的是,軟體運算隨著輸入角度的不同所使用的計算時間有很大差別,而使用硬體指令運算是,其計算時間基本不變。詳細對比如表2所示。

誤差方面,軟硬體運算在六位小數範圍內其誤差值為0,可見本設計確實達到了高精度的要求。

結語

本設計以提高處理器精度和速度為目標,通過在NiosⅡ處理器中添加用戶自定義指令的方式以更多的硬體資源換取更快的計算速度,從而滿足現代實時通訊處理的要求。在傳統CORDIC算法的基礎之上,巧妙的改進了算法,達到了更高精度和更快的速度,具有較廣泛的應用價值。當然,本設計只完成了正餘弦函數的硬體IP部分,還有更多的工作等待我們去完成,相信通過不斷的努力,我們會完成更多的函數硬體IP。

參考文獻
1.  Volder. The CORDIC trigonometric computing teclu}ique. IRE Trans. Electronic Computers, 1959, EC-8(3): 334-334.
2.  Richard Herveille. Cordic Core Specification . 18, 2001
3.  潘宏亮.浮點指數類超越函數的運算算法研究與硬體實現.西北工業大學 2006.3
4.  IEEE organise.IEEE Standard for Binary Floating-Point Arithmetic Inc 345 East 47th Street, New York, NY 10017, USA
5.  王博立.浮點運算CORDIC之實現與其在3D圖形學之應用.臺灣國立中山大學 2002.6
6.  www.Altera.com
7.  www.opencore.org
8.  www.edacn.net


相關焦點

  • Cordic算法(sinx,cosx)的Verilog實現
    該算法通過基本的加和移位運算代替乘法運算,使得矢量的旋轉和定向的計算不再需要三角函數、乘法、開方、反三角、指數等函數【2】。為什麼要用cordic算法?首先根據上述的解釋,我們可以看出:cordic算法的最大特點是使用加減法和移位操作實現初等函數的計算。
  • 基於Verilog的Cordic算法實現
    任何適合產品實現的算法,都是將簡易實現作為第一目標。CORDIC算法是建立在適應性濾波器、FFT、解調器等眾多應用基礎上計算超越函數的方法。
  • 基於CORDIC改進算法的DDS設計
    關鍵詞: 直接數字頻率合成;CORDIC算法;Matlab 傳統DDS是由美國學者Tierney 等提出,採用查找表結構實現,很難滿足數位訊號處理領域中高精度、高解析度、實時運算的要求。而採用基於CORDIC算法的DDS結構可以很容易地滿足這些要求,且易於採用流水線技術,因此這一技術越來越多的用於雷達等電子系統中[1]。
  • 技術宅驚世之作 《我的世界(Minecraft)》如何打造計算機
    正餘弦就算出來了。沒了。  用在硬體上的優勢是,該算法從矩陣去除cos因子之後就在盡力構造簡易的二進位運算比如加減和移位。  註:1.由於我懶得去用數學軟體打公式,以上數學公式的圖片均截取自一篇來自桂林電子科技大學李全,陳石平和付佃華的論文《基於CORDIC 算法的32 位浮點三角超越函數之正餘弦函數的FPGA 實現》2.我不打算讓三角函數運算單元加入
  • 基於CORDIC 2FSK調製器的FPGA設計
    提出一種基於流水線CORDIC算法的2FSK調製器的FPGA實現方案,可有效地節省FPGA的硬體資源,提高運算速度。最後,給出該方案的硬體測試結果,驗證了設計的正確性。0 引言 頻移鍵控(FSK)是用不同頻率的載波來傳送數位訊號,並用數字基帶信號控制載波信號的頻率。
  • 數字式正餘弦函數產生器的實現方法
    摘要:根據雷達光柵顯示器的應用要求,提出一種基於FPGA的數字式正餘弦函數產生器的解決方案。論述了如何用數字電路來實現正餘弦函數計算的過程。方案不但可以用於雷達光柵掃描顯示器的坐標變換器,而且適用於通訊領域等其它需要正餘弦函數的波形產生器的場合。關鍵字:雷達:光柵掃描顯示器;正餘弦函數產生器;坐標轉換。
  • FPGA之CORDIC算法:①CORDIC的基本原理介紹
    此時呢,我們會建議你調用IP核來實現運算操作,雖然這樣也會消耗許多邏輯資源,但產生的延時相對較小滿足了你基本的需求。問題好像迎刃而解了,可是仔細一想,除了這些運算,我們還剩下什麼?對呀,三角函數,反三角函數,對數函數,指數函數呢,這些函數我們在高中就學習了的呀,難道在FPGA中就沒有用武之地嗎?
  • 3G系統中AGC的FPGA設計實現
    agc在系統中的位置如圖1虛線框所示:    3 agc系統的fpga實現    根據agc所實現的功能  ,在fpga中將agc模塊分為如下幾個部分來實現:  3.1 數據幹路模塊    從RSP接口來10位二進位補碼數據I1和Q1,與求指數模塊傳送來的預放大增益
  • 基於FPGA的CORDIC算法的改進及實現
    1 CORDIC算法原理 1959年,VOLDER開發了一類計算三角函數、雙曲函數的算法,其中包括指數和對數運算。此算法的基本思想是用一系列固定的與運算基數相關的角度不斷偏擺從而逼近所需的角度。從廣義上講它是提供一個數值計算的逼近方法。由於這些固定的角度只與計算基數有關,運算只有移位和加減。
  • 基於MATLAB在FPGA 算法上浮點定點轉換的實現
    浮點定點轉換是在 FPGA 上實現算法時最困難的地方(圖 1)。例如,由於定點算術中精度較低,新的數學誤差被引入算法。您必須重寫代碼,使用能夠反映實際硬體宏架構的低級模型來替換高級函數和運算符。而仿真運行時間將可能長達 50 倍之久。基於這些原因,MATLAB,這一算法開發的優勢選擇,卻經常遭到遺棄,轉而使用 C/C++ 進行定點建模。
  • 基於CORDIC算法和FPGA的數字頻率校正的實現
    打開APP 基於CORDIC算法和FPGA的數字頻率校正的實現 佚名 發表於 2010-11-16 10:05:31   頻偏校正電路中通常需要根據給定相位產生餘弦信號和正弦信號,其中最重要的實現技術是CORDIC (Coordinate Rotation Digital Computer,坐標旋轉數字計算機)算法。本文將詳細分析CORDIC算法的原理及其FPGA實現方法。
  • 教學研討 | 正弦函數和餘弦函數的圖象與性質
    三角函數是把已經學習過的三角比的知識和函數知識結合起來,是刻畫生活中周期現象問題的典型的函數模型,在高中數學知識體系中佔有十分重要的地位。本節課作為《三角函數》開篇的第一課時,主要解決了正弦、餘弦函數的定義和其圖像的畫法問題,為後面更好地學習三角函數的性質打下牢固的基礎。
  • FPGA中的浮點四則運算
    在本文中,運用在前一節中描述的自定義浮點格式FPGA中數的表示方法(下),完成浮點四則運算的實現過程1.自定義浮點格式加(減)法運算基於FPGA 實現的浮點加法運算包括了一系列對尾數和指數部分的操作:移位、交換、格式化、捨入和格式化等。如下圖所示,自定義浮點流水加法器實現結構主要分為兩部分:基本加法器部分和格式化操作部分。
  • 教學研討 | 正弦函數和餘弦函數的圖像與性質
    關於作圖方面,在前面函數的章節中,學生已經學習了畫函數圖像的一些方法,如冪函數、指數函數、對數函數等可以用列表描點法、圖像平移翻折等方法作出其圖像。基於上述情況,預測學生對於本節課的內容,會有以下的一些困難:1.概念的引出,把三角與函數兩個概念結合起來,正確理解正弦函數和餘弦函數。2.利用單位圓的正弦線作出正弦函數在上的圖像。
  • 基於IQmath庫的定點DSP算法設計
    摘要:基於TI公司提供的IQmath庫實現在定點DSP晶片TMS320F28xx上進行精確的浮點運算,方便開發人員採用C/C++編寫浮點運算程序,可以節省設計和調試時間。
  • 三角幾何篇-函數圖形與表示
    當然我們可以對 r 開平方根將這個特性強行改成 k 為正整數。以下是具體代碼的實現,計算機如何計算 sine,cosine 泰勒級數小節提到了 正餘弦函數的泰勒級數展開 或者我們在正交性部分提到的切比雪夫多項式,都屬於使用多項式函數近似逼近三角函數的構造法。計算過程會大量使用浮點運算(flops), 有些設備可能缺乏硬體乘法器,用級數方法會很耗時。
  • 基於FPGA的高速流水線浮點乘法器設計與實現
    同時由於基於IEEE754 標準的浮點運算具 有動態範圍大,可實現高精度,運算規律較定點運算更為簡捷等特點,浮點運算單元的設計 研究已獲得廣泛的重視。本文介紹了 32 位浮點乘法器的設計,採用了基4 布思算法,改進的4:2 壓縮器及布思 編碼算法,並結合FPGA自身特點,使用流水線設計技術,在實現高速浮點乘法的同時,也 使是系統具有了高穩定性、規則的結構、易於FPGA 實現及ASIC 的HardCopy 等特點。
  • 基於FPGA的正交數字混頻器中數控振蕩器的設計與實現
    首先推導了算法產生正餘弦信號的實現過程,然後給出了在中設計數控振蕩器的頂層電路結構,並根據算法特點在設計中引入流水線結構設計。本文引用地址:http://www.eepw.com.cn/article/201809/388994.htmCORDIC算法;/餘弦信號正交特性好等特點。而且的相位、幅度均已數位化,可以直接進行高精度的數字調製解調。
  • 《正弦函數、餘弦函數的性質》教學設計
    三角函數的主要性質周期性,奇偶性,單調性,在回顧三角函數定義的基礎上,用集合對應的語言給出了正弦函數和餘弦函數的完整定義,利用圖像考察了正弦函數、餘弦函數的性質,從中三角函數圖像的一些變換,用變換代量的觀點討論複合函數的性質。
  • 關於使用FPGA實現複雜數學函數的計算的分析
    FPGA的靈活性和性能使得它們廣泛應用在工業、科學、軍事以及其他的許多應用場合中,來計算複雜的數學問題或者傳遞函數,有許多算法,比如CORDIC算法,可以用來做為超越函數的計算處理模塊。 CORDIC算法可以用來實現正弦、餘弦、乘法、除法、平方根等超越函數,因此,把CORDIC算法和基本的數學模塊結合起來來計算傳遞函數,可以得到較為精確的結果。