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