安徽四創電子股份有限公司 何啟躍 徐 瑾
?
FPGA軟件的“仿生”設計理念初探
安徽四創電子股份有限公司何啟躍徐瑾
【摘要】本文從分析FPGA芯片的內部構造及工作方式入手,在闡述FPGA軟件的基本開發流程及常見的設計誤區過程中提出了一種將電路功能模塊的描述看做是“生命體”的仿生的設計理念。經對比分析表明,“仿生”設計理念對理解概念和激發靈感有著非常積極的促進作用。
【關鍵詞】FPGA軟件設計;模塊劃分;仿生
做為大規模可編程邏輯電路芯片的主要代表,FPGA(Field Programmable Gate Array)正以其獨特的全開放、可重構、大容量、高集成度及高速并行計算能力等優點迅速成為各種中、高端數字電路中的核心器件。
FPGA的最大特色在于其內部電路結構的可重建性。因此描述其內部電路構造的軟件設計是否合理、穩健將會直接影響著其可靠性和并行處理能力的發揮。
在多年的FPGA軟件研發中,我們嘗試將高效的人員組織架構及溝通方式等人們所熟知的概念和理論融入到FPGA軟件設計中。通過大量的研發實踐證明,在這樣的理念指導下,龐大而復雜FPGA軟件設計過程更明晰化、條理化了,最為突出的是在不經意間實現了高效、優化的軟件設計。
以下將從分析FPGA芯片的內部構造入手,對這一結合了“仿生”理念的FPGA軟件設計方法進行進一步闡述。
如果要用更為生動的語言來描述FPGA芯片,我們可以這樣理解:倘若把一片設計完成并具備了某些特定功能的FPGA比作是一臺專用機器設備的話,那么未被編程的FPGA芯片可以認為是一個龐大的“零件箱”,其中存放著一堆堆細如沙石的、構成數字電路所必需的最基本單元,它們包括:邏輯門、存儲塊、乘加器、專用運算核等“零件”。這些基本部件在沒有被編程配置前是相互獨立存在且沒有任何連接關系的。
為了讓一片FPGA真正動起來并完成所需要的各種功能,一件必不可少的工作便是從該“零件箱”中選擇各種所需要的零件進行復雜的組裝連接,并最終構造出一組或多組任務不同、相對獨立、能在各種信號互傳下協同工作的功能模塊集合,這種根據某型號FPGA芯片內所提供的資源將各種“零件”組裝成“機器”的設計過程便是FPGA軟件設計,而將這一構造方案裝入FPGA內搭建并付諸實施的過程便是FPGA軟件的加載過程。
作為比較,我們先來看看通用計算機內的中央處理器(CPU),其實,該芯片是一顆內部電路結構已經固化下來的專用集成電路,為了完成不同的處理功能,它并不是像FPGA那樣靠在芯片內組合搭建不同的電路結構來滿足需求,而是靠逐條解析事先編排好的工作指令并做出不同的動作響應來滿足不同的功能要求。于是,計算機系統的工作流程被設計為:在一定頻率的連續時鐘驅動下從指令存儲器中順序取出一條指令,而后執行這條指令,之后再取指令-執行指令…,如此周而復始地工作下去。顯而易見,這樣的工作模式并不能對同時發生的事件進行并行實時處理,而只能按部就班地順序執行指令,并以串行方式對事件進行處理。所謂“一心不可二用”便從根源揭示了CPU的工作特點。
而FPGA正是因為將其硬件架構完全開放給了設計者,因此研發人員便完全有可能將其構造成n個“心”。可以形象地理解為:計算機軟件是在設計一個人處理事務的工作流程,而FPGA軟件則是在構造一個大到“團隊”甚至是“公司”級的工作體系,小到設計每一名員工的工作流程。
FPGA軟件設計的本質就在于完成對FPGA內部電路構造的個性化描述。一般而言,描述電路構造的方式可分為原理圖輸入方式和語言描述方式(Verilog、VHDL)這兩大類。原理圖輸入是最為直接的電路描述方式,它是以“選擇元件庫”→“調入元器件”→“器件引腳連線”這一系列畫圖過程來構造電路結構的。由于這種方式受到器件種類的影響,因此很難完成更為復雜的電路描述任務。而類似計算機程序(如C語言)設計的硬件描述語言設計則是以事件的邏輯行為描述為主線而展開的電路描述過程,可以說它是一種與人類的認知邏輯和思維活動更為貼近的描述手段。
準確來講,Verilog和VHDL語言是為了描述FPGA內部邏輯電路架構而產生的,它們既不是指令集合,也不具備前后的順序性,所描述的每一段代碼通常都對應著某一個電路結構。因此需要FPGA軟件設計者對電路組成有較深的認識。
通常情況下,FPGA軟件設計人員會本著自頂而下、由粗而細的思路展開設計。大致的步驟可歸納如下圖1所示。

圖1 FPGA軟件基本開發流程
“FPGA器件選型及引腳定義”完全是依據目標FPGA芯片型號及其所處電路板中的連線狀態而定的。由于FPGA 芯片的大部分引腳功能是開放給設計者自由設定的,因此“定義”過程便是為了明確FPGA芯片各引腳在目標電路板中的名稱及功能屬性,并確保FPGA軟件設計(芯片內部電路的可編程描述)與FPGA相關硬件設計(FPGA所處電路板的設計)的輸入及輸出接口的一致性。換言之,就是在明確該芯片與外界進行信息傳遞的途徑。
“軟件架構設計及功能模塊的劃分”本質來說就是依據需要完成的具體功能明確主要的功能體及其所屬層次化功能體的劃分。這顯然是FPGA軟件設計的關鍵所在。困擾設計者的常常是:到底該劃分出幾個、什么樣的子功能體來協同工作呢?這其實牽扯到了一個不同功能體間的分工與合作問題,由于VHDL語言(或Verilog語言)中的功能模塊通常是在各自獨立的時鐘驅動下獨立并行工作的,因此“分工”(劃分出的功能模塊)越多,其整體的并行處理能力會越強,但隨之而來的便是“合作”(用于統一各功能模塊協調工作)的資源占用也就越多,協調控制邏輯也就越復雜。
“各層功能模塊的描述”也就是真正的FPGA軟件代碼或電路圖形化設計過程,其宗旨是完成FPGA內部電路構成的描述。應該說,在整個開發過程中花費時間最多的通常會是這一階段。設計者在對既定的功能模塊進行再次分解及語言、圖形描述過程中常會出現邏輯關系的描述錯綜復雜且毫無條理、將無關聯性的功能歸入同一功能模塊、某些功能模塊異常臃腫繁瑣、某些模塊間的信號傳遞雜亂無章、信號事件結果被多個過程體同時驅動、邏輯判斷層次過多、邏輯判斷出口說明不全、對某些長線任務不做過程保護等等。這些常見的錯誤和不合理設計可以歸咎于設計經驗的不足,但有沒有一種好的方法讓設計者不是從屢屢的糾錯中得到提升而是在之前就能迅速掌握要領呢?
“邏輯功能仿真”由于沒有將信號在FPGA芯片內流動的準確延時特性反應到其輸出結果上,因此僅是一種初步的邏輯關系驗證。
“綜合、布局布線”是將高級抽象的電路描述對應轉化為芯片內各種基本單元的連接關系。這一過程通常可由芯片廠家所提供的工具軟件自動完成。
“時序仿真”則是在明確了芯片內的真實電路構成(即完成了布局布線)后,將各信號在FPGA內真實的延時信息反標注到設計網表中以檢測整個設計的處理效果,其驗證結果的真實性很強。需要強調的是邏輯及時序仿真都需要為仿真工作設計一組覆蓋面廣、真實性高的激勵波形信號,用以激發信號響應。就如同給驗鈔機放入幾張驗鈔幣以檢驗其效果一樣,驗鈔幣所具備的全面性特征是驗鈔機測試的關鍵。
“配置下載”是指將編譯生成的標明FPGA內部基本單元連接關系的位數據流文件傳遞給FPGA以實現其內部的電路重構。可借助配置工具軟件自動完成。
我們已經知道,FPGA開放給我們的是最基本的“零件”,我們完全有可以通過不同的設計組合構造出我們所需要的若干“工具”、“設備”、“機器”甚至是由若干“機器人”組成的“工作團隊”和“機器人社會”。這些名詞其實在我們每一個人的頭腦中并不陌生,只是我們很少或不愿將其與電路及芯片建立聯系。其實,不論從FPGA的內部構成、工作原理還是軟件描述形式都與生命個體、團體、社會的存在及溝通方式極為相似,我們完全有理由在我們的頭腦中建立起一座“仿生”橋梁。如果我們將FPGA內部的各種電路結構看做是一個個“生命體”的話,那么很多軟件設計中遇到的難題和困惑都能輕松地得到解釋。
先拿FPGA軟件設計中的功能模塊劃分來說,這就好比是一個項目需要事先明確到底該由幾類人來承擔,每類人的人員數及他們的從屬關系又是怎樣等等。我們在做項目人員劃分時所秉承一些原則,如:同類人員分為一組、組間協同工作所需的信息傳遞量要最小化、不讓單個個體承擔過多的任務而影響整體效率、在項目人員數量及人力成本與溝通成本之間尋找平衡點等等,這些劃分原則同樣是適用于FPGA軟件模塊劃分的。
另外,許多FPGA軟件設計者常會編制出不同功能體對同一信號進行驅動的代碼,這在FPGA軟件中會被嚴格禁止。因為FPGA代碼對應的是其內部的電路,電路中的信號連線具有獨占性。一個信號又怎么能同時被兩個事件來控制呢?就像是一個開關不能同時被兩個人操控一樣,一人想開,一人想關,開關將做何響應呢?
再有,許多FPGA軟件設計者總是習慣于書寫套裝了超過4層以上的“IF…ELSIF…”語句,這在需要高速時鐘處理的FPGA中是非常避諱的。每個后級判斷一定要等到上級判斷不成立后才會進行,這就會給后級判斷帶來延時,而過長的延時很有可能會造成整個邏輯判斷的混亂甚至是崩潰。這就好比讓一個人通過多層篩選去決定所要做的事,如果要做的是最后一件事,那么待到判斷出要做什么事時,“黃花菜都已經涼了”。而最快的選擇方式顯然應該是在同一個判斷層面上依據某個特征去匹配對應要做的事,也就是“CASE…WHEN…” 語句。
還有,許多設計者在編寫通訊程序時不考慮雙方確認的邏輯,試想,如果我們在通電話時僅是一方說話,另一方不做確認應答,那說話方會再繼續說下去嗎?正常的通話方式難道不是一方說完一斷內容后,另一方說聲“是”或“好的”嗎?
其實,許多FPGA軟件設計中常見問題的根源并不是很復雜,只是我們不習慣于將其對應到另一種對象上去思考而已。
從以上對比分析可以看出,FPGA是靠內部硬件資源的可重構來滿足各種功能需求的,也就是說,構造完成的每一部分硬件電路都在行使著各自不同的功能。如果我們將紛繁復雜的片內硬件電路按功能塊劃分,將各功能相對獨立、內部連線緊密、外部連線疏松的電路功能模塊看做是一個有生命的群體,它們都在各自的時鐘驅動下獨立工作著,而它們的輸入、輸出信號連線則是它感受外部信息并對其做出反應的通道,其內部的信號是受前級驅動的狀態信息節點,包含在其中的、由時鐘驅動的各進程都做為若干“子功能體”來對待,那么整個FPGA內部便呈現為了一個小型的社會。各功能群體是分級存在的,下級從屬于上級,同級功能體間通過信號或存儲器互通數據信息。如此看來,FPGA軟件架構便于現實生活中的組織架構建立了聯系,貌似復雜的FPGA軟件便靈動了起來。
基于這樣的思想構造的FPGA軟件框架見圖2所示。
其實,這樣的樹型軟件架構與企業的職能型人員組織結構十分相似。功能體即是一個能完成特定功能的處理器團隊,父功能體內可根據處理任務的性質擁有多個子功能體,各子功能體可在所屬的父功能體內與其他同級的子功能體實現自由信息交換(通過信號或存儲器),跨級的信息交換必須通過其所屬的父功能體進行傳遞。

圖2 分級型FPGA軟件框架
FPGA的工作方式決定了其樹形軟件架構的合理性。只要程序加載完成,每一個功能體便會有真真切切的片內硬件電路與之對應,它們都會在統一的時鐘下并行工作著,這與多人組成的工作團隊有著極其相似的共性。將人員的組織結構融入到整個軟件設計過程中后,軟件人員能更清晰地理解和掌握各級功能模塊的劃分和實現步驟,所編制的軟件的結構和信號流向會更加明晰,復雜的處理過程則更容易被分解,軟件更加模塊化、直觀化、人性化,可讀性更會隨之增強,軟件團隊各成員間的交流也會更加順暢。最為重要、也是最有意義的是:可通過借鑒我們所熟知的組織架構及人員溝通方式輕松地構造出強直觀性、高穩定性和實時性的軟件架構。
FPGA芯片的特殊結構及開發模式有著與構建一支團隊去完成項目十分類似的設計過程。如果我們能經常性地將經過歲月洗禮后沉淀下來的優秀的團隊構建模式及運行模式與復雜的FPGA軟件研發設計對應起來,相信許多設計靈感將會油然而生。
技術研發過程本身就是一種匯聚所有的先進思想和靈感進行融合創作的過程。“仿生”則是一種獲得優秀設計思路的捷徑。該篇文章只是一個引子,技術人員如果善于從身邊的事物中找尋靈感,將設計思維擴展到不同的維度上去思考問題,很可能會有意想不到的收獲。
參考文獻
[1]吳繼海,蔡海寧,王誠.Altera FPGA/CPLD設計(高級篇)[M].人民郵電出版社.
何啟躍(1959—),男,安徽四創電子股份有限公司高級工程師,研究方向:無線電通信。
徐謹(1970—),男,安徽四創電子股份有限公司高級工程師,研究方向:雷達數字處理系統軟硬件設計。
作者簡介: