和處理大多數(shù)MCU項(xiàng)目時(shí)一樣,我打算從示例代碼開始,然后通過各種示例搭建自己的項(xiàng)目。但是對(duì)于每一個(gè)例子,我發(fā)現(xiàn)越來越不熟悉,并且結(jié)果也越來越混亂。在這里代碼被用來定義對(duì)象和調(diào)用函數(shù),這在MCU里倒是很常見,但是有些定義是在高階函數(shù)里進(jìn)行的,而其他的則是在另一個(gè)地方。像往常一樣,這些函數(shù)被用來執(zhí)行一個(gè)功能或任務(wù),但有一些函數(shù)要依賴于其他函數(shù)而另一些函數(shù)則是獨(dú)立的。正如我試圖對(duì)它們發(fā)表評(píng)論時(shí)所發(fā)現(xiàn)的那樣,那些沒有被直接調(diào)用的代碼仍然是代碼功能的關(guān)鍵。
我很迷糊。
我決定在YouTube上搜索“Intel FPGA Setup Cyclone V”來尋找示例和“Setup&Go”培訓(xùn)。當(dāng)我瀏覽這些內(nèi)容時(shí),我發(fā)現(xiàn)一個(gè)共同的主題(圖1):
看似不連貫的一組命令仍然有效,但似乎并不完整。
缺乏不支持FPGA的外部模塊或組件。
有了這些觀察,我回顧了更多設(shè)計(jì)樣本和代碼,并發(fā)現(xiàn)了英特爾Cyclone V和HPS FPGA架構(gòu)顯著的優(yōu)勢(shì)。
圖1顯示了HDMI命令集,其中包括一系列未被調(diào)用的代碼。它們不是按順序運(yùn)行的,而是并行運(yùn)行的。它們的功能很像回調(diào)函數(shù),在HPS中如果有來自較高級(jí)別控制器的數(shù)據(jù)調(diào)用時(shí),這些回調(diào)函數(shù)就會(huì)被激活。然后編譯器就會(huì)提高向MCU傳遞信息的能力,反之亦然。在這兩者之間需要做的就是協(xié)調(diào)定義和時(shí)間安排。
圖1:HDMI命令集,其中包括一系列未被調(diào)用的代碼。
項(xiàng)目流程如下所示:
1、Linux HPS抓取圖像。
2、Linux將OpenCV處理過程移交給FPGA。
3、Linux調(diào)整圖像。
4、FPGA接收原始圖像信息,并將其編碼為HDMI接口。
這是使用HPS和FPGA的完美示例。FPGA能夠處理大量重復(fù)的運(yùn)算并實(shí)現(xiàn)協(xié)議,而Linux和MCU則處理了程序的動(dòng)態(tài)元素。這讓我看到了FPGA的優(yōu)勢(shì)。
當(dāng)我深入研究僅含有MCU的設(shè)計(jì)時(shí),我發(fā)現(xiàn)了FPGA的其他優(yōu)點(diǎn):它需要很少的元件,而且可以使成本更低,性能更好的MCU獲得非常好的效果。例如,僅含MCU的設(shè)計(jì)將需要更高的A52等條件來進(jìn)行圖像處理,此外還需要一個(gè)GPU來進(jìn)行圖形加速處理和更多的RAM來完成整個(gè)設(shè)計(jì)。設(shè)計(jì)完成后,最終結(jié)果仍然是一個(gè)鎖定的,有限的可升級(jí)模塊。有了FPGA,這些組件便可以被引入同一個(gè)芯片,所以產(chǎn)品級(jí)PCB設(shè)計(jì)更為簡單,因?yàn)樗枰^少的的組件接口,而且由此產(chǎn)生的模塊仍然可以升級(jí)或優(yōu)化。
我頭頂上的燈泡在幾英里外都可能被看到。
將多功能集成到單個(gè)電路上,減少接口數(shù)量,或者根據(jù)線路修改功能等這些都是FPGA的優(yōu)勢(shì),但它的好處遠(yuǎn)不止這些。FPGA改變了我為了高效完成任務(wù)而增加外部組件的方式:不是“按順序執(zhí)行步驟1,步驟2,步驟3”,現(xiàn)在我正在考慮這樣完成任務(wù):“執(zhí)行步驟A,B,C,并且當(dāng)執(zhí)行完B之后,就執(zhí)行D”?,F(xiàn)在,為什么要花時(shí)間來研究MCU到FPGA開發(fā)轉(zhuǎn)換的原因也已變得越來越明晰了。