FPGA實(shí)現(xiàn)串口升級(jí)及MultiBoot(四)MultiBoot簡介
掃描二維碼
隨時(shí)隨地手機(jī)看文章
縮略詞索引:
- K7:Kintex 7
- V7:Vertex 7
- A7:Artix 7
我們?cè)谡I?jí)的過程(只使用一個(gè)位流文件),假如:(1)因?yàn)楦蓴_通信模塊收到了一個(gè)錯(cuò)誤位;(2)或者燒寫進(jìn)FLASH時(shí)突然斷電,導(dǎo)致位流文件不完整;(3)再或者使用軟核升級(jí)應(yīng)用程序時(shí),突然斷電或者接收文件錯(cuò)誤,導(dǎo)致應(yīng)用程序啟動(dòng)不了;(4)再再或者外場(chǎng)人員燒寫了不適配本FPGA的升級(jí)程序。以上這些都是我們升級(jí)時(shí)候常見的問題,以上問題可以總結(jié)為以下幾點(diǎn):
- 位流錯(cuò)誤 -- 對(duì)應(yīng)情況(1)、(2)
- 啟動(dòng)超時(shí) -- 對(duì)應(yīng)情況(3)
- 位流ID不匹配 -- 對(duì)應(yīng)情況(4)
所以我們使用單一的文件進(jìn)行遠(yuǎn)程升級(jí)的時(shí)候,很有可能因?yàn)楦鞣N情況導(dǎo)致FPGA不能啟動(dòng),就需要現(xiàn)場(chǎng)使用JTAG進(jìn)行處理。所以為了避免這些情況的發(fā)生,我們需要兩個(gè)固件,其中一個(gè)在一般情況下不動(dòng),只升級(jí)另一個(gè)程序,兩個(gè)程序在以上情況發(fā)生時(shí),就啟動(dòng)第一個(gè)程序,就可以重新升級(jí)了。
以上這種應(yīng)對(duì)方式對(duì)于AMD-Xilinx FPGA來說,官方也想到了針對(duì)以上情況的解決方式-即MultiBoot。
MultiBoot介紹
其實(shí)這個(gè)理念不難理解,你從實(shí)際使用出發(fā)去理解會(huì)比直接理解要容易多,實(shí)際使用就從上面的各種情況出發(fā),就很容易理解官方為啥使用MultiBoot進(jìn)行問題的規(guī)避和解決。
但是,因?yàn)槊總€(gè)人接受的理念不同,所以我們還是要從正面“突進(jìn)”,去解釋MultiBoot。
MultiBoot 是一個(gè)FPGA實(shí)現(xiàn)的一種解決方案,支持不同位流之間切換以規(guī)避在遠(yuǎn)程更新中出現(xiàn)的問題。
當(dāng)在 MultiBoot 啟動(dòng)配置過程中檢測(cè)到錯(cuò)誤時(shí),F(xiàn)PGA 會(huì)觸發(fā)回退(外國名:Fallback),這樣就可以確保已知好的設(shè)計(jì)可以加載到設(shè)備中。這種解決方案主要是在一個(gè)FLASH中燒寫兩個(gè)位流文件。其中:
- Fallback, 別稱 “golden bitstream”
- MultiBoot, 別稱 “update bitstream”
以上兩個(gè)文件,習(xí)慣叫Golden位流,燒寫在Golden區(qū);MultiBoot位流,燒寫在MultiBoot區(qū)。以上依個(gè)人習(xí)慣自己匹配,對(duì)應(yīng)好相關(guān)的名稱和位置就可以。
MultiBoot原理
Golden位流是從Flash中的0地址開始運(yùn)行;其幀頭會(huì)包括WBSTAR(next_config_addr)寄存器里面指定的下一個(gè)啟動(dòng)地址等信息。FPGA器件上電后會(huì)從0地址開始加載Golden位流后,會(huì)根據(jù)里面的設(shè)定來決定加載Golden位流還是直接跳轉(zhuǎn)到MultiBoot位流存儲(chǔ)地址去執(zhí)行MultiBoot位流;當(dāng)MultiBoot位流加載時(shí)候遇到錯(cuò)誤,F(xiàn)allback電路會(huì)觸發(fā)去重新從0地址去加載Golden 位流。MultiBoot 和 Fallback 流程如圖1所示:
圖1:MultiBoot 和 Fallback 流程 - 參考:XAPP1247Golden位流從FLASH地址 0 開始執(zhí)行后。按照啟動(dòng)流程,一旦遇到 IPROG 命令,就會(huì)跳轉(zhuǎn)到Golden位流中 WBSTAR 寄存器中指定的FLASH地址位置,配置邏輯會(huì)嘗試加載更新比特流。如果配置邏輯由于錯(cuò)誤無法加載更新位流,則會(huì)發(fā)生Fallback,配置邏輯會(huì)將 INIT_B 和 DONE 拉低,清除配置內(nèi)存,并重新從地址0處加載Golden位流重新啟動(dòng)配置過程,在 Fallback 期間,為了防止不斷的重新,F(xiàn)PGA 會(huì)忽略 WBSTAR 和 IPROG 命令,詳細(xì)流程見圖2.
圖2:MultiBoot Fallback 流程和配置步驟 - 參考:XAPP1247MultiBoot 關(guān)鍵技術(shù)
MultiBoot 關(guān)鍵技術(shù)主要主要分為以下幾種:一個(gè)指令、二種位流、三種方式、四樣錯(cuò)誤。針對(duì)以上四句話我們接下來詳細(xì)分析。
一個(gè)指令
這個(gè)指令大家應(yīng)該都知道,在上一篇文章中也詳細(xì)介紹了就是IPROG 指令。這個(gè)就是MultiBoot的核心命令(實(shí)現(xiàn)MultiBoot基本),后續(xù)的內(nèi)容基本離不開這個(gè)指令,上一篇文章中《配置文件框架》介紹了這個(gè)指令的位置及在啟動(dòng)流程中位于第幾步。
二種位流
這里沒有說是二“個(gè)”位流,因?yàn)樵趶?fù)雜架構(gòu)種不止一個(gè)位流,但是按照功能劃分就是位于Golden區(qū)的Golden位流及位于MultiBoot區(qū)的MultiBoot位流。
三種方式
這里指的是 IPROG 指令嵌入位流種的三種方式,分別為:1)通過約束腳本添加;2)通過ICAPE2原語添加;3)通過AXI HWICAP寫入IPROG指令。
這幾種方式后面的文章會(huì)在實(shí)例解析。
四樣錯(cuò)誤
四樣錯(cuò)誤指觸發(fā)FallBack的四種錯(cuò)誤,分別為:
-
- ID Code錯(cuò)誤 - 指配置文件中的器件型號(hào)和當(dāng)前器件不匹配。
-
- CRC錯(cuò)誤 - 指配置數(shù)據(jù)送入FPGA之后會(huì)進(jìn)行校驗(yàn),如果數(shù)據(jù)不一樣則會(huì)提示CRC錯(cuò)誤。
-
- Watchdog超時(shí) - 指在規(guī)定的時(shí)間內(nèi)如果無法配置成功,則觸發(fā)Watchdog超時(shí)
-
- BPI地址越界 - BPI是只針對(duì)BPI模式的,和Watchdog有一點(diǎn)類似,都是在一段時(shí)間內(nèi)如果沒有加載成功,地址會(huì)逐步增加,計(jì)時(shí)器會(huì)逐步增加,超過范圍后就觸發(fā)Fallback。
ID Code錯(cuò)誤指的是ID Code不對(duì),這在器件啟動(dòng)第五步種出現(xiàn)錯(cuò)誤,這種情況大概率是燒寫錯(cuò)誤鏡像了,所以沒什么好解釋的。
當(dāng)存在Multiboot鏡像的時(shí)候,如M鏡像的內(nèi)容出現(xiàn)問題,則會(huì)觸發(fā)CRC校驗(yàn)錯(cuò)誤,這樣可以保證鏡像加載成功之后,數(shù)據(jù)是沒有問題的。但是如果沒有Multiboot鏡像,則CRC校驗(yàn)無法進(jìn)行,或者加載到一半就掛死了。這個(gè)時(shí)候就需要Watchdog來觸發(fā)Fallback。只要一定時(shí)間內(nèi)加載沒有完成,就一定會(huì)觸發(fā)Watchdog超時(shí)。所以CRC是用來保證加載正確的,Watchdog是用來保證一定會(huì)提示加載失敗的。注意,Watchdogd的計(jì)時(shí)設(shè)置,請(qǐng)?jiān)O(shè)置好然后實(shí)際測(cè)試一下,而不要僅僅憑經(jīng)驗(yàn)/文檔來推斷一個(gè)合適的值。當(dāng)發(fā)生了Fallback之后,工程會(huì)反跳回0地址開始加載,從新加載G鏡像。這里,F(xiàn)PGA內(nèi)部的配置寄存器會(huì)做記錄,當(dāng)發(fā)生Fallback之后,會(huì)自動(dòng)忽略IPROG命令,直接加載G鏡像后續(xù)的部分,來保證G鏡像有機(jī)會(huì)被完整的加載。
BPI地址越界就和上面解釋的一樣,沒什么多說的了。
總結(jié)
MultiBoot的實(shí)現(xiàn)總結(jié)起來就:一個(gè)指令、二種位流、三種方式、四樣錯(cuò)誤。接下來就是按照上面的順序?qū)嶋H操作,加深理解。