典型的嵌入式系統(tǒng)設(shè)計人員在硬件平臺上進(jìn)行編程,,他們最關(guān)注的一點就是硬件平臺的穩(wěn)定性,。如果硬件沒有設(shè)置好,會帶來重新編寫代碼的麻煩,。但是一個完全設(shè)置好的穩(wěn)定的硬件平臺還是會對其上運行的程序有一系列的限制,。這些限制 - 無論是設(shè)計結(jié)果,還是一個完全的缺陷 - 都會造成在編碼時需要迂回處理甚至重新返工的情況,,給設(shè)計實現(xiàn)帶來麻煩,,并且耗費了大量的時間。
通過將FPGA平臺和一個精心設(shè)計的多核方法結(jié)合在一起,,開發(fā)人員就能以下列這種方式實現(xiàn)高性能分組處理應(yīng)用:軟件工程師能夠?qū)τ嬎闫脚_的結(jié)構(gòu)有所控制,,從而大大縮短編程時間,同時降低延期交付風(fēng)險,。
硬件設(shè)計流程的主要工作就是定義一塊電路板,。像存儲器類型、總線協(xié)議和I/O這樣的基本組件已被預(yù)先定義,。
如果只使用一個固定的處理器,,那它也是預(yù)先定義好的。但是,,單個處理器無法運行需要吉比特性能的算法(例如分組處理算法),,此時就需要多個處理器協(xié)同工作。
構(gòu)建一個處理構(gòu)造塊的最佳方法取決于所運行的軟件。使用FPGA來進(jìn)行處理,,就能使你在對代碼需求有了進(jìn)一步了解后,,再對精確的實現(xiàn)方式做出明確的決策。全新的Tejia FP平臺在Xilinx® VirtexTM - 4 FPGA上提供了一種方法和多核基礎(chǔ)設(shè)施,,使開發(fā)人員在完成代碼編寫后,,對多核架構(gòu)進(jìn)行精確的配置。
當(dāng)軟件工程師設(shè)計硬件時
硬 件和軟件設(shè)計是兩種本質(zhì)上不同的工作,。無論硬件設(shè)計語言多么像一個軟件,,它進(jìn)行的仍然是硬件設(shè)計。硬件語言對結(jié)構(gòu)進(jìn)行定義,,并且設(shè)計流程最終要進(jìn)行結(jié)構(gòu)的 實體化,。但是,軟件工程師正越來越多地使用C編程技術(shù)來設(shè)計系統(tǒng)功能,;現(xiàn)有的工具支持使用軟件或硬件方法來設(shè)計系統(tǒng)功能,。
軟件實現(xiàn)的方法 更偏向于過程導(dǎo)向。它考慮的是“如何去做”而不是“構(gòu)建什么”的問題,,因為從傳統(tǒng)觀點來看,,已經(jīng)不需要再構(gòu)建什么了 - 硬件都已經(jīng)被構(gòu)建好了。在真正基于軟件的設(shè)計方法中,,關(guān)鍵的功能不是被構(gòu)建到一種結(jié)構(gòu)中去,,而是在一個已經(jīng)構(gòu)建好的系統(tǒng)中被結(jié)構(gòu)執(zhí)行的。靈活性是基于軟件 的實現(xiàn)方法的優(yōu)勢:在系統(tǒng)出廠后仍能快捷地對其進(jìn)行改變,。雖然FPGA也能現(xiàn)場編程,,但改變軟件設(shè)計要比構(gòu)建硬件快捷地多。
由于硬件和軟 件設(shè)計存在著差異,,因此硬件和軟件的設(shè)計者所考慮的問題是不同的,。硬件工程師不可能只通過改變編程語言的語法,就能轉(zhuǎn)變成軟件工程師,。反之,,軟件工程師也 不可能因為硬件設(shè)計中需要軟件的參與,就能轉(zhuǎn)變成硬件工程師,。因此,,不能輕率地就讓軟件工程師加入到處理架構(gòu)的設(shè)計中來。
此外,,硬件工程師,、軟件工程師或項目經(jīng)理都不會同意將一個基于硬件方法的設(shè)計交給一位軟件工程師去完成。軟件工程師做出關(guān)于硬件的決定時所使用的方法,,極有可能得到熟悉類似編程語言的另一位軟件工程師的認(rèn)同,。
如圖1所示,,并行流水線是多核分組處理引擎中處理架構(gòu)的關(guān)鍵結(jié)構(gòu)。這一引擎由一個處理器陣列加上可能存在的硬件加速器構(gòu)成,?;卮鹆讼旅孢@些問題,就等于完成了一個設(shè)計流程:
需要多少個處理器,?
應(yīng)該如何安排這些處理器,?
每個處理器需要處理多少代碼和存儲多少本地數(shù)據(jù),?
代碼的哪些部分需要硬件加速
讓我們來逐一回答這些問題,,從而為軟件工程師“組裝”出一套設(shè)計方法。
處理器的數(shù)量和配置
所 需處理器的數(shù)量可以通過對周期預(yù)算和執(zhí)行代碼所需的周期數(shù)進(jìn)行簡單的數(shù)學(xué)計算得出,。當(dāng)你要在規(guī)定的時間內(nèi)完成工作時,,周期預(yù)算就成為一個關(guān)鍵的參數(shù)。例如 進(jìn)行分組處理時,,數(shù)據(jù)位置進(jìn)行劃分,。這樣,就能夠圍繞劃分的情況來進(jìn)行硬件設(shè)計,,而不用根據(jù)硬件來進(jìn)行劃分,。軟件工程師如何進(jìn)行設(shè)計是一個關(guān)鍵問題。 Teja中集成了一組API和一個處理工具,,可以用ANSI C來定義硬件平臺,。此工具可執(zhí)行程序,創(chuàng)建處理平臺的定義,,這些定義能夠被Xilinx嵌入式工具進(jìn)行處理,。API組的內(nèi)容十分豐富,并且能夠在很靠底的 硬件層次上進(jìn)行控制,,但大多數(shù)軟件工程師不希望使用它們,。因此,Teja中還使用參數(shù)化的方式加入了一個“典型的”流水線定義的方法,。要實現(xiàn)上述示例中的 流水線,,只需要在配置頭文件中修改兩個簡單的#define陳述式。
下面的陳述式定義了一個兩級的流水線,,在第一級使用了4個引擎,,在第 二級使用了2個引擎:圖1 - 并行的流水線,每個引擎由一個MicroBlaze處理器,、專用存儲器和可選的減負(fù)器構(gòu)成,。包不停地到來,而你在下一個數(shù)據(jù)包到來之前,,只有那么多周期來 完成你的工作,。如果你的代碼需要更長的時間來執(zhí)行,,那么就需要添加更多的處理器。例如,,如果周期預(yù)算是100個周期,,而代碼執(zhí)行需要520個周期,那么你 就需要6個處理器(520除以100,,然后進(jìn)位到整數(shù)),。你可以對處理器數(shù)量進(jìn)行調(diào)整,但必須滿足預(yù)算的要求,。使用Teja工具時,,可以通過分析來確定周 期數(shù)。
下一個問題是如何安排這些處理器,。處理這一問題最簡單的辦法就是確定你是否需要劃分代碼,,來創(chuàng)建一個流水線。流水線使用較少的硬件 資源,,但會增加等待時間,。如果你需要對代碼進(jìn)行劃分,最好選擇在一個明顯的位置(自然和直觀的位置)進(jìn)行,。而沒有必要計算出周期中點精確的位置,。
圖1 - 并行的流水線,每個引擎由一個MicroBlaze處理器,、專用存儲器和可選的減負(fù)器構(gòu)成,。
假 設(shè)你要用6個處理器構(gòu)成一個兩級流水線。那么你現(xiàn)在就需要計算出每一級所需的處理器的數(shù)量,;先通過分析來確定每個劃分的周期數(shù),,如后再用它去除以周期預(yù) 算,就可以得到每一級所需的處理器的數(shù)量,。,。因此,如果第一個劃分需要380個周期,,則它需要4個處理器,;這樣第二級就需要140個周期,從而需要兩個處 理器,。(兩個劃分所需的周期數(shù)之和實際上不一定正好等于未劃分的程序所需的周期數(shù),,但會非常接近,因此在這里可以近似看作相等,。)因此,,這個兩級的流水線 的第一級需要4個處理器,第二級需要2個處理器,。如果有足夠的邏輯資源,,使用Xilinx MicroBlazeTM軟核,,就能夠?qū)嶓w化任何這樣的流水線。
相比較而言,,在一個固定的流水線結(jié)構(gòu)中,,每一級的處理器數(shù)量都已經(jīng)預(yù)先確 定。因此就只能強制使用一種專門的劃分方法,,實現(xiàn)這一劃分就會需要相當(dāng)長的時間,。相反地,如果每一級使用的處理器數(shù)量不同,,流水線就可以定制,,并且可以是 不規(guī)則的。因此能夠從任何位置進(jìn)行劃分,。這樣,,就能夠圍繞劃分的情況來進(jìn)行硬件設(shè)計,,而不用根據(jù)硬件來進(jìn)行劃分,。
軟件工程師如何進(jìn)行設(shè)計是 一個關(guān)鍵問題。Teja中集成了一組API和一個處理工具,,可以用ANSI C來定義硬件平臺,。此工具可執(zhí)行程序,創(chuàng)建處理平臺的定義,,這些定義能夠被Xilinx嵌入式工具進(jìn)行處理,。API組的內(nèi)容十分豐富,并且能夠在很靠底的 硬件層次上進(jìn)行控制,,但大多數(shù)軟件工程師不希望使用它們,。因此,Teja中還使用參數(shù)化的方式加入了一個“典型的”流水線定義的方法,。要實現(xiàn)上述示例中的 流水線,,只需要在配置頭文件中修改兩個簡單的#define陳述式。
下面的陳述式定義了一個兩級的流水線,,在第一級使用了4個引擎,,在第二級使用了2個引擎:
#define PIPELINE_LENGTH 2
#define PIPELINE_CONFIG {4,2};
由上述陳述式和預(yù)設(shè)的配置程序,TejaCC程序就能構(gòu)建出流水線,。當(dāng)然,,無論由于什么原因使得流水線的配置需要發(fā)生改變時,只要使用與上面相似的方法進(jìn)行編輯即可,。
存儲器
第 三個問題跟所需的存儲器數(shù)量有關(guān),。在一個典型的系統(tǒng)中,所能存儲的代碼和數(shù)據(jù)的數(shù)量是固定的,。如果你的設(shè)計沒有滿足這一要求,,就需要做大量的工作來將多出 的內(nèi)容壓縮到存儲空間中,。但是在使用FPGA時,只要所需存儲器的數(shù)量在芯片所能提供的范圍之內(nèi),,就能夠按照實際需要為每個處理器分配存儲空間,。在更典型 的情況下,所有的存儲空間的大小都相同(由于每個塊的最小容量為2k,,這就限制了進(jìn)行微調(diào)的程度),。
圖2 - 配置并行流水線的流程
代碼編譯時提供所需存儲器的大小,并且可以使用下面的陳述式來編輯配置頭文件,,在這個示例中為代碼和數(shù)據(jù)存儲分配的存儲空間均為8KB:
#define CPE_CODE_MEM_SIZE_KB 8
#define CPE_DATA_MEM_SIZE_KB 8
使用減負(fù)器來加快處理速度
第四個問題和創(chuàng)建硬件加速器有關(guān),。可能有一部分程序會占用太多的周期,。要減少周期就需要更多的處理器,,而使用硬件加速器就能減少處理器的數(shù)量。只要硬件加速器比其所替代的處理器占用更少的門,,就能夠減少整個硬件實現(xiàn)的面積,。
Teja有一項功能就是用來從代碼中直接創(chuàng)建這樣的加速器或減負(fù)器。通過對程序進(jìn)行注釋,,此功能就可創(chuàng)建:
實現(xiàn)代碼的硬件邏輯
通過系統(tǒng)接口在處理器基礎(chǔ)設(shè)施中添加加速器
調(diào)用原型替換程序中最初的代碼
在將減負(fù)器集成于系統(tǒng)之前,,先使用測試臺對其進(jìn)行驗證。
一旦創(chuàng)建了減負(fù)器,,周期數(shù)就會減少,,因此你需要重新安排處理器。但由于重新定義流水線結(jié)構(gòu)的操作十分方便,,因此這是一項很簡單的任務(wù),。
一個簡單直接的方法
將前面所述的步驟組合在一起,就產(chǎn)生了圖2中所示的設(shè)計流程,。你可以先定義減負(fù)器(對于明顯需要減負(fù)器的任務(wù)),,或在配置好流水線之后再定義減負(fù)器(如果現(xiàn)有的代碼使用了太多的處理器)。
軟件工程師所能控制的是一些在他們看來自然和簡單的參數(shù),,這里使用自然的軟件語言(ANSI C)來表達(dá)這些參數(shù),。對硬件進(jìn)行實體化的所有細(xì)節(jié)都由TejaCC程序來處理,它會為Xilinx嵌入式開發(fā)系統(tǒng)(EDK)創(chuàng)建一個項目,。剩下的編譯/綜合/布局/布線和產(chǎn)生比特流以及鏡像代碼的工作全都由EDK來完成,。
在 這種方式下,電路板可以由硬件工程師設(shè)計,,但通過使用FPGA,,硬件工程師能夠?qū)⒆罱K的實現(xiàn)中硬件配置的關(guān)鍵部分,留給軟件設(shè)計者去完成,。這一方法還支持 在設(shè)計即將完成時對電路板進(jìn)行改動(例如,,由于性能原因要對存儲器的類型和容量進(jìn)行改動),。由于Teja工具能創(chuàng)建FPGA的硬件定義,其中包括存儲器控 制器和其他外設(shè),,因此設(shè)計人員可以輕松地調(diào)節(jié)電路板,。最終的結(jié)果是,由于硬件實現(xiàn)可以適應(yīng)軟件的變化,,因此軟件設(shè)計者不再需要花費大量的時間來圍繞一個固 定的硬件設(shè)置編寫程序,。
通過利用靈活的Virtex -4 FPGA和MicroBlaze核,Teja FP環(huán)境和基本結(jié)構(gòu)使得所有這一切都變成了可能,。有了這一強大的工具,,你就能夠?qū)㈤_發(fā)周期縮短幾周甚至幾個月。
Teja還提供了一些高級應(yīng)用程序,,這些應(yīng)用程序能用來啟動一個項目,,并減少所需的工作量。將一個靈活省時的設(shè)計方法和一個事先定義好的應(yīng)用程序結(jié)合起來使用,,網(wǎng)絡(luò)設(shè)備的制造者就能更快地完成他們的設(shè)計,。