在MLIR故事線裡面插播一條FPGA的文章,這源於FPGA課堂作業的一道題。What is FPGA? Explain the main differences between FPGA and CPU in terms of operation principle? 那我就來說說,我眼中的FPGA,以及它和CPU之間的關係。

在本科階段,我接觸過三次FPGA,分別是數字邏輯課設、計算機組成原理課設和硬體綜合課設。正巧這三次使用FPGA的經歷,可以回答課堂作業中的問題。

數字邏輯課設 —— 什麼是FPGA

數字邏輯課設中分為一系列的子任務,實現譯碼器、分頻器、七段數碼管掃描電路等等。最後是一個綜合性的實驗,就是把子任務中實現的各種器件組合起來,使整個電路能夠完成一個實際功能,我當時選擇實現一個藍芽密碼箱,肝了好久,加上老師手把手幫忙,最後實現的那一刻真的激動了好久,這是當時成功時的照片:

我眼中的FPGA & CPU

當時我把FPGA純粹當作一個黑盒子看待,就是用verilog寫程式碼,然後就看波形有沒有錯誤,然後分配引腳,再把程式上傳到試驗箱上。一步一步都是按照實驗手冊進行,最後做完實驗反過頭來想,什麼是FPGA呢,一查概念,FPGA是Filed Programmable Gate Array的縮寫,即現場可程式設計門陣列,emmm,當時的我是理解不了,然後就開開心心地享受假期了。

那麼現在來看,數字邏輯課設就是使用了FPGA最基本的特點:硬體可程式設計。最終實現的數字邏輯課設功能,實際上就是一個電路,有輸入訊號,透過一系列的邏輯運算,最後產生輸出。那麼編寫的verilog程式碼就是在用相對高階的語言,描述時序與組合邏輯電路的功能。但是此時FPGA理解不了verilog的程式碼呀,所以就需要進一步地編譯,從而讓FPGA知道應該怎麼實現verilog描述的電路。首先就得進行綜合(Synthesize),這一步就是把verilog程式碼翻譯成由各種與、或、非門以及RAM和觸發器組成的邏輯連結。此時生成的邏輯連結檔案距離實際的晶片配置還有一定距離,這就需要佈局佈線步驟,將生成好的邏輯連結適配到FPGA內部的硬體結構上。這樣一來,FPGA就可以實現我們設計的電路功能。

FPGA與CPU

在我看來,FPGA和CPU的執行方式的不同來源於邏輯電路結構是否可變。CPU是具有馮諾伊曼結構的固定的電路,這種結構擅長做指令排程,因此它可以執行軟體,即軟體可程式設計。而FPGA邏輯電路結構是可變的,是可以隨時定義的,這就是硬體可程式設計的真意,它可以透過硬體描述語言,實現任何電路,當然也可以變成一個CPU。

計算機組成原理課設 -- CPU軟核

計算機組成原理課設中最終要求實現一個MIPS架構單發射的5級流水的處理器。也就是說,在課設中,使用verilog實現了MIPS架構的處理器軟核,然後再加上驅動試驗箱的IP核,完成了整體的電路結構。最終處理器執行給定的MIPS彙編程式,在試驗箱的數碼管上實現迴圈計數的功能。

我眼中的FPGA & CPU

這種方式就是在硬體可程式設計的FPGA上實現了CPU軟核,這樣就使它擁有了馮諾伊曼結構,從而擁有了軟體可程式設計的能力。它叫做軟核就是因為,它需要經過模擬、綜合以及佈局佈線過程之後才可以使用,這樣做的優點在於可以根據自己所需要的功能來進行配置,比如說,我們可以在這個5級流水的CPU軟核上面,再新增保留站和Reorder Buffer的結構,把它變成一個支援亂序執行的處理器,這就體現了軟核的靈活的優點。

硬體綜合課設 -- CPU硬核

硬體綜合課設是給一塊Xilinx的PYNQ板子,以及所需的感測器,實現一個特定功能。我們小組選擇了DHT11的溫溼度感測器、web camera以及顯示器,實現了戶外車牌識別裝置。

我眼中的FPGA & CPU

我眼中的FPGA & CPU

在這個課設中使用的PYNQ板子,分為PS(Processing System)和PL(Programmable Logic)兩個部分,PS端實際上就是一個ARM架構的CPU硬核的存在,執行Linux和Python實現軟體可程式設計,PL端是FPGA,實現硬體可程式設計,可以驅動感測器向PS端傳遞實時資料。這種硬核實際上是將ARM處理器植入FPGA晶片,形成新的SOC晶片,這種晶片可以配置各種作業系統,而同時也具備FPGA晶片的優勢,可以自己定製邏輯,比如我們課設中的對於DHT11溫溼度感測器的驅動,而且作為硬核,CPU的部分,不會擠佔FPGA的邏輯資源。

回顧本科階段與FPGA的接觸,我真的非常感激這些課設對我整個計算機知識體系理解的幫助,最後向教我數字邏輯的陳老師、計算機組成原理的朱老師、硬體課設的王老師表示感謝,在我當時卡殼的時候,老師們幾乎都是手把手地幫我度過難關,非常幸運能夠遇到這些好老師!