當(dāng)前位置:首頁 > > OpenFPGA

上一篇中介紹了FPGA的啟動步驟,如圖0 所示,今天這篇文章就要在上一篇文章基礎(chǔ)上進(jìn)行分支細(xì)化,首先我們先了解FPGA 啟動加載的幾種方式。同時對于我們設(shè)計中常見的幾個問題將在文章最后詳細(xì)討論,比如HEX、BIN、MCS區(qū)別,在生成MCS時候Bit Swap什么作用,Bitstream 壓縮到底在壓縮什么等問題進(jìn)行詳細(xì)探討。

圖0:7系列FPGA啟動步驟-參考:UG470

配置文件框架

在圖0中上一篇沒有細(xì)致討論的配置文件載入,我們這篇文章詳細(xì)討論下,因為后續(xù)我們會使用這其中的一兩個寄存器,我們就先看下配置文件架構(gòu)。

7 系列 FPGA 配置文件以幀的形式排列。幀是 7 系列 FPGA 配置內(nèi)存空間中最小的可尋址段,因此所有操作都必須作用于整個配置幀。每幀由 101 個 32 位組成。根據(jù)比特流選項,配置比特流中存在額外開銷。確切的比特流長度可在 rawbits 文件 (RBT) 中找到。比特流長度(字)大致等于配置數(shù)組大小(字)加上配置開銷(字)。比特流長度(位)大致等于比特流長度(字)乘以 32。

配置包

所有 7 系列 FPGA 比特流命令都是通過讀取或?qū)懭肱渲眉拇嫫鱽韴?zhí)行的。

數(shù)據(jù)包類型

FPGA 比特流由兩種數(shù)據(jù)包類型組成: Type 1 和 Type 2。

Type 1數(shù)據(jù)包

Type 1 數(shù)據(jù)包用于寄存器讀寫。7 系列 FPGA 中僅使用 14 個寄存器中的 5 個。報頭部分是 32 位字。

Type 1數(shù)據(jù)報頭之后是Type 1數(shù)據(jù)部分。

圖1:Type 1 數(shù)據(jù)包頭格式-參考:UG470

上圖中的OPCODE類型如圖2所示。

圖2:OPCODE格式-參考:UG470

Type 2數(shù)據(jù)包

Type 2 數(shù)據(jù)包必須跟在Type 1 數(shù)據(jù)包后面,用于寫入長塊。因為它使用Type 1 數(shù)據(jù)包地址,所以這里沒有顯示地址。報頭部分同樣是 32 位字。

Type 2 數(shù)據(jù)包頭之后是Type 2 數(shù)據(jù)部分。

圖3:Type 2 數(shù)據(jù)包頭格式-參考:UG470

上圖中的OPCODE類型如圖4所示。

圖4:OPCODE格式-參考:UG470

CRC Register(00000)

CRC寄存器,寫入此寄存器用于對比特流數(shù)據(jù)執(zhí)行 CRC 校驗。如果寫入的值與當(dāng)前計算的 CRC 匹配,則清除 CRC_ERROR 標(biāo)志并允許啟動。

Frame Address Register(00001)

幀地址寄存器,7 系列FPGA分為兩半,頂部和底部。7 系列FPGA中的所有幀都具有固定的相同長度,即 3,232 位(101 個 32 位字)。

幀地址寄存器 (FAR) 分為五個字段:塊類型、頂部/底部位、行地址、列地址和次要地址。地址可以直接寫入,也可以在每幀結(jié)束時自動遞增。典型的比特流從地址 0 開始,并自動遞增到最終值。

Command Register(00100)

命令寄存器 (CMD) 用于指示配置控制邏輯選通全局信號并執(zhí)行其他配置功能。每次將新值加載到 FAR 寄存器時,都會執(zhí)行 CMD 寄存器中的命令。

MFWR Register (01010)

該寄存器由比特流壓縮選項使用。

IDCODE Register(01100)

IDCODE 寄存器,讀取該寄存器可返回設(shè)備 IDCODE。提供的 IDCODE 必須與設(shè)備的 IDCODE 匹配。

Warm Boot Start Address Register (10000)

熱啟動起始地址寄存器 (WBSTAR) 指定應(yīng)用 IPROG 命令時要使用的 MultiBoot 地址信息。圖5中描述了相關(guān)寄存器。

圖5:WBSTAR寄存器描述-參考:UG470

Watchdog Timer Register (10001)

看門狗定時器在回退比特流時自動禁用。圖6中描述了相關(guān)寄存器。

圖6:WTR寄存器描述-參考:UG470

Boot History Status Register (10110)

啟動歷史狀態(tài)寄存器 (BOOTSTS)是用來指示啟動過程中錯誤的類型,圖7中描述了相關(guān)寄存器。

圖7:BOOTSTS寄存器描述-參考:UG470

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

圖8:通過JTAG讀取BOOTSTS寄存器描述

FPGA 啟動加載方式

對于7系列FPGA來說有多種方式啟動,包括正常上電自啟動,Program_B復(fù)位加載等方式,下面詳細(xì)介紹幾種啟動方式。

上電自動加載

這個方式就不多說了,F(xiàn)PGA按照上電時序正常上電后,由FPGA主動從外部存儲器讀取位流,此時CCLK為輸出;或者由其它主控制器通過SELETMAP將位流寫入到FPGA中,此時CCLK為輸入,從而完成上電自動加載。

Program_B復(fù)位加載

7 系列FPGA提供了一種通過外部引腳來重新配置FPGA的方式,這個引腳就是Program_B,通過拉低Program_B管腳重新配置FPGA,后續(xù)等INIT_B釋放拉高后,就和上面步驟一樣了。7系列FPGA通過Program_B復(fù)位加載時序如圖9所示。

圖9:Program_B復(fù)位加載時序圖 - 來源:UG470

Boot加載

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

圖10:Boot加載操作

IPROG指令加載

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

IPROG指令可以通過ICAPE2原語和嵌入到位流中實現(xiàn)相關(guān)操作。

ICAPE2原語操作

ICAP目前為止有三個版本,包括ICAP,ICAPE2以及ICAPE3。UltraScale系列對應(yīng)ICAPE3,7系列對應(yīng)ICAPE2,7系列之前的對應(yīng)ICAP。

ICAPE2原語通過更改WBSTAR寄存器來實現(xiàn)多重加載。ICAPE2原語發(fā)出的指令序列如下圖所示,箭頭所示就是IPROG指令

圖11:ICAPE2原語發(fā)出的指令序列

首先寫入同步頭 32’hAA995566, 然后將需要跳轉(zhuǎn)到的bit文件的起始地址寫入WBSTAR寄存器,最后寫入IPROG(internal PROGRAM_B)指令。

(1)對于BPI模式來說,可以通過RS[1:0](外部引腳)來控制具體位流的讀取,也可以通過STAT_ADDR[28:0]地址來控制具體位流的讀取。

(2)對于SPI模式來說,只有STAT_ADDR[23:0]地址來表征FLASH器件的地址,當(dāng)使用32位地址的SPI(容量大于等于256Mb)時,需要將實際存儲的高24地址賦值給STAT_ADDR[23:0]。因此在位流存儲的起始地址早于255時,這就要求位流中的dummy數(shù)目要大于256個,否則就會出現(xiàn)易失部分有效位流讀取,導(dǎo)致加載失敗。為了安全起見,在使用大于等于256Mb的FLASH時,可以適當(dāng)在位流頭前加入Dummy。

詳細(xì)如下圖所示:

圖12:BPI和SPI加載地址控制信號

位流操作

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

圖13:IPROG指令嵌入到位流中操作示意圖

具體的操作和詳細(xì)說明我們后續(xù)再詳解。接下來我們講解幾個后續(xù)要使用的概念。

BIT、RBT、BIN、MCS和HEX區(qū)別

7系列的FPGA配置數(shù)據(jù)文件格式,有五種文件格式,BIT、RBT、BIN、MCS和HEX。對于FPGA開發(fā)工作者來說,使用最多的應(yīng)該是四種格式的文件,BIT、BIN、MCS和HEX。那么這幾個格式有啥區(qū)別呢?

在UG470中給了這幾個格式的區(qū)別,如下圖所示

圖14:BIT、RBT、BIN、MCS和HEX區(qū)別 : 上-來源UG470 下-翻譯

bit文件比較好理解是用來調(diào)試的,通過JTAG進(jìn)行在線燒錄調(diào)試。BIN和MCS用于固化,生成存儲于flash的固化文件。對于HEX,一般用于遠(yuǎn)程更新,比如通過網(wǎng)絡(luò)、PCIe接口方式遠(yuǎn)程升級時候。當(dāng)然上面只是推薦的使用方面,也可以按照自己需求使用,我們接下來說一下這幾個文件的區(qū)別。

mcs文件和bin文件的區(qū)別

這兩個文件都是我們進(jìn)行固化時候常見的文件格式,其中MCS文件時包含BIN文件內(nèi)容的(只是內(nèi)容),MCS文件的每行有地址信息,最后一個byte時CRC校驗信息。所以mcs文件要比bin文件大。

燒錄器燒錄的時候,MCS文件只會燒寫包含bin文件的那部分信息,不會將地址和crc信息燒錄到flash中。

我們在做MultiBoot和FallBack時候只能使用MCS,因為MCS包含了地址信息,燒錄器在燒寫的時候知道golden image放在哪里,multiboot image放在哪里。

bit文件和bin文件的區(qū)別

bin文件不包含頭部信息,bit為bin+頭部信息(工程名稱以及時間等信息)。

所以BIN文件時核心,其他文件是在BIN文件基礎(chǔ)上增加了不同的信息。

圖15:Vivado生成BIN設(shè)置

Bit Swapping什么作用

在生成固化文件時候,有個選項如下圖所示:

圖16:Bit Swapping設(shè)置

那么這個選項的作用是什么?

Bit Swapping是指字節(jié)內(nèi)位的交換。除非使用 PROMGen -spi 選項或 SPI 配置模式的 write_cfgmem -interface spi1|spi2|spi4 選項,否則 MCS PROM 文件格式始終是Bit Swapping。HEX 文件格式是可選的,具體取決于用戶選項。位流文件 (BIT、RBT、BIN) 則不會進(jìn)行Bit Swapping。

對于 Xilinx 配置硬件,每個字節(jié)的 MSB 對應(yīng)于 D0,而不是 D7,但是在處理位流文件時候可能會出現(xiàn)相反的操作,所以這一步是在進(jìn)行糾正后續(xù)的操作。

Vivado中生成 MCS、EXO、TEK 文件或 HEX 文件時,D0 引腳對應(yīng)于每個字節(jié)的 LSB。因此,這些文件被稱為“字節(jié)交換”文件。默認(rèn)情況下,HEX 文件是位交換的,但可以禁用此功能。 當(dāng)禁用此選項時,D0 引腳對應(yīng)于每個字節(jié)的 MSB,并且該文件是“非字節(jié)交換”文件。 BitGen 生成的 BIT 和 RBT 文件是“非交換字節(jié)”文件。 對于所有 FPGA 并行模式(Express、同步/異步外設(shè)、主/從并行、SelectMAP)都是如此。Xilinx 軟件根據(jù)總線排序的一般規(guī)則生成字節(jié)交換文件。 通常,當(dāng)使用“字節(jié)交換”時,MSB(最左邊的位)對應(yīng)于總線的最大數(shù)量(D0) 。 使用處理器或邏輯設(shè)備時必須糾正這些差異。 處理器、FPGA 等生成“字節(jié)交換”的文件,便可以在配置期間把每個字節(jié)的 MSB 對應(yīng)于 D0。如果使用 BIT、RBT 或“非字節(jié)交換”的 HEX 文件進(jìn)行下載時,則處理器的 MSB 必須與 FPGA 的 D0 相對應(yīng)。

圖16:Bit Swapping示意圖 - 來源:UG470

需要注意的是:無論數(shù)據(jù)的方向如何,每個字節(jié)的MSB都將進(jìn)入D0引腳:

  • 在“字節(jié)交換”的版本中,進(jìn)入D0的位是最右邊的位

  • 在“非字節(jié)交換”中,進(jìn)入D0的位是最左邊的位。

FPGA比特流內(nèi)容

7系列FPGA比特流包括三個部分:總線寬度自動檢測、同步字和FPGA配置。

總線寬度自動檢測模式插入在每個比特流的開始。它用于并行配置模式,以自動檢測配置總線寬度。因為它出現(xiàn)在Sync字之前,串行配置模式會忽略它。總線寬度自動檢測對大多數(shù)用戶來說是透明的,因為Xilinx工具生成的所有配置位流(BIT或RBT文件)都包括總線寬度自動探測模式。如果模式引腳設(shè)置為主串行、從串行、JTAG或SPI模式,配置邏輯將忽略這些模式。

圖17:K7 FPGA Bit 示例 - 來源:UG470

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

圖18:實際 Bit 示例 - 來源:知乎@小灰灰的FPGA

Bitstream 壓縮到底在壓縮什么

最后就是BIT壓縮,我們在設(shè)計中都會加入下面腳本:

set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]

這句話大家都知道是吧我們生成的位流文件進(jìn)行壓縮(壓縮比還是很可觀的),那么我們進(jìn)行Bitstream 壓縮到底在壓縮什么?會不會影響我的功能?

壓縮前后會對程序里的功能有影響嗎?

答: 肯定沒得影響. 影響功能的話就沒法用了。

壓縮的原理是什么,壓縮了哪些部分?

答: 使用length encoding算法來減少配置數(shù)據(jù)的大小。

燒寫的時候還需要解壓縮嗎?

答: 下載時FPGA會識別并處理解壓縮的流程

有沒有相關(guān)文檔可以參考?

答: 可以參考UG908

程序固化后不能啟動的排查思路

這個在新板子加工回來后第一次調(diào)試常出現(xiàn)的問題,這個問題一般分為兩個方向:1、硬件問題;2、FPGA設(shè)計問題。

圖19:程序固化后不能啟動的排查思路

總結(jié)

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



本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉