FPGA之道(60)時空變換之空域優化

      網友投稿 855 2025-04-06

      文章目錄


      前言

      時空變換之空域優化

      邏輯化簡

      資源合并

      模塊復用之分時復用

      靜態重構

      動態重構

      思路轉換

      前言

      時空變換之空域優化

      本小節我們主要關注空域內部的優化方法。注意,在做空域優化時,往往是不以犧牲時域余量為前提的,因為它的目的主要是去除空域內部的一些冗余。接下來,將為大家介紹幾類比較常用的空域優化方法:

      邏輯化簡

      正如我們在【時空變換之時域優化->邏輯化簡】小節中所討論的,采用邏輯化簡的方法不僅對提高時域方面的性能有好處,對提高空域性能方面也具有很好的效果,不過受制于FPGA芯片所基于的LUT結構以及編譯器的優化功能,我們并不需要在此花費過多精力,僅需在我們的HDL代碼中稍作注意,剔除明顯且過分的組合邏輯冗余即可。具體的邏輯化簡方法,可以參考【共同語言篇->數字邏輯電路基礎知識->數字邏輯的化簡】章節。

      資源合并

      資源合并是提高空域余量的另一個好方法,它的原理有點類似于數據壓縮,即當FPGA設計中需要同時用到兩個以上功能一樣的模塊時,想辦法讓其功能變為單個模塊的N倍,但是資源的膨脹卻小于單個模塊的N倍,這樣一來,便給空域騰出了可觀的余量。注意,資源合并的方法并不是對任何情況都適用的,而且它還必須以資源本身有余為前提,即在當前條件下,資源并沒有被充分使用。下面,我們就以FPGA內部的BRAM資源為例,來介紹一下具體的資源合并情況。

      BRAM是FPGA內部一個比較靈活的資源,假設,某一型號FPGA芯片內部每一塊BRAM的容量為8kbits,可以被配置成為1bit x 8k、2bits x 4k、4bits x 2k、8bits x 1k、16bits x 512 以及32bits x 256這幾種可供選用的RAM形式。

      如果我們需要緩存1路連續的數據,數據位寬均為8bits,緩存深度要求為512個采樣,那么此時,我們可以選取8bits x 1k或16bits x 512這兩種BRAM配置模式,來得到可以滿足當前緩存要求的RAM。注意,此時無論選用上述兩種中哪一種配置模式,BRAM資源都沒有被充分使用——對于8bits x 1k模式來說,有一半的存儲空間被閑置了;而對于16bits x 512模式來說,有一半的數據位寬被浪費了。

      現在假設我們需要同時緩存兩路這樣的連續數據,那么大腦中的第一反應估計就是為2路數據都創建一個獨立的緩存,而這樣一來,就需要2塊BRAM資源。每塊BRAM資源的存儲容量為8kbits,可是每路路數據僅需要緩存容量為4kbits,這也就是說,如果僅僅看存儲容量的話,那么其實1塊BRAM就足夠應付這2路數據的緩存了。不過雖然FPGA內部的BRAM一般都是雙口RAM,有兩套獨立的讀、寫及控制總線,但是高吞吐的數據緩存一般都是采用A寫B讀的操作模式(詳見【本篇->編程思路->數據的存儲->雙口RAM的HDL描述與用法】小節),因此兩套端口都被占用,所以即便是緩存第1路數據的BRAM中有多余的空間,由于它已經沒有多余的讀、寫及控制端口供第2路數據使用,因此也不能貿然合并,這便是資源合并方法所受到的限制。不過如果這2路數據在此僅僅是需要一個緩存操作,并且對于緩存的讀、寫并沒有特別不同于彼此的要求,那么我們其實可以將它們看做1路位寬為16bits的連續數據,這樣便可以將BRAM配置成為16bits x 512的模式,來同時對它們進行緩存。這樣一來,整個緩存電路的功能變為原來的兩倍,但BRAM資源卻仍然只需要1個,因此,總的資源膨脹率將會遠小于2倍,為空域爭取了客觀的余量。

      模塊復用之分時復用

      模塊復用可分為兩類:第一類是分時復用,它也是針對處理當FPGA設計中需要用到兩個以上功能一樣的模塊時的空域優化需求,但分時復用與資源合并的方法有著本質不同,那就是分時復用針對的是不同時使用的多個功能相同模塊的空域優化,而資源合并針對的是需要同時使用的多個功能相同模塊的空域優化,這點是需要明確清楚地。模塊復用的第二個類別是提速復用,這是以犧牲時域余量為前提的,因此將在后續的【時空變換之時間換空間】小節中予以介紹,而本小節則主要關注模塊分時復用的方法。

      模塊分時復用的思路很簡單,當一個模塊的功能需要在多處使用時,如果這些使用不會同時發生,那么就可以考慮按照時間來分配該模塊的使用權,從而達到該模塊只需要被例化一次,但卻可以為多個邏輯塊提供服務。這就好比在家里看電視一樣,晚上67點,動畫片時間,小孩子最愛看;晚上78點,新聞時間,一路隨著新中國走來的老一輩最愛看;晚上8~10點,各類肥皂劇以及綜藝節目,工作壓力較大的中青年人士最愛看。這樣一來,雖然電視只有一臺,但是各個年齡段人的需求都得到了滿足,而分時復用也就是如此而已。注意,分時復用的方法同樣也無法對任何情況都適用,而且它也必須以資源本身有余為前提,即在當前條件下,資源并沒有被充分使用。下面我們仍以BRAM為例,來介紹一下具體的時分復用情況。

      假設FPGA系統中有兩個不會同時執行的任務——任務1和任務2,它們分別需要緩存第1路、第2路的數據,數據的寬度為8bits,緩存深度要求仍為512。與【資源合并】小節中的例子類似,在最開始的時候,我們通常會為每一個任務分配一個BRAM作為緩存,可以看出,此時資源仍然沒有被充分利用,因為任務1執行的時候任務2所使用的BRAM處于閑置狀態,反之,任務2執行的時候任務1所使用的BRAM也處于閑置狀態。但與【資源合并】小節的例子又不同,本例中,任務1和任務2是不會同時執行的,因此我們在緩存第1路數據的時候無法同時也去緩存第2路數據,故難以應用資源合并的方法來優化空域。不過,如果任務1及任務2每次的執行都完成了本次所有數據的寫入和讀取操作,那么我們就可以讓任務1和任務2來分時復用1個BRAM,從而在僅使用1個BRAM的條件下就完成了任務1和任務2的數據緩存需求,大大提高了空域的余量。但是,若任務1及任務2并不是每次執行都完成了本次所有數據的寫入和讀取操作,那么分時復用的方法就難以派上用場,這便是分時復用方法的制約。例如,現在共有四個任務,任務1、任務2分別負責將接收到的第1路、第2路數據寫入緩存中,而任務3、任務4分別負責將緩存中的第1路、第2路數據讀出。此時,即使這四個任務中,沒有哪兩個會同時執行,我們仍然不能使用分時復用的方式來優化空域,因為如果仍然想僅使用1個BRAM作為緩存的話,會給系統帶來操作錯誤。例如,如果任務1執行完成之后,下一個觸發的任務不是任務3,那么就會帶來錯誤——如果下一個任務是任務2,那么BRAM中保存的第1路數據將會被覆蓋,這樣下次任務3執行的時候將無法讀出正確的數據;如果下一個任務是任務4,那么由于BRAM中保存的是第1路數據,所以任務4讀出的數據也是錯誤的。

      類似的例子還有累加器的使用,如果串行發生的每個任務都能在它的執行過程結束后得到需要的累加結果,那么累加器就可以被多個任務復用;如果某個任務需要被多次調用后才能得到最終的累加結果,那么就必須為它單獨分配一個累加器。

      靜態重構

      FPGA芯片為什么需要配置?因為一旦掉電,FPGA芯片便變成一張白紙,不再具有任何有意義的邏輯功能,所以我們需要在每次系統上電的時候,采用在【知己知彼篇->FPGA芯片的配置方法】章節中介紹的那些FPGA芯片的配置方法,來對FPGA芯片進行配置,從而使得FPGA芯片具有我們預期的邏輯功能。

      恰恰是FPGA芯片這種使用前需要配置的特征,可以被利用來進行空域優化,要想弄明白其中原因,我們需要先搞清楚一個問題,那就是對于一個被配置好的FPGA芯片,它將保持這配置好的功能到什么時候呢?答案有兩個:一、系統掉電時,二、另外一次配置。沒錯,正是這利用這第二個答案,使得更加宏大的空域優化成為可能,這便是FPGA芯片的靜態重構技術。

      靜態重構其實是更加宏觀一些的分時復用,只不過之前介紹的分時復用指的是FPGA設計內部某一個模塊或者某一個資源的分時復用,而靜態重構,指的是整個FPGA芯片的分時復用。

      靜態重構技術的具體操作方式,其實就是提前針對多種不同的需求編譯出多個不同的FPGA配置文件,然后在系統運行時,根據每個時段的不同需求,利用了FPGA芯片的被動配置模式或者JTAG配置模式,選擇性的將具有對應功能的配置文件下載到FPGA芯片當中并開始工作。由于靜態重構技術其實就是分時復用的宏觀擴展,因此它的應用也受到相同的限制,不過對于那些適合應用靜態重構技術的情況,其對空域方面的優化那是非常非常可觀的!下面,我們就通過一個例子來對靜態重構技術進行更為形象的了解:

      假設你現在需要在FPGA上實現一個通用的視頻編碼器,即能夠根據需求將輸入的原始圖像序列壓縮為當前主流的mpeg2、mpeg4或h264等視頻流并發送出去。在視頻壓縮領域中,往往編碼要遠比解碼復雜,因此,我們先假設實現一個基本的mpeg2編碼器需要相當于400萬門的等效邏輯資源、實現一個基本的mpeg4編碼器需要相當于700萬門的等效邏輯資源、實現一個基本的h264編碼器需要相當于600萬門的等效邏輯資源。如果你現在是在做一個產品,那么你需要考慮成本,因此你做了市場調研,查到了如下兩個型號的FPGA芯片的價格:

      FPGA_CHIP_A —— 1000萬門、40美元;

      FPGA_CHIP_B —— 2000萬門、100美元;

      請問你該選擇哪款芯片來開發你的產品呢?

      如果你的方案是在FPGA內部同時實現mpeg2、mpeg4及h264這三個編碼器,然后根據實際情況每次使能其中一個作為當前工作的視頻壓縮引擎,那么你需要選擇FPGA_CHIP_B,這樣每一個產品上的FPGA相關成本為100美元。

      如果你在設計方案的時候參考了靜態重構技術,那么你的方案可能是這樣的:針對mpeg2、mpeg4及h264各建立一個單獨的FPGA工程,并分別編譯出三個單獨的配置文件分別對應mpeg2、mpeg4及h264編碼功能,然后根據實際情況,每次載入一個配置文件到當前的FPGA芯片中以實現相應的視頻壓縮功能。此時,你就可以選擇FPGA_CHIP_A,如果存儲多個配置文件需要花費10美元購買相應的存儲芯片或微處理器,那么現在每一個產品上的FPGA相關成本僅為50美元,比上一方案節省了50美元,由此可見靜態重構技術對空域方面的貢獻以及其偉大之處。

      動態重構

      還有什么技術比靜態重構更激動人心的嗎?有!那就是動態重構!

      動態重構仍然是分時復用技術的延伸,不過相比于靜態重構,它在某些方面有著不可比擬的優越性:

      首先,靜態重構是整個FPGA芯片的重構,哪怕兩個設計之間僅僅有一點不同,也必須對FPGA芯片進行大換血;而動態重構則可以針對FPGA設計中的某一個小部分進行重新配置,同時保持其他部分的狀態不變。

      其次,靜態重構的過程中,整個FPGA芯片處于配置狀態,此時所有I/O端口均處于輸出或者高阻狀態,因此不能進行工作;而動態重構僅影響FPGA芯片中的一部分邏輯,因此其他邏輯部分在動態重構過程中仍可以進行正常工作。

      第三,靜態重構一般耗時較長,這一點,容量越大的FPGA芯片感覺就越明顯,有時候配置一次恐怕要用到幾秒或十幾秒;而動態重構僅針對性的修改某一小部分邏輯,并且可以選擇更加快捷的下載機制,因此配置過程耗時短。

      最后,并不是所有的FPGA芯片都支持靜態重構的,例如基于反熔絲的FPGA芯片,但是我們有辦法讓所有的FPGA芯片都支持動態重構。

      列舉了這么多的優點,那到底什么是動態重構技術呢?其實動態重構就是一種在FPGA運行的過程中,通過某種方法動態的改變其某一部分電路所對應邏輯功能的技術。如果你對本書開始的內容還有印象,可以發現這好像與【共同語言篇->硬件描述語言->軟件編程思路與FPGA編程思路的區別->執行方式對比->資源占用與釋放】小節中的介紹的內容相沖突,因為在那一小節中,我們明確的闡述了FPGA編程中不存在對資源動態的申請與釋放,那么動態重構又是怎么在FPGA芯片中實現的呢?

      其實在【本篇->編程思路->狀態機,FPGA的靈魂->狀態機的實現方式->基于RAM的實現方式淺析】小節中,我們已經引出了動態重構的一些概念和應用,大家可以回顧一下。還記得組合邏輯是如何在FPGA芯片中實現的吧?沒錯,這是查找表(LUT)的功勞。LUT就像是一張空白的真值表,你填成什么樣子,它就具有什么樣的功能。那么LUT是什么?LUT其實就是數據存儲啊!這也是為什么我們在【本篇->編程思路->數據的存儲】章節中將一個看似不起眼的數據存儲功能說的如此神乎其神,好像離了它FPGA芯片就不運行一樣,因為事實真的就是如此。FPGA的配置過程,其實就是將配置文件的內容寫入FPGA芯片的過程,這實際上就是一個數據存儲的過程。但是,顯然在FPGA運行的時候,我們無法重復這一數據存儲的過程,因為除了靜態重構方法以外,我們幾乎沒有方法去修改FPGA芯片所基于的那個特殊的SRAM中的數據內容(不過隨著技術的進步,相信FPGA的集成開發環境會逐漸支持對該SRAM的非配置修改的)。不過在FPGA運行的時候,倒是給我們提供了不少可供使用的數據存儲資源,例如觸發器、查找表、BRAM甚至片外存儲芯片等。因此,與LUT可呈現出多種不同功能一樣,任何數據存儲都可以被看做一張真值表,只要能夠動態的修改數據存儲中的內容,就相當于動態的修改了它的邏輯功能。數據存儲中的內容可以被動態修改么?當然,因為FPGA中的數據存儲載體都可以以RAM的形式出現。綜上所述,動態重構技術就是利用RAM作為邏輯功能的載體,通過運行時修改RAM中的內容,來到達邏輯功能的動態改變,因此對空域性能有著很好的提升。下面我們仍以BRAM為例,來介紹一下具體的動態重構技術的使用:

      仍以一個8kbits的BRAM為例,若我們將其配置為8bits x 1k的模式,那么其地址總線addr應該為10bits,數據總線data應該為8bits。

      如果我們需要實現一個乘法功能Y = AxB,若A、B均為4bits位寬,那么其結果用一個8bits的數便可以完全表示。此時,我們將該BRAM的地址總線連接到““00” + A + B”(此處+號為連接符),然后動態的修改BRAM中地址0~255的內容如下即可:

      0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、

      0、1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、

      0、2、4、6、8、10、12、14、16、18、……

      0、3、6、9、12、……

      ……

      FPGA之道(60)時空變換之空域優化

      0、15、30、45、60、……225。

      如果接下來又要實現一個除法的功能Y = A / B,若A為8bits、B為2bits,那么其結果用一個8bits的數便可以完全表示。此時,我們將該BRAM的地址總線連接到“A + B”(此處+號為連接符),然后動態的修改BRAM中地址0~1023的內容如下即可:

      *、0、0、0、(*號表示不關心,因為被除數不應該為0)

      *、1、0、0、(商的整數結果采用去尾法得到)

      *、2、1、0、

      *、3、1、1、

      *、4、2、1、

      *、5、2、1、

      ……

      *、255、127、85。

      如果接下來又想實現一個波形發生器,產生一個方波,那么則可以使用一個10bits計數器的計數值連接到BRAM的地址總線,然后動態的修改BRAM中地址0~1023的內容類似如下即可:

      0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、

      80、80、80、80、80、80、80、80、80、80、80、80、80、80、80、80、

      0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、0、

      80、80、80、80、80、80、80、80、80、80、80、80、80、80、80、80、

      ……

      如此這般,只要修改一次BRAM中的存儲內容,就完成了一次動態重構操作,只要不斷的修改,就可以僅僅利用一塊BRAM實現出成千上萬種行為迥異的邏輯,這是一項多么令人激動的技術啊!

      思路轉換

      思路轉換同樣也是提高空域性能的一個好方法,關于它的具體討論,可以參照【時空變換之時域優化->思路轉換】小節。

      FPGA

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:見招拆招:老油條教你如何化解大廠面試官的線程池奪命連環炮!!!
      下一篇:分享了之后,怎么自己加入協作編輯?(怎么協作編輯文檔)
      相關文章
      色天使亚洲综合一区二区| 亚洲乱码中文字幕综合| 国产AV无码专区亚洲AV毛网站| 亚洲国产片在线观看| 91亚洲国产成人精品下载| 亚洲A∨无码无在线观看| 国产亚洲成人久久| 国产午夜亚洲不卡| 亚洲综合国产一区二区三区| 国产AⅤ无码专区亚洲AV| 亚洲精品国产自在久久 | 日本系列1页亚洲系列| 亚洲AV无码久久| 久久99亚洲网美利坚合众国| 亚洲精品高清久久| 亚洲视频在线观看一区| 久久丫精品国产亚洲av| 亚洲av午夜福利精品一区人妖| 久久青草亚洲AV无码麻豆| 亚洲精品成人片在线观看| 亚洲中文字幕丝袜制服一区| 久久精品国产精品亚洲人人| 亚洲av无码成人精品区| 国产a v无码专区亚洲av| 亚洲精品色午夜无码专区日韩| 亚洲色偷偷综合亚洲AV伊人| 亚洲永久无码3D动漫一区| 亚洲国产精品无码久久SM| 亚洲伊人久久精品影院| 久久精品亚洲综合| 亚洲国产成人精品无码一区二区 | 亚洲av第一网站久章草| 亚洲av无码成人精品区| 亚洲国产成人精品女人久久久| 国产成人精品日本亚洲专区| 亚洲成AV人片在WWW色猫咪| 亚洲av成人无码久久精品| 亚洲人成网站日本片| 亚洲日韩精品无码专区加勒比| 亚洲中文字幕一区精品自拍| 色偷偷亚洲男人天堂|