FPGA遠(yuǎn)程更新設(shè)計(jì)的需求分析
掃描二維碼
隨時(shí)隨地手機(jī)看文章
FPGA可重配置帶來(lái)了很高的靈活性,所以基于FPGA的設(shè)計(jì)/產(chǎn)品往往也會(huì)有后期更新/升級(jí)的需求。同時(shí),需要更新/升級(jí)的FPGA板卡由于物理?xiàng)l件的限制,可能無(wú)法現(xiàn)場(chǎng)升級(jí)。比如:
1.FPGA板卡部署在異地機(jī)房中,無(wú)法隨時(shí)進(jìn)入機(jī)房進(jìn)行升級(jí)(異地來(lái)回成本及機(jī)房不允許隨便出入的限制)。
2.FPGA板卡部署在相對(duì)復(fù)雜的環(huán)境中,例如無(wú)線通信設(shè)備安放在通信塔臺(tái)上,或者客戶手中的設(shè)備無(wú)法由供應(yīng)商一一回收升級(jí)。
3.FPGA升級(jí)對(duì)系統(tǒng)影響較大,不方便隨時(shí)升級(jí)。比如PCIE設(shè)備受到系統(tǒng)總線的監(jiān)測(cè),隨便的更新可能導(dǎo)致機(jī)器重啟,在一些要求嚴(yán)格的環(huán)境中是不能允許的。
所以就有了對(duì)FPGA進(jìn)行遠(yuǎn)程更新的需求,需要滿足下面幾個(gè)限制條件:
1.可以在滿足一定條件下(類如可用網(wǎng)絡(luò)進(jìn)行遠(yuǎn)程訪問(wèn)),進(jìn)行遠(yuǎn)程的升級(jí)(不一定需要全自動(dòng)化,但全自動(dòng)化更方便);
2.更新過(guò)程中不能對(duì)系統(tǒng)帶來(lái)影響,以防止系統(tǒng)錯(cuò)誤地實(shí)施保護(hù)措施(例如服務(wù)器重啟);
遠(yuǎn)程更新,整體分為兩部分:1)數(shù)據(jù)傳輸;2)更新鏡像;
數(shù)據(jù)傳輸部分可以選擇的方案非常多,比如可以通過(guò)網(wǎng)絡(luò)將數(shù)據(jù)傳遞過(guò)去。通常會(huì)借用以有的通信接口來(lái)實(shí)現(xiàn)。如果FPGA板卡是部署在計(jì)算機(jī)中,那么先將數(shù)據(jù)通過(guò)網(wǎng)絡(luò)傳遞給計(jì)算機(jī),然后再由計(jì)算機(jī)轉(zhuǎn)發(fā)給FPGA進(jìn)行鏡像更新,也是可以的。這其中數(shù)據(jù)傳輸主要由上位機(jī)來(lái)實(shí)現(xiàn)。所以對(duì)數(shù)據(jù)傳輸部分,并沒(méi)有嚴(yán)格的要求。通常FPGA遠(yuǎn)程更新的設(shè)計(jì)重點(diǎn),在如何更新鏡像。
更新鏡像這一概念,會(huì)有兩個(gè)完全不一樣的概念,需要先說(shuō)清楚。
1.更新FPGA的配置
這種方案對(duì)應(yīng)Xilinx的bit文件下載和Intel(Altera)的sof文件下載,更新的是FPGA的配置,立即生效。這種方案存在的問(wèn)題是配置過(guò)程中,F(xiàn)PGA的原有配置會(huì)被清除掉。此時(shí)系統(tǒng)可能做出不正確的反應(yīng)。例如使用FPGA實(shí)現(xiàn)的PCIE設(shè)備可能會(huì)由于重配置導(dǎo)致PCIE功能失效,部分服務(wù)器檢測(cè)到PCIE設(shè)備異常會(huì)觸發(fā)重啟,帶來(lái)影響。
2.更新存儲(chǔ)FPGA配置鏡像的Flash
這個(gè)方法更新的目標(biāo)是存儲(chǔ)FPGA配置的存儲(chǔ)器(通常是Flash)。
更新Flash過(guò)程中,通過(guò)一些措施使FPGA原有設(shè)計(jì)繼續(xù)工作不受影響,完成后并不立即生效,F(xiàn)PGA依然是舊鏡像;更新Flash之后,在合適的時(shí)間觸發(fā)FPGA的重新配置,配置過(guò)程中更新的鏡像數(shù)據(jù)會(huì)送往FPGA進(jìn)行加載;整個(gè)過(guò)程是相對(duì)可控的,所以對(duì)系統(tǒng)的影響較小。
所以,可以看到,遠(yuǎn)程更新方案的需求,總結(jié)為以下三點(diǎn):
1.利用以有的數(shù)據(jù)通道傳輸數(shù)據(jù)
2.將更新數(shù)據(jù)寫入存儲(chǔ)FPGA配置信息的存儲(chǔ)器中
3.更新Flash的過(guò)程中,不要影響FPGA的正常功能
其中第一點(diǎn),由于可選方案非常多,需要根據(jù)系統(tǒng)的需求來(lái)決定,所以本文不做深入討論。下面重點(diǎn)探討后兩點(diǎn)。
FPGA有多種配置/加載方式。粗略可以分為主動(dòng)和被動(dòng)兩種。主動(dòng)加載是指由FPGA控制配置流程,被動(dòng)加載是指FPGA僅僅被動(dòng)接收配置數(shù)據(jù)。
最常見(jiàn)的被動(dòng)配置模式就是JTAG下載bit文件。此模式下,主動(dòng)發(fā)起操作的設(shè)備是計(jì)算機(jī),數(shù)據(jù)通路是JTAG,F(xiàn)PGA會(huì)被動(dòng)接收數(shù)據(jù),根據(jù)需要的操作來(lái)進(jìn)行更新FPGA配置。而上位機(jī)如何獲取配置數(shù)據(jù)就非常靈活了,可能是本地運(yùn)行EDA工具生成的,也可以是網(wǎng)絡(luò)/USB存儲(chǔ)設(shè)備獲取的。
主動(dòng)配置就是FPGA在配置過(guò)程中處于主導(dǎo)地位,主動(dòng)發(fā)起對(duì)Flash的讀寫,獲取配置信息進(jìn)行配置。
下面利用間EDA工具自帶的燒錄Flash的操作為例,分析一下具體的燒錄過(guò)程。
在Vivado中可以使用bin文件和mcs文件燒錄Flash,在Quartus中可以用jic文件更新Flash。通常情況下,完整的過(guò)程是:
1.上位機(jī)主動(dòng)發(fā)起配置,F(xiàn)PGA被動(dòng)接收數(shù)據(jù)進(jìn)行重配置,此時(shí)的配置模式是上文提到的基于JTAG的被動(dòng)配置。此操作的結(jié)果是將FPGA配置為一個(gè)Flash的讀寫器。
2.配置完成后,上位機(jī)開(kāi)始發(fā)送/接收Flash的數(shù)據(jù),數(shù)據(jù)通道為JTAG。FPGA通過(guò)JTAG接收到數(shù)據(jù)之后,根據(jù)需求發(fā)起對(duì)Flash的讀寫操作,將需要更新的數(shù)據(jù)寫入Flash,完成更新。此過(guò)程是更新Flash的過(guò)程,燒錄過(guò)程中Flash只收到FPGA的控制。
3.Flash更新完畢后,在合適的時(shí)候讓FPGA進(jìn)行重新配置(例如重新上下電),F(xiàn)PGA會(huì)開(kāi)始主動(dòng)配置過(guò)程,從Flash中讀取配置數(shù)據(jù)完成加載。
這種燒寫Flash的過(guò)程通常稱為間接編程(間接燒錄)。Xilinx可以在工具的Help文件中找到詳細(xì)的描述。

間接編程是先把FPGA配置成一個(gè)Flash讀寫控制器,然后再通過(guò)這個(gè)讀寫控制讀寫Flash,所以配置過(guò)程可以看到FPGA先被加載成功,然后才會(huì)進(jìn)行后續(xù)的Flash操作。Xilinx中,這個(gè)Flash讀寫控制器是保存在工具安裝路徑中的。ISE中稱呼為cor文件。

Vivado是直接保存了bit文件,并提供了三種模式,區(qū)別在于沒(méi)有用到的Pin是出于上拉、下拉還是高祖狀態(tài)。

Intel(Altera)的這種模式使用的文件后綴是jic,全稱是JTAG Indirect Configuration File。直接翻譯是JTAG間接配置文件,原理和上述Xilinx的描述完全一樣。在Quartus的Programmer界面中,當(dāng)添加了Jic文件之后,可以看到有一個(gè)Factory default SFL image,就是將FPGA配置為Flash控制器的鏡像。

燒錄Flash的時(shí)候可以關(guān)注一下控制臺(tái)打印的消息,可以看到第一步配置成功后才對(duì)Flash進(jìn)行讀寫控制。關(guān)于Xilinx和Interl(Altera)平臺(tái)的具體操作,專欄會(huì)有后續(xù)文章進(jìn)行分析。
根據(jù)配置的不同,也可以分為主動(dòng)更新和被動(dòng)更新兩種。
如果是被動(dòng)更新,那么通常配置過(guò)程會(huì)有一個(gè)主動(dòng)發(fā)起的設(shè)備,常見(jiàn)有MCU。這樣配置過(guò)程相對(duì)容易,數(shù)據(jù)的傳輸、存儲(chǔ)和讀取都交給主設(shè)備操作。整個(gè)更新過(guò)程按要求更新即可,然后再合適的時(shí)間重新加載FPGA即可。FPGA本身幾乎和更新過(guò)程完全隔離,所以也很容易滿足需求。
主動(dòng)更新則相對(duì)麻煩。首先,F(xiàn)lash很可能只于FPGA有數(shù)據(jù)接口,表明Flash的讀寫只能從FPGA來(lái)發(fā)起;其次,由于FPGA需要發(fā)起Flash的更新寫入,所以FPGA如何獲取數(shù)據(jù)也是需要考慮的問(wèn)題??梢詤⒖忌衔?,主動(dòng)配置更新Flash完整過(guò)程的描述,可以看到FPGA需要一個(gè)數(shù)據(jù)通路(JTAG)接收配置數(shù)據(jù),并實(shí)現(xiàn)一個(gè)Flash的讀寫控制器來(lái)讀寫Flash。更新Flash完成之后,下一次配置被觸發(fā)(重新上下電)會(huì)主動(dòng)發(fā)起讀Flash的操作,加載配置數(shù)據(jù)完成配置。
現(xiàn)在,應(yīng)該對(duì)遠(yuǎn)程更新有一些初步了解了。
如果條件允許,使用一個(gè)MCU作為遠(yuǎn)程更新的主控設(shè)備,會(huì)讓方案簡(jiǎn)單不少。而且可以利用軟件做更多的操作(例如數(shù)據(jù)的校驗(yàn))。通常這么選擇的原因是系統(tǒng)中已經(jīng)存在一個(gè)主控的MCU,就同時(shí)承擔(dān)遠(yuǎn)程更新的任務(wù)。
如果FPGA板卡使用的是主動(dòng)配置模式,由于Flash的讀寫只能通過(guò)FPGA來(lái)實(shí)現(xiàn),同時(shí)JTAG直接更新FPGA鏡像可能無(wú)法滿足要求(比如不能每次上下電都需要用JTAG配置一次),那么設(shè)計(jì)一個(gè)主動(dòng)模式的遠(yuǎn)程更新方案就很重要的。此時(shí),即便系統(tǒng)中有MCU或者上位機(jī),但是由于Flash只能被FPGA控制,所以MCU/上位機(jī)更多的是作為數(shù)據(jù)通信來(lái)發(fā)送FPGA配置數(shù)據(jù),而更新Flash的步驟依然需要FPGA來(lái)實(shí)現(xiàn)。
可以看到,如果將更新控制交給MCU,則單獨(dú)下降了不少。配置過(guò)程中對(duì)FPGA的要求也不多,可以說(shuō)大部分工作是外部設(shè)備(MCU)完成,F(xiàn)PGA工作量不多。所以討論的重點(diǎn)在于難度更大、FPGA工作量更多的主動(dòng)更新方案。以此為基礎(chǔ),目前的設(shè)計(jì)需求已經(jīng)變?yōu)椋?
1.利用以有的數(shù)據(jù)通道傳輸數(shù)據(jù)給FPGA;
2.通過(guò)FPGA將更新數(shù)據(jù)寫入Flash中;
3.更新Flash的過(guò)程中,不要影響FPGA的正常功能;
1.利用以有的數(shù)據(jù)通道傳輸數(shù)據(jù)給FPGA;
由于數(shù)據(jù)傳輸?shù)目蛇x方法非常多,而且任何一個(gè)方案都是一個(gè)非常大的話題,這里就不詳細(xì)描述了。推薦的做法是做握手控制,將數(shù)據(jù)逐一寫入Flash即可。設(shè)計(jì)要點(diǎn)在于數(shù)據(jù)傳輸和Flash讀寫的交互握手和跨時(shí)鐘域。
通常數(shù)據(jù)傳輸?shù)乃俾矢哂贔lash讀寫速率,所以使用緩存,一方面存儲(chǔ)空間容易溢出,另一方面更新操作的使用頻率并不高,為了一個(gè)低頻度的應(yīng)用留一個(gè)大容量的存儲(chǔ)空間并不劃算。所以使用交互握手來(lái)處理,相對(duì)較慢的更新速度對(duì)低頻度的Flash更新操作影響并不大,但帶來(lái)的問(wèn)題就是交互過(guò)程中需要考慮跨時(shí)鐘。
2.通過(guò)FPGA將更新數(shù)據(jù)寫入Flash中
3.更新Flash的過(guò)程中,不要影響FPGA的正常功能
這兩點(diǎn)需求都是要求FPGA實(shí)現(xiàn)的,具體方案就是FPGA收到數(shù)據(jù)后開(kāi)始對(duì)Flash的讀寫操作,將數(shù)據(jù)正確寫入到Flash中去。關(guān)于這一點(diǎn),由于和具體的FPGA相關(guān),之后會(huì)有分別針對(duì)Xilinx和Intel(Altera)平臺(tái)的文章進(jìn)行進(jìn)一步分析。
通過(guò)完整的分析,應(yīng)該對(duì)遠(yuǎn)程更新需要做的事情有個(gè)大略的了解。出去數(shù)據(jù)通路會(huì)隨著系統(tǒng)的不同而變化,F(xiàn)PGA端的讀寫控制是必然的需求。專欄后續(xù)文章會(huì)針對(duì)FPGA內(nèi)部的Flash控制器及完整流程做一個(gè)更詳細(xì)的分析。