MultiBoot 是 FPGA 遠(yuǎn)程更新配置文件時一種非常普遍的應(yīng)用--為了確保安全,我們通常需要安排一個 Golden Image,升級失敗后 FPGA 能回跳 (Fallback) 到此配置,從而使 FPGA 始終處于可被檢測的工作狀態(tài)。
很多客戶有同樣的問題:我在升級 Update Image 一半時突然掉電了,為什么回跳機(jī)制不起作用了呢?FPGA 怎么掛死了呢?其實(shí)這個現(xiàn)象是"符合預(yù)期"的,回跳機(jī)制不能應(yīng)付這種異常。如果配置文件寫到一半突然中斷,嵌在配置數(shù)據(jù)流里面的指令序列同樣也沒有了,并且有可能中斷在任意位置。FPGA 的控制邏輯此時就失去了工作方向,不知道下一步該做什么。
Xapp1247, Appendix A提供了一個很好的解決方案。利用兩個 timer 或者稱之為 barrier 的小image,嵌在 Golden 和 Update 之間或附在 Update 之后,通過合理的給兩個 timer 賦值,可以解決 Update Image 刷新時同步字丟失或者半程掉電的情況。
但是同時又有客戶提出了問題:我的應(yīng)用對回跳時間要求很高,Xapp1247,Appendix A的方案對于半程掉電的場景,只有搜索完整個 Update Image 區(qū)域,看到 Timer#2 的設(shè)置才能完成回跳。有沒有辦法縮短這段時間呢?
MultiBoot 的跳轉(zhuǎn)實(shí)際上是非常靈活的,我們這里就嘗試提供一種思路:
1. 去掉 Timer#2,只保留 Timer#1 作為 Golden 和 Update Image 之間的 barrier Image。
2. Update Image采取從后往前倒著燒錄的辦法。(在實(shí)際應(yīng)用中,燒寫 flash 都是用CPU/MCU/FPGA 控制或者第三方編程器實(shí)現(xiàn)的,所以這一點(diǎn)也很容易實(shí)現(xiàn))。
3. 精確設(shè)定 Timer#1的值,使其看到Update中的TIMER指令及賦值但不需更多。
Timer 寄存器的值只有在 Power-Cycle 或者 PROG_B 過程中才能被清除,或者被新的 Timer值覆蓋,或者在整個配置數(shù)據(jù)加載完畢后自動失效。
我們通過精確設(shè)定 Timer#1的值,使 FPGA 控制邏輯有足夠時間看到 Update Image 中新的Timer 值。TIMER 指令位于 Image 的頭部。因為 Update Image 是倒著寫入的,能看到新的Timer 值,說明 Update Image 基本已經(jīng)更新好了。由于新的 timer 值是足夠控制邏輯加載完整的配置數(shù)據(jù)的,Timer 寄存器被新值更新后,Timer#1 相當(dāng)于失效了。FPGA 有充足時間可以順利讀入完整配置數(shù)據(jù),開啟正常工作。
如果由于斷電等原因,Update 更新到一半就停止了,此時會缺失 Update 的同步字,TIMER指令等等位于頭部的信息。Timer#1 在一個有限的時間內(nèi)搜索 Update Timer 但是沒有看到,timeout 之后就會直接觸發(fā)回跳。因此不用等待搜索整個 Update 存儲空間完畢,依靠尾部的Timer#2 才能觸發(fā)回跳了。
整個解決方案的重點(diǎn)就在于設(shè)定 Timer#1 的值。
這個其實(shí)很簡單,根據(jù)你自己生成的 Timer#1和Update的MCS文件 (方法參考Xapp1247),計算一下 Timer#1 的指令到 Update 的 TIMER 之間的字節(jié)數(shù)即可。
以 KU040 的 bit 為例,觀察 Update Image 頭部的命令/數(shù)據(jù)序列,可以看到有 3002 2001,這就是設(shè)置 Timer 寄存器的命令TIMER。我們想Timer#1的時間足夠看到 Update 中的3002 2001命令以及賦值,其他不需要了,隨意添加幾個 cycle 或者幾個字的裕量即可。

比如我們設(shè)到3000 8001,多3個字的余量。
Timer的格式如下:

Barrier/Timer#1 里從 TIMER 及賦值開始,后面有兩個 NOOP 字,加上后續(xù) Update 里從FFFFFFFF 開始直到 3000 8001 有28個字,一共30個字,那么就是30*32=960 bit。SPIx1 串行配置中,一個 CCLK 讀取一個 bit,所以
Timer#1 的值設(shè)置為 h‘3C0.

如上圖,30 03 E0 01是把 bus width 從默認(rèn)的 x1 切到 x4 的命令。如果在讀入 Timer#1 之前中執(zhí)行了該命令(比如 Golden 里面),那么 Timer#1 的值需要按照一個 CCLK cycle,讀取4個 bit 來計算。和 Timer 命令類似,在 FPGA 控制邏輯讀取數(shù)據(jù)的過程中,如果沒有碰到新的30 03 E0 01設(shè)定新的數(shù)據(jù)寬度,那么將一直按照之前設(shè)定的 bus width 來讀入數(shù)據(jù)或者指令。
假設(shè) Timer#1 以及 Update 都是以x4讀取的,那么 Timer#1 需設(shè)為 h’F0.
綜上,通過合理設(shè)定 barrier#1 中的 Timer#1 數(shù)值,我們可以極大地縮短升級掉電這種MultiBoot 失效場景的回跳時間。
審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1660文章
22412瀏覽量
636309 -
amd
+關(guān)注
關(guān)注
25文章
5684瀏覽量
139968 -
寄存器
+關(guān)注
關(guān)注
31文章
5608瀏覽量
129985
原文標(biāo)題:開發(fā)者分享|縮短MultiBoot流程中的回跳 (Fallback) 時間
文章出處:【微信號:gh_2d1c7e2d540e,微信公眾號:XILINX開發(fā)者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
multiboot什么意思 MultiBoot的功能簡介、流程介紹
有什么辦法可以更快地為Main_multiboot.mcs獲得總的舞會校驗和嗎?
如何創(chuàng)建Golden鏡像和Multiboot鏡像?
μC/OS-II中縮短中斷關(guān)閉時間方法
基于概率時間Petri網(wǎng)的流程推薦方法
屏障定時器流程測試方法以及使用此方法
7 eries FPGAs SPI MultiBoot實(shí)現(xiàn)方式
介紹“基于測量切換的EPS Fallback”5G語音信令流程資料下載
在FPGA中如何通過ICAP原語實(shí)現(xiàn)Multiboot?
深入探究Xilinx Multiboot實(shí)例
5G EPS Fallback語音方案流程總結(jié)
iPhone 16 Pro機(jī)型發(fā)貨時間縮短
一文搞懂軟核的固化、啟動和MultiBoot實(shí)現(xiàn)
【ALINX 教程】FPGA Multiboot 功能實(shí)現(xiàn)——基于 ALINX Artix US+ AXAU25 開發(fā)板
縮短MultiBoot流程中的回跳 (Fallback)時間
評論