1. 程式人生 > >基於System Generator的CORDIC演算法實現

基於System Generator的CORDIC演算法實現

基於System Generator的CORDIC演算法實現


文章目錄


  System Generator是Xilinx公司進行數字訊號處理開發的一種設計工具,它通過將Xilinx開發的一些模組嵌入到Simulink的庫中,可以在Simulink中進行定點模擬,可以設定定點訊號的型別,這樣就可以比較定點模擬與浮點模擬的區別。並且可以生成HDL檔案,或者網表,可以在ISE中進行呼叫。或者直接生成位元流下載檔案。能夠加快DSP系統的開發進度。
  CORDIC ( Coordinate Rotation Digital Computer ) 是座標旋轉數字計算機演算法的簡稱,由 Vloder於 1959 年在設計美國航空導航控制系統的過程中首先提出[1], 主要用於解決導航系統中三角函式、 反三角函式和開方等運算的實時計算問題。 1971 年, Walther 將圓周系統、 線性系統和雙曲系統統一到一個 CORDIC 迭代方程裡 , 從而提出了一種統一的CORDIC 演算法形式。
  CORDIC 演算法應用廣泛, 如離散傅立葉變換 、 離散餘弦變換、 離散 Hartley 變換、Chirp-Z 變換、 各種濾波以及矩陣的奇異值分解中都可應用 CORDIC 演算法。 從廣義上講,CORDIC 演算法提供了一種數學計算的逼近方法。 由於它最終可分解為一系列的加減和移位操作, 故非常適合硬體實現。 例如, 在工程領域可採用 CORDIC 演算法實現直接數字頻率合成器。


參考文獻:FPGA數字訊號處理設計教程 SystemGenerator入門與提高

一、CORDIC演算法實現

  本次設計針對CODIC演算法詳解系列教程的補充,目的有兩個:一是鞏固學習System Generator,二是深入理解CORDIC演算法。關於System Generator的學習,請參考我的相關博文System Generator從入門到放棄系列,CORDIC演算法的學習,請參考我的博文CORDIC演算法詳解系列。
  本文也是CORDIC演算法詳解(六)-CORDIC 演算法的硬體實現的補充。


1、簡介

  請參考System Generator從入門到放棄

系列、CORDIC演算法詳解系列,有非常詳細的推導及圖文公式,還有相關的MATLAB程式。


2、CORDIC演算法模式

  本次設計是利用CORDIC演算法實現:
在這裡插入圖片描述
  為了檢驗CORDIC的準確性,本實驗的輸入資料x,y為兩組隨機數,CORDIC的運算結果將與浮點數運算模組的結果進行比較,能直觀地看到CORDIC的準確性。
  接下來會採用兩種方法設計CORDIC演算法,一種是根據CORDIC演算法原理在System Generator中搭建相關Model,另一種方法是直接呼叫System Generator中提供的模組進行設計。


2、搭建CORDIC模組系統

  迭代的次數越多計算的結果越精確,但同時消耗的資源也會增加而且系統的執行速度也會受到影響。所以需要根據具體設計的要求來選擇迭代的次數,一般來說,迭代的次數不高於資料的位寬。

2.1 本部分設計使用到的block

  本次設計主要有四個部分組成:資料輸入模組、參考設計模組、CORDIC設計模組和比較模組。

Xilinx block

  • System Generator(->Basic Elements):系統管理
  • Gateway In(->Basic Elements):資料輸入
  • Gateway Out(->Basic Elements):資料輸出

其它block

  • Random Number(Simulink->Sources):生成隨機數
  • Add(Simulink->Math Operations):加法器
  • Scope(Simulink->Commonly Used Blocks):示波器
  • 其他算術Blocks

2.2 System Generator設計流程

2.2.1 CORDIC模組設計

新增subsystem 命名 CORDIC Design
在這裡插入圖片描述

新增subsystem 命名 Cell0、Cell1…Cell5
  按照下圖進行連線
在這裡插入圖片描述
  從上圖可以看出,CORDIC設計模組主要由6個迭代模組組成,每個迭代模組只是引數不同。其中常數0.72998046875是對座標旋轉後模長變化的補償。
  下面是Cell0的內部框圖:
在這裡插入圖片描述

2.2.2 參考設計模組設計

  參考設計模組實際為一個浮點運算單元,直接計算開方的值作為輸出,該部分模組沒有使用Xilinx Block,主要作用就是作為參考模組可以方便地檢驗CORDIC模組的設計精度。內部結構圖如下:

在這裡插入圖片描述

2.2.3 資料輸入模組設計

  輸入資料模組包含兩個隨機數輸入模組,經過Gateway in模組後進入引數設計模組和CORDIC設計模組這兩個模組計算出來的資料進入比較模組,比較後的誤差作為輸出顯示。內部結構如下:
在這裡插入圖片描述

2.2.4 比較模組設計

  輸入資料模組包含兩個隨機數輸入模組,經過Gateway in模組後進入引數設計模組和CORDIC設計模組這兩個模組計算出來的資料進入比較模組,比較後的誤差作為輸出顯示。內部結構如下:

在這裡插入圖片描述

2.2.5 CORDIC模組

  完成上訴各個模組設計後,按照下圖進行連線和設定:
在這裡插入圖片描述

2.3 模擬

  執行模擬,模擬時間設定為“130”

在這裡插入圖片描述
在這裡插入圖片描述
  雙擊System Generator 圖示,得到相關的設定如下:
在這裡插入圖片描述
  單機Generate生成工程檔案及相關報告,下面是資源利用情況的報告:
在這裡插入圖片描述


3、使用System Generator自帶的參考CORDIC模組系統

  為了方便設計者使用SYSGEN進行數字系統設計,SYSGEN系統在Xilinx Block庫中提供了一些常用的數字訊號處理模組,只需要簡單的設定就可以呼叫。

3.1 本部分設計使用到的block

Xilinx block

  • CORDIC ATAN(->Basic Elements):呼叫CORDIC演算法模組
  • Gateway In(->Basic Elements):資料輸入
  • Gateway Out(->Basic Elements):資料輸出

其它block

  • Add(Simulink->Math Operations):加法器
  • Scope(Simulink->Commonly Used Blocks):示波器
  • 其他運算Block

3.2 System Generator設計流程

新增subsystem 命名 CORDIC Design
在 CORDIC Design 新增相關Block 如下:
在這裡插入圖片描述
在這裡插入圖片描述
Model 如下:
在這裡插入圖片描述

3.3 模擬

  執行模擬,模擬時間設定為“130”

在這裡插入圖片描述
在這裡插入圖片描述
  雙擊System Generator 圖示,得到相關的設定如下:
在這裡插入圖片描述
  單機Generate生成工程檔案及相關報告,下面是資源利用情況的報告:

在這裡插入圖片描述


4、兩種方式對比

  從以上匯出的報告可以看出,用SYSGEN系統自帶的參考CORDIC模組消耗更多的觸發器資源,而且從波形圖中可以看出自帶額參考CORDIC模組的系統產生的誤差也明顯比搭建的模組系統產生的誤差要大一點。造成這些問題的主要原因是SYSGEN模組具有通用性,必須保留一定的資源空間供使用者配置,這樣必然要犧牲掉很多資源。所以在設計中考慮佔用資源時儘量少用系統自帶的模組,在使用SYSGEN系統再帶參考模組時也一定要對引數進行合理的設定與優化。


5、相關工程檔案

  System Generator實現CORDIC演算法工程檔案 裡面有 System Generator 2016及System Generator 2018兩個工程的檔案,本人已經模擬驗證通過,供大家學習之用。
https://download.csdn.net/download/pieces_thinking/10765631