新聞中心

        EEPW首頁 > 汽車電子 > 設計應用 > 基于CORDIC算法的32位浮點三角超越函數之正余弦函數的FPGA實現

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

        ——
        作者:桂林電子科技大學 通信與信息工程系 李全 陳石平 付佃華 時間:2006-11-03 來源:電子產品世界 收藏

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

        關鍵詞: 

        引言

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



        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 行唐县| 历史| 略阳县| 和林格尔县| 英山县| 怀远县| 望谟县| 阿图什市| 吴川市| 剑河县| 健康| 旌德县| 邛崃市| 潮州市| 昭苏县| 天气| 清河县| 托克逊县| 木兰县| 黔西| 广安市| 祁东县| 静安区| 肇东市| 连山| 会同县| 长乐市| 拉萨市| 东辽县| 重庆市| 延寿县| 江孜县| 桐庐县| 井研县| 禄劝| 玉田县| 高碑店市| 临高县| 东兰县| 湄潭县| 大埔区|