基于FPGA多通道采樣系統(tǒng)設計論文資料
基于FPGA多通道采樣系統(tǒng)設計論文資料,基于,fpga,通道,采樣系統(tǒng),設計,論文,資料
畢業(yè)設計(英文)資料翻譯
院 (系) :
專 業(yè):
學生姓名:
學 號:
年 月 日
高速FPGA器件的頂層設計
鳴謝
在開始這份報告之前,我想感謝下面這些人,他們幫助我完成了這個項目,沒有他們的幫助,我是不可能完成這個項目。
我要感謝我的主管韋力·拉克教授,他在整個項目進行中給了我很多的建議和鼓勵,他還告訴我也面對在項目中遇到的困難。
我要感謝楊教授,他讓我運用他的硬件運算法則。他還給我說明的例子源文件好讓了解他的理論。我還要謝謝他卓越的多媒體的教程。這些多媒體教程包括了很多讓我明白圖像進程原理的概念。
我還要感謝阿·塔夫和雪瑞。他們是兩個PH·D的研究生,他們在項目執(zhí)行和應用上幫了我很多。
摘要
在這個項目中,我發(fā)現(xiàn)了一個高質(zhì)量硬件設計的體系方法,有了這個方法,我成功地在高速硬件上運行了一個經(jīng)典的凝膠圖像算法。在這份報告中,我還會提到一個新器件,這種新硬件可以通過重新排列代碼來自動完成高質(zhì)量的硬件優(yōu)化。這樣它可以運行在最小的時鐘周期中。這份報告分為5個章節(jié)
第一節(jié)是介紹:主要包括背景和所有相關的工作,還有一些我在這個項目上投資。
第二節(jié)是優(yōu)化:在這一節(jié)中,我將著重描述用于優(yōu)化的新器件。我還將論證一些器件可以自動優(yōu)化的過程。
第三節(jié)是硬件拓展:在這節(jié)中,我將歸納幾步改變一個軟件,然后下載到硬件中。這些包括許多能改進性能或者保存硬件資源的器件。
第四節(jié)是范例分析:凝膠圖像過程。在這節(jié)中,我將用凝膠圖像過程作為一個例子來說明在第二節(jié)中討論的硬件的資源和性能的影響。我還會比較兩種器件和軟件的應用的性能,軟件的版本是:Pilchard 和 RC1000
第五節(jié)是結(jié)論,包括評估成就和期望的特性工作
網(wǎng)上也有這篇論文。網(wǎng)址:http://www.doc.ic.ac.uk/~mcn99/project/report.pdf
第一節(jié):說明
自從Handel-C[5].a類C硬件語言的出現(xiàn),一個完全的頂層的FPGA設計方法就被認識到。然而許多開發(fā)者當他們要設計高速運行的硬件的時候仍然停留在底層的語言上,比如VHDL這是因為開發(fā)者在底層的方法有許多實際電路的控制方法。但底層的設計在FPGA芯片規(guī)模逐漸變大的時候可能會達到極限。開發(fā)人員將不能用底層的設計來開發(fā)包括幾十億個門的高速電路。這個時候頂層的設計就可以達到要求了。這個項目的目的就是介紹一套系統(tǒng)的方法來設計頂層的高速硬件性能。
1.1背景和相關工作
在這節(jié)中,我將介紹一些材料來方便讀者了解這篇論文中的一些概念。
1.1.1 現(xiàn)場可編程門陣列(FPGAs)[1]
像許多的可變成邏輯器件(PLDs)一樣,FPGA是一塊可編程的硬件,然而, PLDs的資源消耗和時間延時限制了其大小。而FPGA可以很輕易在一塊集成芯片上設計一個有幾百萬個門的電路。FPGA的可再編程特性允許開發(fā)人員用比使用一塊VLSI芯片更少的開發(fā)時間和更少的開發(fā)成本來設計。值得一提的是FPGA以每年兩倍容量的發(fā)展。因為最新的芯片上有幾百萬個門,所以FPGA是開發(fā)復雜應用的系統(tǒng)理想開發(fā)平臺。因此我在開發(fā)它的應用。
Pilchard [2]
Pilchard是一個基于現(xiàn)場可編程門陣列(FPGA)的可配置的計算平臺,它可以插在一臺標準的個人電腦的133MHZ同步的動態(tài)RAM和雙向存儲器模塊(DIMMS)的插槽中。相比于傳統(tǒng)的利用PCI接口的FPGA器件,由于DIMM接口的寬帶寬和低延時,Pilchard允許數(shù)據(jù)在更短的時間傳出電腦或者傳入電腦。然而由于DIMM接口原本不是設計為I/O接口的,所以需要額外的控制信號來表示數(shù)據(jù)讀寫過程的開始和結(jié)束。因此,由于Pilchard的發(fā)展和運用,頂層的性能設計方法好過底層的結(jié)構(gòu)設計。這就證明了為什么一個用高性能的FPGA的頂層設計的系統(tǒng)方法是很有必要的。
RC1000 [3]
RC1000是一個專為可配置的計算應用的32的PCI卡,它以庫的形式全支持的程序包在適合這設備的電路設計,它在連在FPGA或者主CPU的板子還有4個SRAM(每個2M字節(jié)),這塊板子可以配置成可以運行在4000KHZ到100MHZ的頻率中。這個器件在很多方面是不同于Pilchard的,在這份報告中,我將表明發(fā)展在這項目內(nèi)一般介紹,并且可能在應用開發(fā)在不同設備上適用。
1.1. 4 VHDL [4]
VHDL是一門在當今市場上最好的可編程邏輯器件設計語言,VHDL的頂層設計取決于他能讓設計者很快得將大型電路設計出來然后放到市場上。它可以用庫文件保存起來,以便以后的再應用,由于VHDL是一門標準語言(IEEE標準 1076)。VHDL能像其他獨立器件設計一樣提供方便的代碼來同步和仿真,VHDL還很容易將一個可編程邏輯轉(zhuǎn)化為一個ASIC功能 。這門語言的缺點是還不夠高級,開發(fā)人員必須掌握組件的硬件特性。因此,我決定用另外一門更高級的硬件語言----i.e.Handel-C。
1.1.5 Handel-C [5]
Handel-C是一門類似于C語言的編程語言,它可以用于將硬件圖像通過編程下載到FPGA或者ASICs中,Handel-C為了支持很少的硬件優(yōu)化而加入了一些在C中沒有的額外的特性。其中一個是這門語言支持指定每個信號的寬度,這樣優(yōu)化可以用Handel-C編譯的額外資源來完成優(yōu)化。Handel-C編譯的目的是為了能直接用xnf或者edif格式通過編程下載到硬件器件中。Handel-C好過VHDL的是它不需要開發(fā)人員掌握太多底層硬件知識,而VHDL必須要求掌握。它是一門完全的頂層設計語言!圖一顯示我采用的轉(zhuǎn)換Handel-C程序到硬件中,盡管每一步都需要很多工具,但用戶不需要了解硬件的細節(jié),因為用戶只需要點幾個按紐就可以轉(zhuǎn)換文件到下一步,就像這樣。
圖1.1 Handel-C的設計流程
Handel-C編程
硬件
比特流
EDIF網(wǎng)格文件
編譯 布局和布線 下載
1.1.6 Handel-C語言的擴展 [7]
一個PH.D的學生李東尤發(fā)明了一門支持硬件和軟件的語言,他的方法是把C和Handel-C綁在一起,在這門語言中,用戶可以指定哪個部分用于軟件,哪個部分用于硬件。在這個項目中,他還開發(fā)了很多友好的用語FPGA器件和主機的通信接口,然而支持這門語言的器件還相當有限,這就是我為什么不選擇這門語言的原因。
1.2 主要成就
·我已開發(fā)出一種簡單而有效的優(yōu)化方法,這種方法可以重新排列代碼,這樣可以運行在最小時鐘周期。
·我已開發(fā)出針對高速器件設計出一個體系的頂層硬件設計流程
·我實現(xiàn)在硬件運行復雜的2D凝膠圖像過程
第二章 優(yōu)化
在這章中,我將論述很多的方法來優(yōu)化頂層代碼,優(yōu)化是我們開發(fā)和運用的主要部分,類似于由于有限的CPU資源而運行的PC軟件。這一章的主要目標放在怎樣自動優(yōu)化這些進程,我們還將討論一些相等進程,以便衡量優(yōu)化后速度到底提高了多少
2.1 性能優(yōu)化
這是在開發(fā)潛能類似于程序在相同時鐘周期運行在不相矛盾的操作來獲得速度上的增加,在通常的運用中,十幾或者幾百個操作在電腦上并行運行,然而電腦因為硬件資源的有限是不能并行操作的。但是設計特殊的能并行操作的硬件是有可能的。重要是速度能達到。這就是為什么FPGA的應用有時候比相應運行在低時鐘的FPGA的軟件(當然我們也需要考慮到物價指數(shù),但是PC機的CPU仍然可以快速獨立地運行)。這有我們可以運用的技術。
2.1.1 平衡每條路徑的延遲
平衡每條路徑的延遲是很重要,因為硬件的時鐘最快也就是最長延時的那條路徑。因此因為如果有某一條路徑上延時十分嚴重,當其他的路徑能夠以非常高的速度運行的時候那么我們就浪費資源。通過平衡延時能確保并行優(yōu)化是最理想的。一條路徑的延時定義為:
= + (2.1)
這里的是一條路徑的總延時;
是邏輯延時;
是線路上的延時
因此,為了減少延時就是減少和的其中一個或者兩個都減少,這里有兩步主要步驟
·化復雜的操作為簡單的操作
·用一些預定義的組件和布線約束
化復雜的操作
首先,最簡單的步驟是把復雜的步驟分成學多簡單的操作,這個步驟有效得減少了每一步的邏輯操作,因此減少了等式2.1中。在軟件編程中,復雜操作通常比相同結(jié)構(gòu)的簡單操作運行要快甚至更快,這是因為編譯器會為我們優(yōu)化結(jié)構(gòu)操作。而硬件中,一個復雜的操作就意味著要用很長的時間來完成,而簡單操作就不需要很長的時間。圖2.1表明了把一個復雜的操作分成許多簡單的操作。在這個例子中,我們可以看出有時候額外的寄存器
我們可以看出為了使操作足夠簡單,通過額外的寄存器把中間計算結(jié)果存起來是很有必要的。
圖2.1:復雜操作的分解
簡單操作
int temp;
temp=c*d; temp+=b; a+=tem p;
復雜操作a+= b+ c*d
預定義布置和布線組件
如果第一種方法不能滿足用戶要求或者時序上的限制不能滿足,我們可以用FPGA芯片開發(fā)者提供的延時分析,來找出延時最長的一條線路。例如,我們可以用Xinlinx ISE Foundation 4的延時分析來分析Xinlinx公司的FPGA芯片,在找到最長的線路后,我們就知道哪個操作運行太慢了。這個時候,我們就應該試試這兩種方法來提高運行速度。第一種方法是自己嘗試寫一個限制文件明確地布局和布線,這樣相比于一些不是很好的自動布局和布線的工具可以提高工作效率。然后我們可以在布局和布線之前把這些限制文件包括到進程中。然而這種方法需要開發(fā)人員有相當多FPGA芯片知識,這包括關于芯片支持的一些能減少延時的原始組件和布局布線之間的關系等方面的知識。第二種方法相比來說簡單一些,就是用一些預定義好的元器件來布局和布線,這些都是芯片開發(fā)人員做好的,簡單來說就是芯片開發(fā)人員已做好了,你只是調(diào)用就行了。就Xinlinx來說,他有一個叫做代碼生成器的編程軟件,他就像上面說的一樣可以直接調(diào)用的。Handel-C菜單中指定了怎樣把這些組件包括到Handel-C編程菜單中,然而用戶需特別注意這些組件的輸入和輸出的時序。由于Handel-C語言的局限性,輸入信號要晚一個周期進入組件,這一步會減少等式2.1中,因為邏輯塊的較佳的布局和信號的布線會使延時明顯得減少。
進程自動的可能性
以上,我們討論了兩種方法來達到這一步,這一步是很難實現(xiàn)自動,因為很難定義哪個操作是復雜的哪個不是,這取決于我們用到的器件和芯片還有程序的功能。我們需要一個嚴格時序限制的器件。一個16位的乘法器相比于其他不能運行在高速的器件來說可以認為是一個復雜的器件。當一個操作不能運行在高速環(huán)境上,再去把這個操作再去分成一些可以運行在高速的分操作簡直是浪費。然而我們可以再借用李的觀點來把這些操作實現(xiàn)自動化。當編譯源文件的時候,我們可以包含我們要用的器件信息和時序限制,器件庫包含有每個邏輯單元的延時時間。它還包括FPGA開發(fā)工具怎樣對信號布線的信息。這樣編譯器可以估計每路的, ,,然后和限制的時序延時比較,如果不能達到,編譯器會用上面提到的第二種方法來平衡每路的延時,直到符合限制條件。
2.1.2 基本的并行操作
這是實際的性能優(yōu)化的最簡單的第一步,下面的操作可以使進程自動化。連續(xù)掃描程序,盡量把更多的操作聯(lián)合在一個時鐘周期中,直到違背了資料相依的條件,然后在下一時鐘周期重復這樣的操作。因為我們已經(jīng)討論怎樣在更盡快的部分內(nèi)發(fā)現(xiàn)數(shù)據(jù)從屬性,這個過程可能被自動做。圖2.2是一個簡單的例子,我們看到如果沒有并行操作,將需要8個時鐘周期來完成8個操作,然而如果用并行操作,只需要2個時鐘周期就可以完成這些操作。
A=1; 操作1 Par{
B=2; 操作2 A=1; 操作1
C=3; 操作3 B=2; 操作2
D=4; 操作4 C=3; 操作3
A=A+1; 操作5 D=4; 操作4
B=B+2; 操作6 }
C=C+3; 操作7 Par{
D=D+4; 操作8 A=A+1; 操作5
操作5是依賴與操作1的, B=B+2; 操作6
但并不依賴操作1,操作2 C=C+3; 操作7
操作3,操作4之間,就像 D=D+4; 操作8
在操作5,操作 6,操作7 }
操作8之間一樣。
2.1.3 重新排列代碼順序
有時候,一個程序可以有高度的并行性,但操作執(zhí)行的順序的方法在上面提到的。例如,圖2.3中的代碼是跟圖2.2中的代碼功能是一樣的,但如果我們用基本的并行操作,將需要4個時鐘周期來完成這個操作,而不是2個時鐘周期。
我們有是可以通過重新排列代碼的順序,這樣程序可以運行盡可能少的時鐘周期,例如上面代碼可以改成圖2.2一樣的順序,這樣我們又可以用“基本平行”方法。由于這些進程可以被編譯器自動進行,編譯器將需要有相當多編程的知識和原因,我已研究出一個方法來實現(xiàn)這些進程的自動化。
1.首先,選擇一部分代碼開始, 最好在局部循環(huán)中。
2.用變量名作為索引和標簽來建一個空表,標簽的格式是var:n,其中var是一個變量的名稱,n是指定的操作順序的個數(shù)。
3.連續(xù)掃描代碼,對每一個變量的任務(任一修正/設定初值), 在下面被列出的規(guī)則之后分配標簽到操作:
第一步:查詢表格,找到標注的變量的標簽
第二步(a)如果沒有發(fā)現(xiàn)入口,變量就是先前定義,把這個程序入口加入表格,內(nèi)容(標簽)指定為as:形式。
第三步(a1)如果變量是一個常量或者是一個從外部輸入的信號量。指定其標簽為VARname:1,這里的VARname是定義的變量名。
第三步(a2)如果變量的值取決于其他的變量,從表格中取出這些變量的標簽,定義這些變量的標簽從我們?nèi)〉米畲蟮拇涡蚣?得到。例如,如果 a=b + e,如果b是d:3,e是e:4,這樣a的標簽應該是e:5
第二步(b)如果有程序入口,變量就是在前面已經(jīng)定義的,直接取得這些變量的標簽。
第三步(b)更新在第三步(a1)和第三步(a2)中改變了的變量標簽,但是由于一個變化當發(fā)現(xiàn)最大的次序標簽的時候,我們應該包括比較的它本身的標簽。 舉例來說, 如果a = b+c 而c和b的標簽是和上面的相同的,但是a的標簽已存在表格中,值為a:5,這樣新的標簽將會是a:6.注意在做比較的時候,我們要視常數(shù)的次序為0。
第四步:用我們剛才指定的標簽把這些操作連接起來。
4.將所用的操作做了標簽后,我們就要調(diào)整操作了,把有相同次序的操作放到一起。
5.現(xiàn)在,“基本平行”方法將會回到運行最少周期的程序代碼上了。相同次序的將會放到一個塊中。
6.重復從第二步開始的各個步驟,直到整個程序都被轉(zhuǎn)換。
這個方法的可行性是把所有的操作放到最近的一個時鐘周期執(zhí)行,這樣,經(jīng)過修改后的代碼只用最少的時鐘周期就可以執(zhí)行完成了。很顯然這種方法可以很容易實現(xiàn)自動化,通過聯(lián)合這種方法和前面的“基本平行”的方法,一個令人驚訝的效率很高的并行工作工具被發(fā)展!
圖2.4顯示出這種方法怎樣工作的例子
圖2.3 未優(yōu)化代碼
A=1; 周期1 Par{
B=2; 周期2 A=1; 周期1
C=3; 周期3 A=A+1;
D=4; 周期4 }
A=A+1; 周期5 Par{
B=B+2; 周期6 B=1; 周期2
C=C+3; 周期7 B=B+2;
D=D+4; 周期8 }
Par{ 周期3
C=3;
C=C+3;
}
Par{ 周期4
D=4;
D=D+4;}
圖2.4重新排列代碼的步驟
2.1.4 增加寄存器來儲存中間結(jié)果
僅僅通過重新排列代碼有時候是不夠的,如果我們發(fā)現(xiàn)有許多針對一個變量的操作,而其他的變量只有幾步的操作,這樣就會出現(xiàn)在前面幾個時鐘周期有很多的操作,而到了后面的時鐘周期卻沒有了幾步操作。這樣,我們能平衡每個時鐘周期的操作呢?可能解決這個問題的辦法就是增加寄存器來儲存中間結(jié)果,而且這樣可以在很短的時間計算中間變量的值,由于這需要很的理論和邏輯單元,而且這項操作很復雜,所以可以很難實現(xiàn)自動化操作。圖2.5是這種方法的一個例子,我們可以看到在修改代碼之前需要3個時鐘周期在修改程序后只需要2個時鐘周期。
圖2.5 用存儲器來儲存中間變量
2.1.5 流水線操作
流水線操作是在一個操作中有多任務的時候一種執(zhí)行方法,亨利絲和帕得森在他們的書第三節(jié)是這樣介紹這個流水線操作的具體方法:
流水線操作就像是一個裝配線,在一個自動裝配線上有許多步驟,每個步驟完成一個裝備小汽車的操作,盡管在不同的小汽車上,但每個步驟都是并行作業(yè)的。
理想狀況下,我們可以在每個時鐘周期后來執(zhí)行下一個操作,這樣,流水線操作就是滿負載的,生產(chǎn)量在每個時鐘周期將會是一項任務不論它花多少時鐘周期來完成這項操作,因此,當一個任務需要100個時鐘周期來完成,而且你有足夠多的任務來讓生產(chǎn)線一滿負荷,這樣將花大約100倍的時間來完成所有的任務,但速度決定不會達到100,因為:
·流水線需要額外的控制邏輯,因此需要增加成本。
·流水線需要額外的寄存器來儲存中間變量,因此增加延時。
此外,開發(fā)人員要知道操作不會在很段的時間就完成了,因此流水線操作是一個理想的相同的計算大數(shù)據(jù)操作。
這有當我們用流水線操作的時候必須注意到的幾點:
·當沒有足夠硬件資源來處理交錯的任務的時候,哈澤德式結(jié)構(gòu)就會發(fā)生。例如,我們不能在一個時鐘周期來多次來讀一個RAM里的數(shù)據(jù)。解決的方法是在流水線操作中確保有足夠多的硬件資源。
·因為你用的寄存器儲存的中間變量的值在每個周期可能會改變,所以寄存器中數(shù)據(jù)會丟失,除非你有足夠多寄存器來儲存中間變量。這樣,如果在一個流水線的一個狀態(tài)在很多狀態(tài)以后才用到,這樣我們就需要增加額外的寄存器來儲存和傳遞中間變量的值,這樣任務進入一個新的狀態(tài)的時候,任務想要讀數(shù)據(jù)的數(shù)據(jù)就有數(shù)據(jù)可以讀。
·當操作需要數(shù)據(jù)沒有準備好,哈澤德式數(shù)據(jù)就會產(chǎn)生。當進入一個新的流水線操作的時候我們需要很小心設計流水線操作,以防止哈澤德式數(shù)據(jù)的產(chǎn)生。
圖2.6是一個把Handle-C程序轉(zhuǎn)換成流水線操作的例子,運行的結(jié)果是數(shù)據(jù)輸入5階次方。 圖2.7顯示出上面例子的效果。
圖2.6 轉(zhuǎn)換為流水線操作
圖2.7流水線的效果
2.2 空間優(yōu)化
空間優(yōu)化跟時間優(yōu)化完全不同,時間優(yōu)化通常是在同時用更多資源執(zhí)行更多的操作來獲得高速操作,而空間優(yōu)化關心是這樣用最少的資源來完成操作。這在FPGA設計中相當重要,因為我們用的資源越少,我們可以在片子上有更多的操作。我們現(xiàn)在就來討論一些空間優(yōu)化的方法。
2.2.1 變量的最佳寬度
記住在4.1標準寬度中變量的轉(zhuǎn)化方向,事實上,如果我知道一個我們要用的值的上限和下限范圍,我們就會發(fā)現(xiàn)有些位在大多數(shù)情況是用不到的。例如:一個0-1024的變量就不需要用32位,11位的整型就足夠了。一個位數(shù)少的就只需要小的寄存器來儲存了。位數(shù)低的比位數(shù)高的相同操作需要更少的邏輯門,等式2.1中提到,是的一個組成部分,因此,這種優(yōu)化不僅節(jié)省了很多資源,還減少了,從而減少了。
皇家學院的學生阿·塔夫正在研究這個項目[8]。這個項目主要的目標是通過限定浮點型變量的最佳寬度來自動資源優(yōu)化。他的方法是仿真足夠多的數(shù)據(jù),然后通過統(tǒng)計學的原理來找出變量的最佳寬度。
2.2.2 組件的再運用
如果相同寬度的不同操作數(shù)的相同操作在不同的時鐘周期中要運行多次,我們就可以建立一個可以應用于不同操作數(shù)組件。這種方法不影響電路的延時,但節(jié)省了復制組件的門!為了能更多的運用這些組件,我們甚至可以放棄限制條件,這樣短操作數(shù)的操作可以運用這寫共享組件。這是因為長操作很短操作是一樣的??赡苡幸蓡柺?,由于用了并需要多很多邏輯單元會增加電路的延時。是的,原則上,我們可以用足夠的邏輯單元就會操作變快,然而FPGA器件并不支持不同操作不同時鐘,時鐘的頻率時最長那條路徑來決定,因此,共享組件對程序的影響不會很大。
在Handel-C中,共享表達式可以很容易定義共享組件,圖2.8是這樣的一個簡單例子,想要了解更詳細的信息,參考Handel-C的用戶指南和DK1設計步驟是很有用的。
圖2.8 Handel-C中的共享表達式
2.3 評估
如果我們不知道估計結(jié)果,這樣就無法知道優(yōu)化是否達到效果,因此,在這節(jié)中,我們將討論有關估計的相關手法。我將給出一些等式,這樣,開發(fā)人員就可以對操作做出判斷。是否值得在硬件中編程?如果結(jié)果達不到預期結(jié)果,器件再高級點是否可以值得這樣做,或者可以想到能達到更高速度的其他方法。這些都是我們這節(jié)要回答的問題。
2.3.1 等式
=+ + (2.2)
現(xiàn)在我們將介紹一些其他的等式來幫助我們估計結(jié)果。
假設硬件在執(zhí)行的過程中不需要經(jīng)常配置,這樣0因此,等式變?yōu)椋?
= + (2.3)
可以通過下面等式得:
=n*t (2.4)
這里的n時鐘的個數(shù),n是時鐘的延時
T可以通過下面等式確定:
t=1/c (2.5)
這里c是時鐘頻率
因此
=n/c (2.6)
n可以在電路編譯后的仿真中得到,c可以從延時報告中得到。
同理我們可以得到
=w/b (2.7)
這里的w是每項操作主機和FPGA芯片需要交換的字節(jié)數(shù),b是器件和PC機通信的接口的帶寬。
把連在一起得:
=w/b+n/c (2.8)
從這個等式中,我們可以看到優(yōu)化并不是只是減少時鐘的個數(shù)和提高時鐘的頻率,我們還要考慮到通信的數(shù)據(jù)量,有時候,高速并不因為你能很快傳遞數(shù)據(jù),而是因為很好傳遞數(shù)據(jù)的方法。例如:如果我們能很輕松處理數(shù)據(jù)以便數(shù)據(jù)在n操作只能被讀一次,然后每個操作中w等于o+i/n,這里o是輸出到主機的數(shù)據(jù)量,而i是從主機輸出的數(shù)據(jù)量。
2.3 等式的推理
我們知道軟件的,所以我們就可以知道期間是否可以達到我們想要的速度。如果不知道,我們將試著去推出來。
1. 首先,w/b是比大一點嗎?如果是,不管硬件運行多快,對整體的速度的提高一點用處都沒有,因為大部分的時間都用來傳遞數(shù)據(jù),除非你利用一個高帶寬的通信接口,這樣就不值得在硬件上執(zhí)行這個程序了。
2. 假設c不變,w/b相對與相當?shù)男 @纾簳r鐘的頻率是不變的,計算n需要達到這個速度,這樣我們就應該考慮更多的并行處理方法來達到這個周期數(shù)
3. 如果你覺得不好處理n,那么就假設n是定值,這樣計算c是否可以提高速度,然后考慮當前的方法是否可以運行在這樣的速度上,如果你用更高級的芯片是否可以提高速度?;蛘吣闶欠衿谕隳苓\行的速度的芯片進入市場。
4. 是否你的方法有局限性,例如:如果你讀同時存儲器中一個地址,可能你的方法能以10倍的速度運行。
5. 最后,你的程序是否可以在硬件的其他可以開發(fā)的并行執(zhí)行的位置執(zhí)行。
2.4 小結(jié)
在這章中,我討論了很多優(yōu)化操作,我介紹了通過重新排列代碼來使你的的程序能并行執(zhí)行在最段的周期中,在后面,我介紹了優(yōu)化操作中很重要的一個計算等式,在等式中,我們了解到操作的執(zhí)行速度不僅跟FPGA芯片運行速度和你能減少多少個時鐘周期,還跟怎樣減少FPGA芯片跟主機通信的資源有關。
第三章:系統(tǒng)的頂層硬件設計
在這章中,我將介紹這樣把軟件編程轉(zhuǎn)換到硬件的一般的5個步驟,我將在后面的幾個小節(jié)中具體介紹這5個步驟。
3.1 設計步驟
Handel-C中,開發(fā)人員把軟件編程轉(zhuǎn)換為硬件電路的一般步驟如圖3.1所示。如下所示:
1. 第一步是編程分析,編程分析通常是確定程序中哪塊要轉(zhuǎn)換為硬件。這步是很重要的,因為這步?jīng)Q定了操作的最后結(jié)果,基本方法是找出一個程序哪一個部分重復執(zhí)行,因此這個部分的速度將很明顯影響整個電路的速度。
2. 第二步是直接轉(zhuǎn)換,這一步是直接把軟件編程不優(yōu)化直接轉(zhuǎn)化到硬件電路中,這樣是為了確保硬件執(zhí)行結(jié)果能跟軟件一樣。
3. 第三步是平衡延時,這是為了平衡硬件每個部分的延時,這一步很重要,因為硬件的時鐘延時會是每個通路的最長的那個延時,因此,如果某一個通路的延時比其他的都要長,這就意味著我們浪費很多資源,因為其他的通路不能運行在更高的速度。
4. 第四步是優(yōu)化,一次運用一種優(yōu)化算法是很重要的。應用優(yōu)化算法后,我們就要看程序是否達到要求,如果沒有達到,就回到第三不,如果達到了,就繼續(xù)下面的第五步。
5. 最后一步是估算,就是估計程序的硬件電路的實際結(jié)果,然后對下面的問題做一個結(jié)論。硬件是否提高了程序的運行速度?如果沒有,在哪一塊能,我們可以用其他的方法來執(zhí)行這個程序嗎?…等。
我們可以看到最后3個步驟事實是我們前面討論的優(yōu)化,剩下的我們將在這章中討論。
圖3.1 硬件開發(fā)步驟
第一步:程序分析。確定程序哪個部分需要轉(zhuǎn)換
第二步:把軟件不優(yōu)化直接轉(zhuǎn)化為硬件
第三步:平衡每路的延時
第四步:優(yōu)化,每次應用一個優(yōu)化算法,檢查是否符合條件要求,如果不符合,回來第三步
第五步:估計實際結(jié)果,寫結(jié)論
3.2 編程分析
在這一節(jié)中,我們將討論硬件頂層設計的第一步。程序分析是最五個步驟中最重要的一步,以為如果在硬件上選擇了錯誤的部分,那么對程序的影響將不會很明顯或者可以忽略。
3.2.1 程序分析的四個指導原則
我研究出程序分析的四個指導原則,開發(fā)人員并不需要必須征尋,但可以給開發(fā)人員知道程序的哪個部分可以轉(zhuǎn)換。
原則1:選擇重復執(zhí)行的部分
原因很明顯,如果我們選擇在硬件中很少運行的部分,盡管這個部分可以高速運行,但對實際程序的運行并不起很大的作用,因為它在硬件中很少執(zhí)行。我們最好選擇在有限的硬件中執(zhí)行程序的內(nèi)循環(huán)。然而,因為技術的提高,今天,隨著FPGA芯片的越來越大,集成的百萬個門和實時的在線配置,把整個程序都寫到硬件中都是有可能的。
原則2:選擇數(shù)據(jù)依賴性小的模塊
在硬件執(zhí)行的那部分程序是不能太依賴數(shù)據(jù),F(xiàn)PGA芯片一般是比PC機的CPU要慢一點,這就為什么需要外加邏輯電路來配置FPGA器件。因此程序的并行操作才可以到達高速。太依賴數(shù)據(jù)將會減少并行的操作,因為這塊的數(shù)據(jù)取決于其他塊的數(shù)據(jù)將會影響程序的并行操作。
原則3:選擇通信少的模塊
硬件執(zhí)行時間是
= + + (3.1)
這里的表示總的執(zhí)行時間
表示重新配置的時間
表示主機和FPGA芯片傳遞數(shù)據(jù)的時間
表示實際的數(shù)據(jù)執(zhí)行時間
從等式3.1可以看到,完成所有硬件操作的時間不但取決于數(shù)據(jù)執(zhí)行時間,而且還包括了FPGA芯片配置時間(),傳遞初始數(shù)據(jù)和從FPGA芯片中讀數(shù)據(jù)的時間(),如果我們不需要實時重新配置FPGA芯片,在我們第一次配置器件的時候,?就是零,然而每次執(zhí)行程序的時候,就不會是零,總共的時間取決于主機和器件交換的數(shù)據(jù)量很交換的頻率。如果有大量的數(shù)據(jù)要傳送,當Tcomm占Texec的大部分的時候,高速運行可能就達不到。然而在某些情況下是有辦法來解決這個問題的。例如,如果在順序執(zhí)行的時候,大部分的數(shù)據(jù)是一樣的,我們在第一次操作后就把這些數(shù)據(jù)留在FPGA芯片中,這樣順序執(zhí)行的Tcomm包括在傳遞不同數(shù)據(jù)的時間中。
原則4:如果可以,盡量避免浮點型的計算
眾所周知,PC機比FPGA芯片能更好得計算浮點型數(shù)據(jù),由于專用的CPU和很好并行硬件設計,所以推薦有CPU來處理浮點型數(shù)據(jù),盡管FPGA有支持浮點型數(shù)據(jù)計算的庫,但它不能像運行整形數(shù)據(jù)計算那樣快,然而,現(xiàn)在有很多商業(yè)界,學術界都在研究這個操作,所以我可以預見這個原則過不了多久就用不上了。盡管這樣,我還是要推薦避免浮點型數(shù)據(jù)操作,如果開發(fā)人員碰到浮點型的計算,應該試著考慮可否用整形數(shù)據(jù)計算來代替浮點型的計算。
所有的硬件開發(fā)操作中,這些操作是最難實現(xiàn)自動完成的。因為這涉及到考慮程序到底是做什么的,因此很難找到一個實現(xiàn)自動的規(guī)則,然而,可以從現(xiàn)在的編譯器借鑒一些方法來使這一步簡單點,例如:亨利絲和帕得森研究的編譯器的方法,從而發(fā)現(xiàn)數(shù)據(jù)依賴而且很有可能可以除去這中依賴性。
3.3直接轉(zhuǎn)換
在這節(jié)中,我們將看到開發(fā)過程的第二步。就是把軟件編程直接轉(zhuǎn)化成硬件語言,這一步不涉及任何優(yōu)化,把優(yōu)化留在后面是因為我們必須確保硬件編程能和軟件編程有同樣的結(jié)果,這樣可以方便調(diào)試,如果我們把優(yōu)化放在前面,這樣如果有錯誤有發(fā)生時,我們就很難調(diào)試程序,因為我們不知道問題出在哪一步。
這個部分是很直接,因為Handel-C是一門頂層設計語言。僅僅需要加一些代碼來讓主機和FPGA器件之間通信,這部分代碼要符合等式3.1中通信用時(),它的工作之一是從主機取出和裝入進程需要的數(shù)據(jù),另一個工作是把FPGA器件處理后的數(shù)據(jù)傳回主機。上面提到,這一步很重要。找到一個能每項操作傳送最少數(shù)據(jù)方法是很重要的,一種可行的方法是把盡量多可以再用的數(shù)據(jù)用FPGA的RAM儲存起來。另外一種方法是把數(shù)據(jù)分割成若干部分以便FPGA芯片能儲存起來,反復利用這些數(shù)據(jù),直到它被清除出器件。通信的編碼很難實現(xiàn)自動完成,因為不同的芯片和主機通信的方式不同。然而,去年,一個卓越的工學士李東尤提出可以解決這個問題的方案。他開發(fā)出一種新的語言,這種語言把軟件編程和硬件語言統(tǒng)一在一起。有了這個軟件,用戶可以定義哪些部分由硬件完成,哪些部分由軟件完成。指定器件后,他的編譯器通過器件庫自動生成通信代碼,因此,如果要編譯器支持一個新的器件,用戶可以很簡單把它寫進庫里。這種方法可以使一般的開發(fā)人員不必花太多的時間在寫器件的通信代碼。
3.4 小結(jié)
在這個章節(jié)中,我們討論了高速FPGA芯片的頂層設計的一般步驟,在第二部分,我還提到了怎樣解決通信中的最少數(shù)據(jù)量的問題。
第四章:例程分析:2-D凝膠圖像處理
在這章里,我們將討論在第二章提到的現(xiàn)實生活中的應用。我們將以2-D凝膠圖像的處理作為例子來說明第二章中提到的開發(fā)步驟。我們還將比較流水線操作和RC1000操作的性能,遺憾的是,由于一些困難,我還沒研究出2-D凝膠圖像的處理的流水線操作,這在后面的章節(jié)將會細細討論。
4.1 2-D凝膠圖像處理
2-D凝膠圖像處理是一個用研究的技術,它的目的是在不同時間將兩張圖像來匹配凝膠模型,然而,因為不同大小的圖像很難對準,所以很難正確和有效的匹配模型,最近S.Vesser博士,M.J.Dunn博士和 G. Z.Yang博士的一片論文中提到一個新奇的技術,這種技術是基于圖像強度分配比選擇圖像特性佳的原則。方法是使用凝膠圖像處理一個多解析度表示法而且開發(fā)事實最佳的匹配的近似值能被從低解析度圖像有效率地吸取。
在這一步,最重要是找出程序執(zhí)行次數(shù)最多的內(nèi)循環(huán),否則對程序的影響不會很明顯,所以我們必須掌握這種方法工作的算法。下面是用于編程的簡短算法。
第一步:設定層為第0層;
第二步:設定解析度為5來模糊圖像I1,I2 ;
第三步:嚴格優(yōu)化轉(zhuǎn)換參數(shù)t為;
第四步:如果l小于5,繼續(xù)下面第五步,否則結(jié)束;
第五步:細化t
第六步:如果沒有完成所有的t矩陣ai,j;ai+1,j;ai,j+1;ai+1,就執(zhí)行第七步,否則執(zhí)行第八步;
第七步:將控制點ci,j;ci+1,j;ci,j+1;ci+1,j+1最佳化是由使用 BFGS 取
f(c)=corr(l1, tc(I2))的最大值得到,然后回到第六步;
第八步:增加設計層次l
第九步:設定解析度為5+l來模糊圖像I1,I2,然后回到第四步;
基本上,運算法則的主意是把兩個輸入圖像 (I1,I2) 分為特定數(shù)目的區(qū)塊(柵極)。當圖像2(I2) 的柵極形狀被控制點(ci,j; ci+1,j; ci,j+1; ci+1,j+1)決定的時候, 圖像1(I1) 的柵極在外形上總是尖銳的.一個目標圖像(tc(I2)) 是通過轉(zhuǎn)換對I1的對應I2中尖銳的柵極圖素,這樣是為了符合I1中的矩形像素。阻止控制點的操作和相似性就可以在 I1 和Tc(I2)之間被計算。相似性是在 2個圖像之間的圖素的關聯(lián)。然后派生出將會用來調(diào)整控制點,以使在I2和Tc(I2)之間的相似性將會增加。重復執(zhí)行程序,直到相似性的達到滿意。
上面的整個程序在圖像的不同解析度將會被執(zhí)行。從低的解析度到高解析度的操作。 柵極的數(shù)目是程序工作的解析度決定。源自較低的解析度的控制點將會決定較高的解析度的程序開始控制點。很顯然計算的哪一步是用時最多, 就是第7步的“控制點的優(yōu)化”。因此我選擇這一個部份作為我們硬件操作的出發(fā)點。
4.2.2原則4:盡量避免浮點型數(shù)據(jù)的計算
因此我們選擇執(zhí)行時間最長的那個部分?,F(xiàn)在應該看看這部分是否適合在硬件執(zhí)行,實現(xiàn)是適當?shù)摹?因為控制點的優(yōu)化算法是用包括許多浮點型數(shù)據(jù)計算的算出的,所以在第一眼看去,程序是不符合這個規(guī)則的。 在現(xiàn)階段,我們應該做第一件事物是看是否可以用整型數(shù)據(jù)計算來代替浮點計算。一個有用的方法是依大小決定浮點型數(shù)據(jù)的數(shù)值,以便特定量整型數(shù)據(jù)的最低重要整型數(shù)據(jù)位表現(xiàn)在十位后面的數(shù)值。 但是正常地,浮點型數(shù)據(jù)能比相同的寬度整型數(shù)據(jù)適應數(shù)值范圍大。 這就意味著,當把它傳遞到整數(shù)的時候,我們要丟掉浮點型數(shù)據(jù)的某些有效數(shù)據(jù)位。丟掉這些有效數(shù)據(jù)位對這程序運行的影響不是很大。
遺憾的是,我認識到這不是程序的主體,事實上,一些運算過程的中間結(jié)果有很大的數(shù)據(jù),特別是程序運行在很多像素參加處理的時候。這就意味著丟掉一些有效數(shù)據(jù)位對程序的最后影響是很明顯的,但是,當我們更深入了解程序的時候,我們就會發(fā)現(xiàn)優(yōu)化其實是可以分成兩個部分的。
·相似性和導出的轉(zhuǎn)換和計算
·BFGS優(yōu)化
僅僅第二個部分才會涉及到浮點型數(shù)據(jù)的計算,第一部分可以在整型數(shù)據(jù)上執(zhí)行,現(xiàn)在,我們就要問個問題:第一個部分也是程序執(zhí)行最頻繁的那個部分嗎?在回答這個問題之前,讓我們來看看下面這個等式:
c=w*i*CPI (4.1)
這里的w是程序中數(shù)據(jù)單元的個數(shù)
i是每個數(shù)據(jù)單元指令的平均值
CPI是每個指令執(zhí)行的平均周期
c是程序執(zhí)行總共時鐘周期
現(xiàn)在我可以告訴答案是第一個部分就是程序執(zhí)行最頻繁的那個部分,盡管兩個部分執(zhí)行的時間是一樣的,第一部分的確是計算量最大的,原因是兩者圖像的大部分像素都參與到第一部分的計算,而第二部分只須計算控制點的工作,控制點要比圖像的像素點要少得多。因此第一部分的等式4.1中的w要比第二部分的等式4.1中w要大很多,但兩個部分中的i和CPI接近相等的。i之所以相等是因為每個數(shù)據(jù)的計算量差不相等的,CPI相等是因為CPU的流水線是滿的,應為這兩部分的操作需要相當多的計算操作。因此,通過等式4.1,我們可以知道,第一部分的c要比第二部分的c要大很多。因為CPU的時鐘是固定的,所以我們可以計算出第一部分是程序計算量最大的部分。
4.2.3 原則2:選擇數(shù)據(jù)依賴少的部分
選擇的這部分的代碼是符合這個標準嗎?答案是符合。因為對于每個目標像素,它的數(shù)值完全地在來自Image2的4個像素,而且不影響其他目標像素。這就意味著在流水線操作可以同時操作所有的目標像素,這樣就對數(shù)據(jù)的依賴性很小,相似性和導出計算也對數(shù)據(jù)的依賴性很小,這樣是因為他們是從對數(shù)據(jù)依賴性很小的目標像素計算得到的。
4.2.4原則3:選擇消耗通信資源少的部分
由等式2.1知,是的一個部分。因此,不能很大也很重要。在前面的章節(jié)中提到, =w/b,這里b是要通信的數(shù)據(jù)被通信接口的帶寬分成字節(jié)數(shù)。要通信的數(shù)據(jù)量
w=I1+I2+cp+Tc(I2)+d+s
這里I1,I2是源圖像,cp是控制點數(shù)組,(I2)是被轉(zhuǎn)換的圖像,d是一個能確定中間結(jié)果的數(shù)組,s是一個能決定相似性的中間結(jié)果的數(shù)組,在最高的解析層次,每個像素的大小是512位*512位,有17*17的控制點,每個控制點也4位的x,y,每個控制點有6個8位的d數(shù)據(jù)。每個8位數(shù)據(jù)有5個s數(shù)據(jù),因此總共要傳遞的數(shù)據(jù)有80256個字節(jié),在Pilchard系統(tǒng)中,的64位100M的DIMM接口的帶寬是8*100MHZ=800MB/s,因此,是80256/80010241024s,這比0.001s還要小,對于RC1000,32位的PCI33的帶寬是433=132MB/s,因此,它的是80256/13210241024s,這個大約是0.01s。因為程序的運行時間通常是3s左右,因為我們能繼續(xù)執(zhí)行程序。
收藏
編號:2689880
類型:共享資源
大?。?span id="mzebxcnn0" class="font-tahoma">726.04KB
格式:ZIP
上傳時間:2019-11-28
5
積分
- 關 鍵 詞:
-
基于
fpga
通道
采樣系統(tǒng)
設計
論文
資料
- 資源描述:
-
基于FPGA多通道采樣系統(tǒng)設計論文資料,基于,fpga,通道,采樣系統(tǒng),設計,論文,資料
展開閱讀全文
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學習交流,未經(jīng)上傳用戶書面授權(quán),請勿作他用。