新聞中心

EEPW首頁 > 設(shè)計(jì)應(yīng)用 > 使用面向FPGA的OpenCL設(shè)計(jì)兩百萬點(diǎn)頻域?yàn)V波器

使用面向FPGA的OpenCL設(shè)計(jì)兩百萬點(diǎn)頻域?yàn)V波器

作者:Dmitry Denisenko 時(shí)間:2015-11-09 來源:電子產(chǎn)品世界 收藏
編者按:快速傅里葉變換(FFT)是信號(hào)處理應(yīng)用的基礎(chǔ)。FPGA供應(yīng)商一直以來提供了運(yùn)行良好的FFT庫,處理適配到FPGA片內(nèi)存儲(chǔ)器中的大量數(shù)據(jù)。但是,如果數(shù)據(jù)規(guī)模太大,應(yīng)該如何應(yīng)對(duì)? 為解決這一問題,F(xiàn)PGA設(shè)計(jì)人員現(xiàn)在必須要做出設(shè)計(jì)決定,這些決定互相糾纏在一起,例如,片內(nèi)FFT內(nèi)核的配置選擇,其數(shù)量,它們?cè)鯓舆B接并訪問外部存儲(chǔ)器,多個(gè)內(nèi)核之間的同步等。分析所有這類設(shè)計(jì)決定就是要能夠很好的結(jié)合現(xiàn)有產(chǎn)品,在HDL中編程,這會(huì)非常耗時(shí),而且?guī)砹诵阅軉栴}。采用OpenCL等高級(jí)編程語言,能夠很快的完成系統(tǒng)設(shè)計(jì)分析。本

摘要:快速傅里葉變換(FFT)是信號(hào)處理應(yīng)用的基礎(chǔ)。供應(yīng)商一直以來提供了運(yùn)行良好的FFT庫,處理適配到片內(nèi)存儲(chǔ)器中的大量數(shù)據(jù)。但是,如果數(shù)據(jù)規(guī)模太大,應(yīng)該如何應(yīng)對(duì)? 為解決這一問題,設(shè)計(jì)人員現(xiàn)在必須要做出設(shè)計(jì)決定,這些決定互相糾纏在一起,例如,片內(nèi)FFT內(nèi)核的配置選擇,其數(shù)量,它們?cè)鯓舆B接并訪問外部存儲(chǔ)器,多個(gè)內(nèi)核之間的同步等。分析所有這類設(shè)計(jì)決定就是要能夠很好的結(jié)合現(xiàn)有產(chǎn)品,在HDL中編程,這會(huì)非常耗時(shí),而且?guī)砹诵阅軉栴}。采用等高級(jí)編程語言,能夠很快的完成系統(tǒng)設(shè)計(jì)分析。本文將研究在目前FPGA體系結(jié)構(gòu)上實(shí)現(xiàn)1M和16M點(diǎn)數(shù)的,支持從每秒120到240百萬采樣的不同采樣率。本文研究一個(gè)2M點(diǎn)數(shù)單精度的示例,該示例選擇作為其設(shè)計(jì)決定。假設(shè)讀者熟悉FPGA設(shè)計(jì),掌握的基本概念。

本文引用地址:http://2s4d.com/article/281882.htm

引言

  本文介紹構(gòu)建一個(gè)百萬點(diǎn)數(shù)單精度。這類濾波器使用百萬點(diǎn)數(shù)1D FFT,將每一個(gè)頻率和相位分量與用戶提供的數(shù)值相乘,使其輸入轉(zhuǎn)換到頻域,并通過FFT反變換,再把結(jié)果轉(zhuǎn)換回時(shí)域。在目前一代FPGA和兩個(gè)DDR3外部存儲(chǔ)器塊平臺(tái)上,對(duì)于兩百萬點(diǎn)采樣,整個(gè)系統(tǒng)的性能總要求是每秒處理1.50億點(diǎn)(MSPS)。輸入和輸出通過萬兆以太網(wǎng)直接傳送給FPGA。

  對(duì)于這一設(shè)計(jì),本文選擇使用Altera OpenCL SDK,在安裝了Stratix V GSD8 FPGA的BittWare S5-PCIe-HQ電路板上運(yùn)行FPGA編譯器。出于兩個(gè)原因,選用OpenCL而不是更底層的語言。第一個(gè)原因是設(shè)計(jì)幾百萬點(diǎn)數(shù)的濾波器需要構(gòu)建復(fù)雜而且非常高效的外部存儲(chǔ)器系統(tǒng)。采用底層設(shè)計(jì)工具,建立片內(nèi)FFT或者進(jìn)行對(duì)角旋轉(zhuǎn)的獨(dú)立模塊相對(duì)簡單(特別是因?yàn)樗蠪PGA供應(yīng)商已經(jīng)提供了含有這類模塊的庫)。但是,建立外部存儲(chǔ)器系統(tǒng)通常需要付出大量的HDL工作。由于在開始時(shí)并不知道整個(gè)系統(tǒng)的配置,因此這特別難,在后面會(huì)看到。選擇OpenCL的第二個(gè)原因是通過主機(jī)控制FPGA邏輯。從開始時(shí)就清楚兩個(gè)完整的幾百萬點(diǎn)的FFT內(nèi)核副本無法適配到一個(gè)器件中,因此,在獲得最終輸出之前,一組數(shù)據(jù)至少要通過FPGA邏輯兩次。協(xié)調(diào)這類共享同時(shí)還要實(shí)現(xiàn)動(dòng)態(tài)修改數(shù)據(jù)規(guī)模、乘法系數(shù),甚至完全修改FPGA功能等,這些工作最好留給CPU。為FPGA提供的OpenCL編譯器解決了所有這些難題——它開發(fā)可定制的高效的外部存儲(chǔ)器系統(tǒng),能夠精確地控制FPGA邏輯。

1 片內(nèi)FFT

  假設(shè)已經(jīng)有一個(gè)FFT內(nèi)核,處理的數(shù)據(jù)長度完全能夠適配到FPGA中(將其稱之為“片內(nèi)FFT”),每一家FPGA供應(yīng)商都會(huì)提供此類內(nèi)核。至少可以采用以下方式對(duì)這些內(nèi)核配置參數(shù):

  1. 數(shù)據(jù)類型(定點(diǎn)或者單精度浮點(diǎn));2. 要處理的點(diǎn)數(shù),N; 3.要并行處理的點(diǎn)數(shù),POINTS;4. 動(dòng)態(tài)支持修改要處理的點(diǎn)數(shù)。

  有了這類片內(nèi)FFT內(nèi)核后,需要兩個(gè)步驟來構(gòu)建整個(gè)系統(tǒng):開發(fā)一個(gè)能夠處理幾百萬點(diǎn)數(shù)的FFT內(nèi)核,然后,把兩個(gè)這類內(nèi)核連接在一起,它們之間是復(fù)數(shù)乘法,從而建立完整的系統(tǒng)。

2 幾百萬點(diǎn)FFT

  采用外部存儲(chǔ)來實(shí)現(xiàn)FFT的傳統(tǒng)方法是六步算法[1],把一個(gè)一維數(shù)組當(dāng)做兩維來處理(2M = 2K x 1K),如圖1所示。

  圖1畫出了六步算法,顯示了單獨(dú)的計(jì)算內(nèi)核以及外部存儲(chǔ)器緩沖。“獲取”內(nèi)核讀取來自外部存儲(chǔ)器的數(shù)據(jù),以選擇對(duì)其進(jìn)行轉(zhuǎn)置,將其輸出至通道(在OpenCL 2.0術(shù)語中,也稱之為“管道”)。在硬件中,以FIFO來實(shí)現(xiàn)通道,其深度由編譯器計(jì)算。“片內(nèi)1D FFT”是未經(jīng)修改的供應(yīng)商的FFT內(nèi)核,接收輸入,使用通道產(chǎn)生比特反轉(zhuǎn)輸出?!稗D(zhuǎn)置”是將從輸入通道讀取的數(shù)據(jù)轉(zhuǎn)置,可以選擇將其與特殊的旋轉(zhuǎn)因子相乘,以自然順序把輸出寫入到外部存儲(chǔ)器。

  正如您從圖1中所看到的,數(shù)據(jù)兩次通過獲取→1D FFT→轉(zhuǎn)置(F1T)流水線,產(chǎn)生最終輸出。留給第一個(gè)最重要的設(shè)計(jì)選擇——采用一個(gè)F1T流水線副本以節(jié)省面積,或者兩個(gè)副本以盡可能的提高吞吐量。

  在仿真器中對(duì)這一算法進(jìn)行原型設(shè)計(jì),以便能夠正確的處理轉(zhuǎn)置地址以及旋轉(zhuǎn)因子。仿真器將OpenCL內(nèi)核編譯至x86-64二進(jìn)制文件,可以運(yùn)行在沒有FPGA的開發(fā)板上。從仿真器到硬件編譯是比較簡單的步驟——仿真器中功能正確的代碼在硬件中也是正確的,不需要仿真。出于性能和面積的原因,唯一要修改的是獲取和轉(zhuǎn)置內(nèi)核所使用的本地存儲(chǔ)器系統(tǒng)。高效的轉(zhuǎn)置需要在本地存儲(chǔ)器中對(duì)數(shù)據(jù)POINTS列/行進(jìn)行緩沖。OpenCL編譯器分析您OpenCL代碼中對(duì)本地存儲(chǔ)器的所有訪問,并通過創(chuàng)建一個(gè)定制的片內(nèi)存儲(chǔ)系統(tǒng)來優(yōu)化你的代碼。對(duì)于POINTS=4的情況,最初的轉(zhuǎn)置內(nèi)核有四次寫和四次讀操作。一個(gè)雙泵的片內(nèi)RAM模塊最多可以服務(wù)四個(gè)獨(dú)立的申請(qǐng),其中最多兩次寫操作。為支持四次寫和四次讀操作,需要復(fù)制片內(nèi)存儲(chǔ)器,含有申請(qǐng)仲裁邏輯,導(dǎo)致面積增大,性能下降。當(dāng)認(rèn)識(shí)到可以通過修改寫模式,來連續(xù)進(jìn)行所有四次寫操作后,這四次寫操作被OpenCL編譯器分成一組,成為一次寬寫操作,這樣,只需要對(duì)本地存儲(chǔ)器系統(tǒng)訪問五次:一次寫操作,四次讀操作。進(jìn)行了這一修改后,編譯器自動(dòng)為構(gòu)建一個(gè)小很多的五端口存儲(chǔ)器系統(tǒng),在每一時(shí)鐘周期可以服務(wù)所有五個(gè)申請(qǐng),不會(huì)出現(xiàn)停頓。

  設(shè)計(jì)被編譯到硬件中后,可以進(jìn)行性能測(cè)量。在FPGA上有一個(gè)F1T流水線副本,對(duì)于四百萬點(diǎn)FFT,測(cè)得了POINTS=4時(shí),217 MSPS,POINTS=8時(shí),457 MSPS[2]。POINTS=8版本使用了兩次,因?yàn)檫@一配置中大量的片內(nèi)模塊RAM和兩個(gè)副本無法適配。這就是要研究的第一個(gè)設(shè)計(jì)范圍——要并行處理的點(diǎn)數(shù)和面積。

3 全濾波器設(shè)計(jì)

  現(xiàn)在,有了一個(gè)幾百萬點(diǎn)的FFT,準(zhǔn)備好將整個(gè)設(shè)計(jì)合在一起。把兩個(gè)片外FFT連接在一起,得到圖2所示的流水線邏輯視圖。



上一頁 1 2 下一頁

關(guān)鍵詞: FPGA 頻域?yàn)V波器 OpenCL 201511

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉