MultiBoot是FPGA遠程更新配置文件時一種非常普遍的應用 ——為了確保安全,我們通常需要安排一個Golden Image,升級失敗后FPGA能回跳(Fallback)到此配置,從而使FPGA始終處于可被檢測的工作狀態。
很多客戶有同樣的問題:我在升級Update Image一半時突然掉電了,為什么回跳機制不起作用了呢?FPGA怎么掛死了呢?其實這個現象是‘符合預期’的,回跳機制不能應付這種異常。
如果配置文件寫到一半突然中斷,嵌在配置數據流里面的指令序列同樣也沒有了,并且有可能中斷在任意位置。FPGA的控制邏輯此時就失去了工作方向,不知道下一步該做什么。https://docs.xilinx.com/v/u/en-US/xapp1247-multiboot-spi
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.
注意根據自己實際的Image來計算。假設說你的Timer#1和Update之間還有一些其他的Padding,那么這些字節也需要計算進去。
如果使用了SPI x4, x8或BPI并行配置,同樣對應計算一下:
如上圖,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文章
21667瀏覽量
601849 -
寄存器
+關注
關注
31文章
5317瀏覽量
120008 -
編程器
+關注
關注
9文章
393瀏覽量
42274
原文標題:一個思路: 縮短MultiBoot流程中的回跳 (Fallback) 時間
文章出處:【微信號:Hack電子,微信公眾號:Hack電子】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論