FPGA遠程更新設計的需求分析

FPGA遠程更新設計的需求分析

來自專欄 FPGA Coding10 人贊了文章

註:本篇是一個需求分析,不涉及具體的FPGA型號和工具的使用。

FPGA可重配置帶來了很高的靈活性,所以基於FPGA的設計/產品往往也會有後期更新/升級的需求。同時,需要更新/升級的FPGA板卡由於物理條件的限制,可能無法現場升級。比如:

1.FPGA板卡部署在異地機房中,無法隨時進入機房進行升級(異地來回成本及機房不允許隨便出入的限制)。

2.FPGA板卡部署在相對複雜的環境中,例如無線通信設備安放在通信塔台上,或者客戶手中的設備無法由供應商一一回收升級。

3.FPGA升級對系統影響較大,不方便隨時升級。比如PCIE設備受到系統匯流排的監測,隨便的更新可能導致機器重啟,在一些要求嚴格的環境中是不能允許的。

所以就有了對FPGA進行遠程更新的需求,需要滿足下面幾個限制條件:

1.可以在滿足一定條件下(類如可用網路進行遠程訪問),進行遠程的升級(不一定需要全自動化,但全自動化更方便);

2.更新過程中不能對系統帶來影響,以防止系統錯誤地實施保護措施(例如伺服器重啟);

遠程更新,整體分為兩部分:1)數據傳輸;2)更新鏡像;

數據傳輸部分可以選擇的方案非常多,比如可以通過網路將數據傳遞過去。通常會借用以有的通信介面來實現。如果FPGA板卡是部署在計算機中,那麼先將數據通過網路傳遞給計算機,然後再由計算機轉發給FPGA進行鏡像更新,也是可以的。這其中數據傳輸主要由上位機來實現。所以對數據傳輸部分,並沒有嚴格的要求。通常FPGA遠程更新的設計重點,在如何更新鏡像。


更新鏡像這一概念,會有兩個完全不一樣的概念,需要先說清楚。

1.更新FPGA的配置

這種方案對應Xilinx的bit文件下載和Intel(Altera)的sof文件下載,更新的是FPGA的配置,立即生效。這種方案存在的問題是配置過程中,FPGA的原有配置會被清除掉。此時系統可能做出不正確的反應。例如使用FPGA實現的PCIE設備可能會由於重配置導致PCIE功能失效,部分伺服器檢測到PCIE設備異常會觸發重啟,帶來影響。

2.更新存儲FPGA配置鏡像的Flash

這個方法更新的目標是存儲FPGA配置的存儲器(通常是Flash)。

更新Flash過程中,通過一些措施使FPGA原有設計繼續工作不受影響,完成後並不立即生效,FPGA依然是舊鏡像;更新Flash之後,在合適的時間觸發FPGA的重新配置,配置過程中更新的鏡像數據會送往FPGA進行載入;整個過程是相對可控的,所以對系統的影響較小。

所以,可以看到,遠程更新方案的需求,總結為以下三點:

1.利用以有的數據通道傳輸數據

2.將更新數據寫入存儲FPGA配置信息的存儲器中

3.更新Flash的過程中,不要影響FPGA的正常功能

其中第一點,由於可選方案非常多,需要根據系統的需求來決定,所以本文不做深入討論。下面重點探討後兩點。


FPGA有多種配置/載入方式。粗略可以分為主動和被動兩種。主動載入是指由FPGA控制配置流程,被動載入是指FPGA僅僅被動接收配置數據。

最常見的被動配置模式就是JTAG下載bit文件。此模式下,主動發起操作的設備是計算機,數據通路是JTAG,FPGA會被動接收數據,根據需要的操作來進行更新FPGA配置。而上位機如何獲取配置數據就非常靈活了,可能是本地運行EDA工具生成的,也可以是網路/USB存儲設備獲取的。

主動配置就是FPGA在配置過程中處於主導地位,主動發起對Flash的讀寫,獲取配置信息進行配置。

下面利用間EDA工具自帶的燒錄Flash的操作為例,分析一下具體的燒錄過程。

在Vivado中可以使用bin文件和mcs文件燒錄Flash,在Quartus中可以用jic文件更新Flash。通常情況下,完整的過程是:

1.上位機主動發起配置,FPGA被動接收數據進行重配置,此時的配置模式是上文提到的基於JTAG的被動配置。此操作的結果是將FPGA配置為一個Flash的讀寫器。

2.配置完成後,上位機開始發送/接收Flash的數據,數據通道為JTAG。FPGA通過JTAG接收到數據之後,根據需求發起對Flash的讀寫操作,將需要更新的數據寫入Flash,完成更新。此過程是更新Flash的過程,燒錄過程中Flash只收到FPGA的控制。

3.Flash更新完畢後,在合適的時候讓FPGA進行重新配置(例如重新上下電),FPGA會開始主動配置過程,從Flash中讀取配置數據完成載入。

這種燒寫Flash的過程通常稱為間接編程(間接燒錄)。Xilinx可以在工具的Help文件中找到詳細的描述。

間接編程是先把FPGA配置成一個Flash讀寫控制器,然後再通過這個讀寫控制讀寫Flash,所以配置過程可以看到FPGA先被載入成功,然後才會進行後續的Flash操作。Xilinx中,這個Flash讀寫控制器是保存在工具安裝路徑中的。ISE中稱呼為cor文件。

Vivado是直接保存了bit文件,並提供了三種模式,區別在於沒有用到的Pin是出於上拉、下拉還是高祖狀態。

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

燒錄Flash的時候可以關注一下控制台列印的消息,可以看到第一步配置成功後才對Flash進行讀寫控制。關於Xilinx和Interl(Altera)平台的具體操作,專欄會有後續文章進行分析。


根據配置的不同,也可以分為主動更新和被動更新兩種。

如果是被動更新,那麼通常配置過程會有一個主動發起的設備,常見有MCU。這樣配置過程相對容易,數據的傳輸、存儲和讀取都交給主設備操作。整個更新過程按要求更新即可,然後再合適的時間重新載入FPGA即可。FPGA本身幾乎和更新過程完全隔離,所以也很容易滿足需求。

主動更新則相對麻煩。首先,Flash很可能只於FPGA有數據介面,表明Flash的讀寫只能從FPGA來發起;其次,由於FPGA需要發起Flash的更新寫入,所以FPGA如何獲取數據也是需要考慮的問題。可以參考上文,主動配置更新Flash完整過程的描述,可以看到FPGA需要一個數據通路(JTAG)接收配置數據,並實現一個Flash的讀寫控制器來讀寫Flash。更新Flash完成之後,下一次配置被觸發(重新上下電)會主動發起讀Flash的操作,載入配置數據完成配置。

現在,應該對遠程更新有一些初步了解了。

如果條件允許,使用一個MCU作為遠程更新的主控設備,會讓方案簡單不少。而且可以利用軟體做更多的操作(例如數據的校驗)。通常這麼選擇的原因是系統中已經存在一個主控的MCU,就同時承擔遠程更新的任務。

如果FPGA板卡使用的是主動配置模式,由於Flash的讀寫只能通過FPGA來實現,同時JTAG直接更新FPGA鏡像可能無法滿足要求(比如不能每次上下電都需要用JTAG配置一次),那麼設計一個主動模式的遠程更新方案就很重要的。此時,即便系統中有MCU或者上位機,但是由於Flash只能被FPGA控制,所以MCU/上位機更多的是作為數據通信來發送FPGA配置數據,而更新Flash的步驟依然需要FPGA來實現。

可以看到,如果將更新控制交給MCU,則單獨下降了不少。配置過程中對FPGA的要求也不多,可以說大部分工作是外部設備(MCU)完成,FPGA工作量不多。所以討論的重點在於難度更大、FPGA工作量更多的主動更新方案。以此為基礎,目前的設計需求已經變為:

1.利用以有的數據通道傳輸數據給FPGA;

2.通過FPGA將更新數據寫入Flash中;

3.更新Flash的過程中,不要影響FPGA的正常功能;

1.利用以有的數據通道傳輸數據給FPGA;

由於數據傳輸的可選方法非常多,而且任何一個方案都是一個非常大的話題,這裡就不詳細描述了。推薦的做法是做握手控制,將數據逐一寫入Flash即可。設計要點在於數據傳輸和Flash讀寫的交互握手和跨時鐘域。

通常數據傳輸的速率高於Flash讀寫速率,所以使用緩存,一方面存儲空間容易溢出,另一方面更新操作的使用頻率並不高,為了一個低頻度的應用留一個大容量的存儲空間並不划算。所以使用交互握手來處理,相對較慢的更新速度對低頻度的Flash更新操作影響並不大,但帶來的問題就是交互過程中需要考慮跨時鐘。

2.通過FPGA將更新數據寫入Flash中

3.更新Flash的過程中,不要影響FPGA的正常功能

這兩點需求都是要求FPGA實現的,具體方案就是FPGA收到數據後開始對Flash的讀寫操作,將數據正確寫入到Flash中去。關於這一點,由於和具體的FPGA相關,之後會有分別針對Xilinx和Intel(Altera)平台的文章進行進一步分析。

通過完整的分析,應該對遠程更新需要做的事情有個大略的了解。出去數據通路會隨著系統的不同而變化,FPGA端的讀寫控制是必然的需求。專欄後續文章會針對FPGA內部的Flash控制器及完整流程做一個更詳細的分析。

更多關於FPGA的分享,可以參考知乎專欄:FPGA Coding

https://zhuanlan.zhihu.com/c_1020974011555176448?

zhuanlan.zhihu.com圖標
推薦閱讀:

TAG:現場可編輯邏輯門陣列FPGA |