<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 基于FPGA的移位寄存器流水線結構FFT處理器

          基于FPGA的移位寄存器流水線結構FFT處理器

          作者: 時間:2010-07-19 來源:網絡 收藏


            第三級的運算與第二級和第一級類似,即移入1級寄存器的數據與其后一個數據進行碟算,同時使前一級寄存器的輸出數據進入后一級寄存器的空白位中,然后開關打到位置②,對下路輸出數據進行碟算。

            對于第二路數據,通過開關控制,在第二級中,待第一路第一級下路輸出數據進行蝶形運算時,移入寄存器的空白位,為運算做準備,由于前級運算周期是后級運周期的兩倍,對于第二級碟算模塊而言,數據仍然是不間斷輸入的。通過這樣兩路數據的交替運算和存儲,實現“乒乓操作”,從而提高了蝶形運算模塊的運算效率。圖4是256點的具體運算輸入和輸出時序圖。對于只有一路數據的應用場合,可以在前級加入,門控開關和數據緩沖寄存器分成兩路數據,實現一路數據的不間斷讀入。

          256點FFT的具體運算輸入和輸出時序圖

            由于采用結梅,各級寄存器使用的數量都是固定的,即為N/2+N/4。其中,N為該級DFT運算的點數,各級使用的深度逐級遞減,從而大大降低了寄存器的使用數量。

            此外,由于各級結構固定,所以大點數只是小點數基礎上級數的增加,而且由于的輸出相對于RAM而言不需要復雜的地址控制,所以這種結構的FFT處理器具有非常好的可擴展性。比如需要實現512點的FFT,只需要在256點的基礎上增加一級即可。

            3 具體模塊的設計

            3.1 控制與地址產生模塊

            由于兩路數據同時輸入,為了防止發(fā)生兩路數據間的串擾,對數據的控制顯得極其關鍵。從上面的算法結構分析中知道,由于后級的DFT運算點數是前一級的一半,所以后一級的開關轉換周期也是前一級的一半,基于這種關系,可以使用一個8位計數器的每一位狀態(tài)來對各級開關進行控制。最高位控制第一級,同時由于上一級數據進入下一級需要一個時鐘,所以下一級的開關轉換時刻要比上一級延遲一個時鐘周期。

            對于移位寄存器,在實現時,各級的前級移位寄存器深度為N/2-1,從本質而言,是使運算開始的時鐘上升沿到來時,數據已經出現在碟算模塊輸入線上,而不需要下一個時鐘的驅動來移出寄存器,比如第二級移位寄存器的級數為63。這樣,運算周期正好是2的倍數,從而方便使用計數器的各位直接對開關進行控制。

            同時,計數器還可以用來產生所需旋轉因子的RAM地址。根據各級蝶形運算所需旋轉因子的規(guī)律,可以利用計數器的高位補零來產生查找表的地址。比如,對于第一級,因為需要在最低位第一次出現1時提供,第二次出現1時提供,…,以此類推,周期為128,所以可以使用計數器的低七位作為地址。對于第二級,由于所需要的地址為偶數,可以由計數器的[6:1]和最低位置O產生。表l為8點時使用三位計數器輸出旋轉因子的地址情況。

          8點時使用三位計數器輸出旋轉因子的地址情況

            控制和地址產生模塊的仿真結果如圖5所示,其中sel代表開關控制,addr代表產生的地址。

          控制和地址產生模塊的仿真結果



          關鍵詞: FPGA FFT 移位寄存器

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();