FPGA實現(xiàn)串口升級及MultiBoot(四)MultiBoot簡介
掃描二維碼
隨時隨地手機看文章
縮略詞索引:
- K7:Kintex 7
- V7:Vertex 7
- A7:Artix 7
我們在正常升級的過程(只使用一個位流文件),假如:(1)因為干擾通信模塊收到了一個錯誤位;(2)或者燒寫進FLASH時突然斷電,導(dǎo)致位流文件不完整;(3)再或者使用軟核升級應(yīng)用程序時,突然斷電或者接收文件錯誤,導(dǎo)致應(yīng)用程序啟動不了;(4)再再或者外場人員燒寫了不適配本FPGA的升級程序。以上這些都是我們升級時候常見的問題,以上問題可以總結(jié)為以下幾點:
- 位流錯誤 -- 對應(yīng)情況(1)、(2)
- 啟動超時 -- 對應(yīng)情況(3)
- 位流ID不匹配 -- 對應(yīng)情況(4)
所以我們使用單一的文件進行遠程升級的時候,很有可能因為各種情況導(dǎo)致FPGA不能啟動,就需要現(xiàn)場使用JTAG進行處理。所以為了避免這些情況的發(fā)生,我們需要兩個固件,其中一個在一般情況下不動,只升級另一個程序,兩個程序在以上情況發(fā)生時,就啟動第一個程序,就可以重新升級了。
以上這種應(yīng)對方式對于AMD-Xilinx FPGA來說,官方也想到了針對以上情況的解決方式-即MultiBoot。
MultiBoot介紹
其實這個理念不難理解,你從實際使用出發(fā)去理解會比直接理解要容易多,實際使用就從上面的各種情況出發(fā),就很容易理解官方為啥使用MultiBoot進行問題的規(guī)避和解決。
但是,因為每個人接受的理念不同,所以我們還是要從正面“突進”,去解釋MultiBoot。
MultiBoot 是一個FPGA實現(xiàn)的一種解決方案,支持不同位流之間切換以規(guī)避在遠程更新中出現(xiàn)的問題。
當在 MultiBoot 啟動配置過程中檢測到錯誤時,F(xiàn)PGA 會觸發(fā)回退(外國名:Fallback),這樣就可以確保已知好的設(shè)計可以加載到設(shè)備中。這種解決方案主要是在一個FLASH中燒寫兩個位流文件。其中:
- Fallback, 別稱 “golden bitstream”
- MultiBoot, 別稱 “update bitstream”
以上兩個文件,習慣叫Golden位流,燒寫在Golden區(qū);MultiBoot位流,燒寫在MultiBoot區(qū)。以上依個人習慣自己匹配,對應(yīng)好相關(guān)的名稱和位置就可以。
MultiBoot原理
Golden位流是從Flash中的0地址開始運行;其幀頭會包括WBSTAR(next_config_addr)寄存器里面指定的下一個啟動地址等信息。FPGA器件上電后會從0地址開始加載Golden位流后,會根據(jù)里面的設(shè)定來決定加載Golden位流還是直接跳轉(zhuǎn)到MultiBoot位流存儲地址去執(zhí)行MultiBoot位流;當MultiBoot位流加載時候遇到錯誤,F(xiàn)allback電路會觸發(fā)去重新從0地址去加載Golden 位流。MultiBoot 和 Fallback 流程如圖1所示:

Golden位流從FLASH地址 0 開始執(zhí)行后。按照啟動流程,一旦遇到 IPROG 命令,就會跳轉(zhuǎn)到Golden位流中 WBSTAR 寄存器中指定的FLASH地址位置,配置邏輯會嘗試加載更新比特流。如果配置邏輯由于錯誤無法加載更新位流,則會發(fā)生Fallback,配置邏輯會將 INIT_B 和 DONE 拉低,清除配置內(nèi)存,并重新從地址0處加載Golden位流重新啟動配置過程,在 Fallback 期間,為了防止不斷的重新,F(xiàn)PGA 會忽略 WBSTAR 和 IPROG 命令,詳細流程見圖2.

MultiBoot 關(guān)鍵技術(shù)
MultiBoot 關(guān)鍵技術(shù)主要主要分為以下幾種:一個指令、二種位流、三種方式、四樣錯誤。針對以上四句話我們接下來詳細分析。
一個指令
這個指令大家應(yīng)該都知道,在上一篇文章中也詳細介紹了就是IPROG 指令。這個就是MultiBoot的核心命令(實現(xiàn)MultiBoot基本),后續(xù)的內(nèi)容基本離不開這個指令,上一篇文章中《配置文件框架》介紹了這個指令的位置及在啟動流程中位于第幾步。
二種位流
這里沒有說是二“個”位流,因為在復(fù)雜架構(gòu)種不止一個位流,但是按照功能劃分就是位于Golden區(qū)的Golden位流及位于MultiBoot區(qū)的MultiBoot位流。
三種方式
這里指的是 IPROG 指令嵌入位流種的三種方式,分別為:1)通過約束腳本添加;2)通過ICAPE2原語添加;3)通過AXI HWICAP寫入IPROG指令。
這幾種方式后面的文章會在實例解析。
四樣錯誤
四樣錯誤指觸發(fā)FallBack的四種錯誤,分別為:
-
- ID Code錯誤 - 指配置文件中的器件型號和當前器件不匹配。
-
- CRC錯誤 - 指配置數(shù)據(jù)送入FPGA之后會進行校驗,如果數(shù)據(jù)不一樣則會提示CRC錯誤。
-
- Watchdog超時 - 指在規(guī)定的時間內(nèi)如果無法配置成功,則觸發(fā)Watchdog超時
-
- BPI地址越界 - BPI是只針對BPI模式的,和Watchdog有一點類似,都是在一段時間內(nèi)如果沒有加載成功,地址會逐步增加,計時器會逐步增加,超過范圍后就觸發(fā)Fallback。
ID Code錯誤指的是ID Code不對,這在器件啟動第五步種出現(xiàn)錯誤,這種情況大概率是燒寫錯誤鏡像了,所以沒什么好解釋的。
當存在Multiboot鏡像的時候,如M鏡像的內(nèi)容出現(xiàn)問題,則會觸發(fā)CRC校驗錯誤,這樣可以保證鏡像加載成功之后,數(shù)據(jù)是沒有問題的。但是如果沒有Multiboot鏡像,則CRC校驗無法進行,或者加載到一半就掛死了。這個時候就需要Watchdog來觸發(fā)Fallback。只要一定時間內(nèi)加載沒有完成,就一定會觸發(fā)Watchdog超時。所以CRC是用來保證加載正確的,Watchdog是用來保證一定會提示加載失敗的。注意,Watchdogd的計時設(shè)置,請設(shè)置好然后實際測試一下,而不要僅僅憑經(jīng)驗/文檔來推斷一個合適的值。當發(fā)生了Fallback之后,工程會反跳回0地址開始加載,從新加載G鏡像。這里,F(xiàn)PGA內(nèi)部的配置寄存器會做記錄,當發(fā)生Fallback之后,會自動忽略IPROG命令,直接加載G鏡像后續(xù)的部分,來保證G鏡像有機會被完整的加載。
BPI地址越界就和上面解釋的一樣,沒什么多說的了。
總結(jié)
MultiBoot的實現(xiàn)總結(jié)起來就:一個指令、二種位流、三種方式、四樣錯誤。接下來就是按照上面的順序?qū)嶋H操作,加深理解。