FPGA實(shí)現(xiàn)串口升級(jí)及MultiBoot(三)FPGA啟動(dòng)加載方式
掃描二維碼
隨時(shí)隨地手機(jī)看文章
上一篇中介紹了FPGA的啟動(dòng)步驟,如圖0 所示,今天這篇文章就要在上一篇文章基礎(chǔ)上進(jìn)行分支細(xì)化,首先我們先了解FPGA 啟動(dòng)加載的幾種方式。同時(shí)對(duì)于我們?cè)O(shè)計(jì)中常見(jiàn)的幾個(gè)問(wèn)題將在文章最后詳細(xì)討論,比如HEX、BIN、MCS區(qū)別,在生成MCS時(shí)候Bit Swap什么作用,Bitstream 壓縮到底在壓縮什么等問(wèn)題進(jìn)行詳細(xì)探討。

配置文件框架
在圖0中上一篇沒(méi)有細(xì)致討論的配置文件載入,我們這篇文章詳細(xì)討論下,因?yàn)楹罄m(xù)我們會(huì)使用這其中的一兩個(gè)寄存器,我們就先看下配置文件架構(gòu)。
7 系列 FPGA 配置文件以幀的形式排列。幀是 7 系列 FPGA 配置內(nèi)存空間中最小的可尋址段,因此所有操作都必須作用于整個(gè)配置幀。每幀由 101 個(gè) 32 位組成。根據(jù)比特流選項(xiàng),配置比特流中存在額外開(kāi)銷(xiāo)。確切的比特流長(zhǎng)度可在 rawbits 文件 (RBT) 中找到。比特流長(zhǎng)度(字)大致等于配置數(shù)組大?。ㄗ郑┘由吓渲瞄_(kāi)銷(xiāo)(字)。比特流長(zhǎng)度(位)大致等于比特流長(zhǎng)度(字)乘以 32。
配置包
所有 7 系列 FPGA 比特流命令都是通過(guò)讀取或?qū)懭肱渲眉拇嫫鱽?lái)執(zhí)行的。
數(shù)據(jù)包類(lèi)型
FPGA 比特流由兩種數(shù)據(jù)包類(lèi)型組成: Type 1 和 Type 2。
Type 1數(shù)據(jù)包
Type 1 數(shù)據(jù)包用于寄存器讀寫(xiě)。7 系列 FPGA 中僅使用 14 個(gè)寄存器中的 5 個(gè)。報(bào)頭部分是 32 位字。
Type 1數(shù)據(jù)報(bào)頭之后是Type 1數(shù)據(jù)部分。

上圖中的OPCODE類(lèi)型如圖2所示。

Type 2數(shù)據(jù)包
Type 2 數(shù)據(jù)包必須跟在Type 1 數(shù)據(jù)包后面,用于寫(xiě)入長(zhǎng)塊。因?yàn)樗褂肨ype 1 數(shù)據(jù)包地址,所以這里沒(méi)有顯示地址。報(bào)頭部分同樣是 32 位字。
Type 2 數(shù)據(jù)包頭之后是Type 2 數(shù)據(jù)部分。

上圖中的OPCODE類(lèi)型如圖4所示。


CRC Register(00000)
CRC寄存器,寫(xiě)入此寄存器用于對(duì)比特流數(shù)據(jù)執(zhí)行 CRC 校驗(yàn)。如果寫(xiě)入的值與當(dāng)前計(jì)算的 CRC 匹配,則清除 CRC_ERROR 標(biāo)志并允許啟動(dòng)。
Frame Address Register(00001)
幀地址寄存器,7 系列FPGA分為兩半,頂部和底部。7 系列FPGA中的所有幀都具有固定的相同長(zhǎng)度,即 3,232 位(101 個(gè) 32 位字)。
幀地址寄存器 (FAR) 分為五個(gè)字段:塊類(lèi)型、頂部/底部位、行地址、列地址和次要地址。地址可以直接寫(xiě)入,也可以在每幀結(jié)束時(shí)自動(dòng)遞增。典型的比特流從地址 0 開(kāi)始,并自動(dòng)遞增到最終值。
Command Register(00100)
命令寄存器 (CMD) 用于指示配置控制邏輯選通全局信號(hào)并執(zhí)行其他配置功能。每次將新值加載到 FAR 寄存器時(shí),都會(huì)執(zhí)行 CMD 寄存器中的命令。
MFWR Register (01010)
該寄存器由比特流壓縮選項(xiàng)使用。
IDCODE Register(01100)
IDCODE 寄存器,讀取該寄存器可返回設(shè)備 IDCODE。提供的 IDCODE 必須與設(shè)備的 IDCODE 匹配。
Warm Boot Start Address Register (10000)
熱啟動(dòng)起始地址寄存器 (WBSTAR) 指定應(yīng)用 IPROG 命令時(shí)要使用的 MultiBoot 地址信息。圖5中描述了相關(guān)寄存器。


Watchdog Timer Register (10001)
看門(mén)狗定時(shí)器在回退比特流時(shí)自動(dòng)禁用。圖6中描述了相關(guān)寄存器。

Boot History Status Register (10110)
啟動(dòng)歷史狀態(tài)寄存器 (BOOTSTS)是用來(lái)指示啟動(dòng)過(guò)程中錯(cuò)誤的類(lèi)型,圖7中描述了相關(guān)寄存器。


上面的相關(guān)參數(shù)大部分都可以通過(guò)JTAG讀取到,圖8中展示了讀取到的BOOTSTS寄存器。

FPGA 啟動(dòng)加載方式
對(duì)于7系列FPGA來(lái)說(shuō)有多種方式啟動(dòng),包括正常上電自啟動(dòng),Program_B復(fù)位加載等方式,下面詳細(xì)介紹幾種啟動(dòng)方式。
上電自動(dòng)加載
這個(gè)方式就不多說(shuō)了,F(xiàn)PGA按照上電時(shí)序正常上電后,由FPGA主動(dòng)從外部存儲(chǔ)器讀取位流,此時(shí)CCLK為輸出;或者由其它主控制器通過(guò)SELETMAP將位流寫(xiě)入到FPGA中,此時(shí)CCLK為輸入,從而完成上電自動(dòng)加載。
Program_B復(fù)位加載
7 系列FPGA提供了一種通過(guò)外部引腳來(lái)重新配置FPGA的方式,這個(gè)引腳就是Program_B,通過(guò)拉低Program_B管腳重新配置FPGA,后續(xù)等INIT_B釋放拉高后,就和上面步驟一樣了。7系列FPGA通過(guò)Program_B復(fù)位加載時(shí)序如圖9所示。

Boot加載
Program_B復(fù)位加載是通過(guò)外部引腳進(jìn)行重加載過(guò)程,AMD-Xilinx還提供一種指令加載方式就是-Boot加載。Boot加載過(guò)程實(shí)際上是通過(guò)JTAG發(fā)送JProgram指令,實(shí)現(xiàn)FPGA加載功能。JTAG發(fā)出JProgram指令后,等到待INIT_B釋放拉高后,就和上電自動(dòng)加載后續(xù)過(guò)程一樣。其功能和拉低Program_b功能相似,Boot加載操作如圖10所示。

IPROG指令加載
這個(gè)加載過(guò)程就和MultiBoot息息相關(guān)了,IPROG指令的作用跟外部Program_B管腳的作用類(lèi)似,都是對(duì)FPGA芯片進(jìn)行復(fù)位操作,該復(fù)位操作對(duì)FPGA內(nèi)部的應(yīng)用程序進(jìn)行復(fù)位,同時(shí)IPROG指令不能復(fù)位專(zhuān)用重配置邏輯,如WBSTAR寄存器、TIMER寄存器、BSPI寄存器和BOOTSTS寄存器。IPROG指令能夠觸發(fā)FPGA開(kāi)啟初始化流程,同時(shí)拉低INIT和Done信號(hào)。完成復(fù)位操作后,將默認(rèn)的加載地址用熱啟動(dòng)地址寄存器(Warm Boot Start Address,WB-STAR)中的新地址替換。

IPROG指令可以通過(guò)ICAPE2原語(yǔ)和嵌入到位流中實(shí)現(xiàn)相關(guān)操作。
ICAPE2原語(yǔ)操作
ICAP目前為止有三個(gè)版本,包括ICAP,ICAPE2以及ICAPE3。UltraScale系列對(duì)應(yīng)ICAPE3,7系列對(duì)應(yīng)ICAPE2,7系列之前的對(duì)應(yīng)ICAP。
ICAPE2原語(yǔ)通過(guò)更改WBSTAR寄存器來(lái)實(shí)現(xiàn)多重加載。ICAPE2原語(yǔ)發(fā)出的指令序列如下圖所示,箭頭所示就是IPROG指令

首先寫(xiě)入同步頭 32’hAA995566, 然后將需要跳轉(zhuǎn)到的bit文件的起始地址寫(xiě)入WBSTAR寄存器,最后寫(xiě)入IPROG(internal PROGRAM_B)指令。
(1)對(duì)于BPI模式來(lái)說(shuō),可以通過(guò)RS[1:0](外部引腳)來(lái)控制具體位流的讀取,也可以通過(guò)STAT_ADDR[28:0]地址來(lái)控制具體位流的讀取。
(2)對(duì)于SPI模式來(lái)說(shuō),只有STAT_ADDR[23:0]地址來(lái)表征FLASH器件的地址,當(dāng)使用32位地址的SPI(容量大于等于256Mb)時(shí),需要將實(shí)際存儲(chǔ)的高24地址賦值給STAT_ADDR[23:0]。因此在位流存儲(chǔ)的起始地址早于255時(shí),這就要求位流中的dummy數(shù)目要大于256個(gè),否則就會(huì)出現(xiàn)易失部分有效位流讀取,導(dǎo)致加載失敗。為了安全起見(jiàn),在使用大于等于256Mb的FLASH時(shí),可以適當(dāng)在位流頭前加入Dummy。
詳細(xì)如下圖所示:

位流操作
上面ICAPE2原語(yǔ)操作使用過(guò)例化原語(yǔ)指令事項(xiàng)相關(guān)操作,我們同樣可以通過(guò)將IPROG指令嵌入到位流中,這個(gè)時(shí)候WBSTAR寄存器值也同樣嵌入到位流中,也實(shí)現(xiàn)相同的操作,上面的過(guò)程就是通常使用XDC約束來(lái)實(shí)現(xiàn)Multiboot功能的應(yīng)用場(chǎng)景,這種應(yīng)用場(chǎng)景一般都是主加載SPI模式或主加載BPI模式。

具體的操作和詳細(xì)說(shuō)明我們后續(xù)再詳解。接下來(lái)我們講解幾個(gè)后續(xù)要使用的概念。
BIT、RBT、BIN、MCS和HEX區(qū)別
7系列的FPGA配置數(shù)據(jù)文件格式,有五種文件格式,BIT、RBT、BIN、MCS和HEX。對(duì)于FPGA開(kāi)發(fā)工作者來(lái)說(shuō),使用最多的應(yīng)該是四種格式的文件,BIT、BIN、MCS和HEX。那么這幾個(gè)格式有啥區(qū)別呢?
在UG470中給了這幾個(gè)格式的區(qū)別,如下圖所示



bit文件比較好理解是用來(lái)調(diào)試的,通過(guò)JTAG進(jìn)行在線燒錄調(diào)試。BIN和MCS用于固化,生成存儲(chǔ)于flash的固化文件。對(duì)于HEX,一般用于遠(yuǎn)程更新,比如通過(guò)網(wǎng)絡(luò)、PCIe接口方式遠(yuǎn)程升級(jí)時(shí)候。當(dāng)然上面只是推薦的使用方面,也可以按照自己需求使用,我們接下來(lái)說(shuō)一下這幾個(gè)文件的區(qū)別。
mcs文件和bin文件的區(qū)別
這兩個(gè)文件都是我們進(jìn)行固化時(shí)候常見(jiàn)的文件格式,其中MCS文件時(shí)包含BIN文件內(nèi)容的(只是內(nèi)容),MCS文件的每行有地址信息,最后一個(gè)byte時(shí)CRC校驗(yàn)信息。所以mcs文件要比bin文件大。
燒錄器燒錄的時(shí)候,MCS文件只會(huì)燒寫(xiě)包含bin文件的那部分信息,不會(huì)將地址和crc信息燒錄到flash中。
我們?cè)谧鯩ultiBoot和FallBack時(shí)候只能使用MCS,因?yàn)镸CS包含了地址信息,燒錄器在燒寫(xiě)的時(shí)候知道golden image放在哪里,multiboot image放在哪里。
bit文件和bin文件的區(qū)別
bin文件不包含頭部信息,bit為bin+頭部信息(工程名稱(chēng)以及時(shí)間等信息)。
所以BIN文件時(shí)核心,其他文件是在BIN文件基礎(chǔ)上增加了不同的信息。

Bit Swapping什么作用
在生成固化文件時(shí)候,有個(gè)選項(xiàng)如下圖所示:

那么這個(gè)選項(xiàng)的作用是什么?
Bit Swapping是指字節(jié)內(nèi)位的交換。除非使用 PROMGen -spi 選項(xiàng)或 SPI 配置模式的 write_cfgmem -interface spi1|spi2|spi4 選項(xiàng),否則 MCS PROM 文件格式始終是Bit Swapping。HEX 文件格式是可選的,具體取決于用戶選項(xiàng)。位流文件 (BIT、RBT、BIN) 則不會(huì)進(jìn)行Bit Swapping。
對(duì)于 Xilinx 配置硬件,每個(gè)字節(jié)的 MSB 對(duì)應(yīng)于 D0,而不是 D7,但是在處理位流文件時(shí)候可能會(huì)出現(xiàn)相反的操作,所以這一步是在進(jìn)行糾正后續(xù)的操作。
Vivado中生成 MCS、EXO、TEK 文件或 HEX 文件時(shí),D0 引腳對(duì)應(yīng)于每個(gè)字節(jié)的 LSB。因此,這些文件被稱(chēng)為“字節(jié)交換”文件。默認(rèn)情況下,HEX 文件是位交換的,但可以禁用此功能。 當(dāng)禁用此選項(xiàng)時(shí),D0 引腳對(duì)應(yīng)于每個(gè)字節(jié)的 MSB,并且該文件是“非字節(jié)交換”文件。 BitGen 生成的 BIT 和 RBT 文件是“非交換字節(jié)”文件。 對(duì)于所有 FPGA 并行模式(Express、同步/異步外設(shè)、主/從并行、SelectMAP)都是如此。Xilinx 軟件根據(jù)總線排序的一般規(guī)則生成字節(jié)交換文件。 通常,當(dāng)使用“字節(jié)交換”時(shí),MSB(最左邊的位)對(duì)應(yīng)于總線的最大數(shù)量(D0) 。 使用處理器或邏輯設(shè)備時(shí)必須糾正這些差異。 處理器、FPGA 等生成“字節(jié)交換”的文件,便可以在配置期間把每個(gè)字節(jié)的 MSB 對(duì)應(yīng)于 D0。如果使用 BIT、RBT 或“非字節(jié)交換”的 HEX 文件進(jìn)行下載時(shí),則處理器的 MSB 必須與 FPGA 的 D0 相對(duì)應(yīng)。

需要注意的是:無(wú)論數(shù)據(jù)的方向如何,每個(gè)字節(jié)的MSB都將進(jìn)入D0引腳:
-
在“字節(jié)交換”的版本中,進(jìn)入D0的位是最右邊的位
-
在“非字節(jié)交換”中,進(jìn)入D0的位是最左邊的位。
FPGA比特流內(nèi)容
7系列FPGA比特流包括三個(gè)部分:總線寬度自動(dòng)檢測(cè)、同步字和FPGA配置。
總線寬度自動(dòng)檢測(cè)模式插入在每個(gè)比特流的開(kāi)始。它用于并行配置模式,以自動(dòng)檢測(cè)配置總線寬度。因?yàn)樗霈F(xiàn)在Sync字之前,串行配置模式會(huì)忽略它。總線寬度自動(dòng)檢測(cè)對(duì)大多數(shù)用戶來(lái)說(shuō)是透明的,因?yàn)閄ilinx工具生成的所有配置位流(BIT或RBT文件)都包括總線寬度自動(dòng)探測(cè)模式。如果模式引腳設(shè)置為主串行、從串行、JTAG或SPI模式,配置邏輯將忽略這些模式。


下圖為一個(gè)bit文件,圖中陰影部分就與上述中的總線寬度模式以及同步字等一一對(duì)應(yīng),同步字之后才是FPGA設(shè)計(jì)功能的配置內(nèi)容。

Bitstream 壓縮到底在壓縮什么
最后就是BIT壓縮,我們?cè)谠O(shè)計(jì)中都會(huì)加入下面腳本:
set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
這句話大家都知道是吧我們生成的位流文件進(jìn)行壓縮(壓縮比還是很可觀的),那么我們進(jìn)行Bitstream 壓縮到底在壓縮什么?會(huì)不會(huì)影響我的功能?
壓縮前后會(huì)對(duì)程序里的功能有影響嗎?
答: 肯定沒(méi)得影響. 影響功能的話就沒(méi)法用了。
壓縮的原理是什么,壓縮了哪些部分?
答: 使用length encoding算法來(lái)減少配置數(shù)據(jù)的大小。
燒寫(xiě)的時(shí)候還需要解壓縮嗎?
答: 下載時(shí)FPGA會(huì)識(shí)別并處理解壓縮的流程
有沒(méi)有相關(guān)文檔可以參考?
答: 可以參考UG908
程序固化后不能啟動(dòng)的排查思路
這個(gè)在新板子加工回來(lái)后第一次調(diào)試常出現(xiàn)的問(wèn)題,這個(gè)問(wèn)題一般分為兩個(gè)方向:1、硬件問(wèn)題;2、FPGA設(shè)計(jì)問(wèn)題。

總結(jié)
今天文章內(nèi)容比較雜,是一些常見(jiàn)的問(wèn)題和疑惑,內(nèi)容還是以官方文檔UG470為主,受篇幅限制,后面有幾個(gè)問(wèn)題并沒(méi)有挖到底層,這個(gè)后面會(huì)出幾個(gè)專(zhuān)題進(jìn)行詳細(xì)解析。