MultiBoot 是 FPGA 遠程更新配置文件時一種非常普遍的應用--為了確保安全,我們通常需要安排一個 Golden Image,升級失敗后 FPGA 能回跳 (Fallback) 到此配置,從而使 FPGA 始終處于可被檢測的工作狀態。
很多客戶有同樣的問題:我在升級 Update Image 一半時突然掉電了,為什么回跳機制不起作用了呢?FPGA 怎么掛死了呢?其實這個現象是"符合預期"的,回跳機制不能應付這種異常。如果配置文件寫到一半突然中斷,嵌在配置數據流里面的指令序列同樣也沒有了,并且有可能中斷在任意位置。FPGA 的控制邏輯此時就失去了工作方向,不知道下一步該做什么。
Xapp1247, Appendix A提供了一個很好的解決方案。利用兩個 timer 或者稱之為 barrier 的小image,嵌在 Golden 和 Update 之間或附在 Update 之后,通過合理的給兩個 timer 賦值,可以解決 Update Image 刷新時同步字丟失或者半程掉電的情況。
但是同時又有客戶提出了問題:我的應用對回跳時間要求很高,Xapp1247,Appendix A的方案對于半程掉電的場景,只有搜索完整個 Update Image 區域,看到 Timer#2 的設置才能完成回跳。有沒有辦法縮短這段時間呢?
MultiBoot 的跳轉實際上是非常靈活的,我們這里就嘗試提供一種思路:
1. 去掉 Timer#2,只保留 Timer#1 作為 Golden 和 Update Image 之間的 barrier Image。
2. Update Image采取從后往前倒著燒錄的辦法。(在實際應用中,燒寫 flash 都是用CPU/MCU/FPGA 控制或者第三方編程器實現的,所以這一點也很容易實現)。
3. 精確設定 Timer#1的值,使其看到Update中的TIMER指令及賦值但不需更多。
Timer 寄存器的值只有在 Power-Cycle 或者 PROG_B 過程中才能被清除,或者被新的 Timer值覆蓋,或者在整個配置數據加載完畢后自動失效。
我們通過精確設定 Timer#1的值,使 FPGA 控制邏輯有足夠時間看到 Update Image 中新的Timer 值。TIMER 指令位于 Image 的頭部。因為 Update Image 是倒著寫入的,能看到新的Timer 值,說明 Update Image 基本已經更新好了。由于新的 timer 值是足夠控制邏輯加載完整的配置數據的,Timer 寄存器被新值更新后,Timer#1 相當于失效了。FPGA 有充足時間可以順利讀入完整配置數據,開啟正常工作。
如果由于斷電等原因,Update 更新到一半就停止了,此時會缺失 Update 的同步字,TIMER指令等等位于頭部的信息。Timer#1 在一個有限的時間內搜索 Update Timer 但是沒有看到,timeout 之后就會直接觸發回跳。因此不用等待搜索整個 Update 存儲空間完畢,依靠尾部的Timer#2 才能觸發回跳了。
整個解決方案的重點就在于設定 Timer#1 的值。
這個其實很簡單,根據你自己生成的 Timer#1和Update的MCS文件 (方法參考Xapp1247),計算一下 Timer#1 的指令到 Update 的 TIMER 之間的字節數即可。
以 KU040 的 bit 為例,觀察 Update Image 頭部的命令/數據序列,可以看到有 3002 2001,這就是設置 Timer 寄存器的命令TIMER。我們想Timer#1的時間足夠看到 Update 中的3002 2001命令以及賦值,其他不需要了,隨意添加幾個 cycle 或者幾個字的裕量即可。
比如我們設到3000 8001,多3個字的余量。
Timer的格式如下:
Barrier/Timer#1 里從 TIMER 及賦值開始,后面有兩個 NOOP 字,加上后續 Update 里從FFFFFFFF 開始直到 3000 8001 有28個字,一共30個字,那么就是30*32=960 bit。SPIx1 串行配置中,一個 CCLK 讀取一個 bit,所以
Timer#1 的值設置為 h‘3C0.
如上圖,30 03 E0 01是把 bus width 從默認的 x1 切到 x4 的命令。如果在讀入 Timer#1 之前中執行了該命令(比如 Golden 里面),那么 Timer#1 的值需要按照一個 CCLK cycle,讀取4個 bit 來計算。和 Timer 命令類似,在 FPGA 控制邏輯讀取數據的過程中,如果沒有碰到新的30 03 E0 01設定新的數據寬度,那么將一直按照之前設定的 bus width 來讀入數據或者指令。
假設 Timer#1 以及 Update 都是以x4讀取的,那么 Timer#1 需設為 h’F0.
綜上,通過合理設定 barrier#1 中的 Timer#1 數值,我們可以極大地縮短升級掉電這種MultiBoot 失效場景的回跳時間。
審核編輯:湯梓紅
-
FPGA
+關注
關注
1626文章
21671瀏覽量
601922 -
amd
+關注
關注
25文章
5444瀏覽量
133950 -
寄存器
+關注
關注
31文章
5322瀏覽量
120022
原文標題:開發者分享|縮短MultiBoot流程中的回跳 (Fallback) 時間
文章出處:【微信號:gh_2d1c7e2d540e,微信公眾號:XILINX開發者社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論