使用ICAP原语实现SPI-Multiboot加载
1 重配置Multiboot的應用需求
當多個應用程序同時在一個硬件平臺上實現時,各個程序的資源使用和數據通路可能會沖突,這增加了控制電路設計的復雜程度,給開發人員增加了工作量和開發難度。通過多重配置,可以將多個應用程序根據需要分時加載到FPGA中,不僅精簡了電路設計,而且使系統更加靈活。FPGA多重配置的特點可以讓特定條件下的用戶選擇片上資源不多的FPGA去實現需要很多資源FPGA才能實現的功能,這大大降低了開發費用,同時提高了FPGA的利用率。
2 ICAP實現Multiboot的原理介紹
FPGA具有多重配置的特性,允許用戶在不掉電重啟的情況下,根據不同時刻的需求,可以從FLASH中貯存的多個比特文件選擇加載其中的一個,實現系統功能的變換。
當FPGA完成上電自動加載初始化的比特流后,可以通過觸發FPGA內部的多重啟動事件使得FPGA從外部配置存儲器(SPI FLASH)指定的地址自動下載一個新的比特流來重新配置。FPGA的多重配置可以通過多種方式來實現。本文采用的是基于ICAP原語的狀態機編碼方式。通過調用Xilinx自帶的ICAP原語,編寫狀態機按照一定的指令流程對ICAP原語進行不斷的配置,可以控制FPGA重新配置。
2.1 IPROG指令序列
在調用了ICAP原語接口之后,通過Verilog/VHDL編碼的方式實現狀態機。通過狀態機發送IPROG指令給ICAP原語,ICAP原語在接收到這些指令后會根據指定的地址自動加載配置文件。
IPROG指令的作用跟外部Program_B管腳的作用類似,都是對FPGA芯片進行復位操作,該復位操作對FPGA內部的應用程序進行復位,復位過程中除專用配置管腳和JTAG管腳,其他輸入/輸出管腳均為高阻態,同時IPROG指令不能復位專用重配置邏輯,如WBSTAR寄存器、TIMER寄存器、BSPI寄存器和BOOTSTS寄存器。IPROG指令能夠觸發FPGA開啟初始化流程,同時拉低INIT和Done信號。完成復位操作后,將默認的加載地址用熱啟動地址寄存器(Warm Boot Start Address,WB-STAR)中的新地址替換。
2.1.1 IPROG指令包
2.1.2 WBSTAR寄存器
WBSTAR寄存器的組成如下圖所示。
(1)對于BPI模式來說,可以通過RS[1:0]來控制具體位流的讀取,也可以通過STAT_ADDR[28:0]地址來控制具體位流的讀取。
(2)對于SPI模式來說,只有STAT_ADDR[23:0]地址來表征FLASH器件的地址,當使用32位地址的SPI(容量大于等于256Mb)時,需要將時間存儲的高24地址賦值給STAT_ADDR[23:0]。因此在位流存儲的起始地址早于255時,這就要求位流中的dummy數目要大于256個,否則就會出現易失部分有效位流讀取,導致加載失敗。為了安全起見,在使用大于等于256Mb的FLASH時,可以適當在位流頭前加入Dummy。
2.2 ICAP原語接口時序
ICAP原語接口時序跟Select Map接口時序非常相似。SelectMap模式下,FPGA的配置和回讀是通過CSI_B,RDWR_B和CCLK來控制的。當CSI_B=0時,SelectMap接口使能;當CSI_B=1時,SelectMap接口不使能。當RDWR_B=0時,數據端口為輸入,功能為配置FPGA;當DWR_B=1時,數據端口為輸出,功能為回讀FPGA。SelectMap模式下,當CSI_B=0時,RDWR_B由0變為1或者由1變為0都會觸發ABORT。當CSI_B=0時,RDWR_B由0變為1的ABORT現象是配置IO由輸入變為輸出,同時ABORT的狀態信息體現在數據管腳上,此時數據管腳為輸出。當CSI_B=0時,RDWR_B由1變為0的ABORT現象是配置IO由輸出變為輸入,這時ABORT的狀態信息無法體現在數據管腳上,因為此時數據管腳為輸入。
為了避免ABORT發生,建議在CSI_B=0前,設置好RDWR_B=0或RDWR_B=1,即通過控制CSI_B信號來控制配置或回讀,或者通過控制CCLK供給來控制配置或回讀。比如配置FPGA的三種接口時序。
2.2.1 連續的配置接口時序
2.2.2 CSI_B控制的斷續配置接口時序
2.2.3 CCLK控制的斷續配置接口時序
2.3 SelectMap數據順序
SelectMap有X8、X16和X32模式。Select Map的位順序的關系如下表所示。
SelectMap-X16數據變換關系如下圖所示,X8和X32類推。
因此IPROG的指令序列對應的實際SelectMap-X32數據如下表所示。
3 ICAP實現Multiboot的工程開發
3.1 功能需求
在SPI的flash里燒寫有A和B兩個程序,FPGA上電后,自動加載A程序,根據外部給FPGA指示信號,FPGA自動切換加載B的程序,同時在B程序運行期間,根據外部給FPGA指示信號,FPGA自動切換加載A的程序。
3.2 驗證平臺
KC705的評估板,使用的FLASH為N25Q128。
3.3 接口協議
3.3.1 數據包
ICAP傳輸的數據包即滿足SelectMap數據順序要求的IPROG指令包。
指令序列包中的WBSTAR期望地址的計算方法:由于需要在128Mb的SPI-FLASH中存儲2份位流,因為SPI-FLASH是按照字節存儲的,因此128Mb的SPI-FLASH大小也為16MB,現計劃每份位流存儲大小平均分配,均為8MB,遠小于實際7K325T的位流大小,因此需要對位流進行壓縮。
第1份位流存儲的地址為0X000000~0X7FFFFF,對應程序A的地址;
第2份位流存儲的地址為0X800000~0XFFFFFF,對應程序B的地址;
3.3.2 接口時序
采用連續的配置接口時序。
3.4 工程實現
3.4.1 系統組成
整個系統工程包括兩個工程,分別為Golden工程和Update工程,為了減少開發時間,此Demo程序中的Golden工程和Update工程很相似,Golden工程和Update工程在此次案例中差異見下圖中的紅色部分。
各功能塊的功能描述如下。
(1) 系統時鐘/復位:對輸入的時鐘和復位信號進行處理,得到滿足要求的系統時鐘和系統復位信號。
(2) 開關處理:對輸入的Sel_multiboot進行簡單處理,Golden工程是直接輸出給ICAP控制器,Update工程是取反后輸出給ICAP控制器。
(3) 流水燈:此功能是為了驗證Golden工程和Update工程切換是否成功,兩個工程的流水燈的功能差異通過輸入的參數led_constant來體現。
(4) ICAP_multiboot:此功能模塊通過ICAP原語給FPGA的配置電路發送IPROG指令序列,觸發FPGA執行多重加載功能,其中SelectMap數據生成是用來將輸入的指令進行bit_SWAP轉換,從而滿足SelectMap傳輸要求,ICAP控制器是將輸入的SelectMap數據以SelectMap連續配置接口時序發送給ICAP原語,從而達到觸發Multiboot的功能,其中輸入的參數addr_multiboot表示即將切換程序的存儲首地址。
3.4.2 ICAP控制器設計
整個工程中的關鍵在于ICAP控制器的設計,本案例中ICAP控制器使用狀態機來實現。
3.4.3 位流生成
位流Bit生成:由于7K523T器件本身的特性,生產的bit流文件大小為91548896,約為87Mb,約為11MB。而SPIFLASH的容量為128
Mb即16 MB,這個容量無法滿足在一個SPI FLASH上貯存兩個bit流文件,需要對生成的bit流進行壓縮。在約束XDC文件中添加壓縮命令即可。
固化Mcs生成:Xilinx系列的FPGA需要將后綴名為mcs的內存鏡像文件固化到外部配置存儲器中,FPGA上電后才能自動加載配置文件。一般的mcs文件只包含一個bit流文件,多重啟動的mcs固化文件包含多個bit流文件。在將多個bit流整合到mcs文件的過程中,需要指定每個bit流的起始地址,這樣FPGA專用配置邏輯才能根據地址找到對應的bit流。在程序設計WBSTAR地址時,確定了Golden位流存儲的起始地址為0X00000000,Update位流存儲的起始地址為0X00800000,因此在將Bit整合到Mcs過程中需要指定對應的存儲起始地址,否則就無法加載成功了。
3.5 板級驗證
整個Multiboot的功能是FPGA上電自動從外部SPI FLASH加載一個Golden的bit流,當需要執行Update的程序時,需要外部給一個觸發條件,Golden程序會根據觸發條件以及啟動地址發起重新配置指令,從而FPGA開始重新配置。
在板級驗證中,通過撥動SW11的最右邊的開關,可以滿足觸發條件實現多重配置。在FPGA上電后,自動加載Golden程序,LED燈呈現一盞流水燈,當撥動SW11的最右邊的開關后,FPGA加載Update程序,LED燈呈現兩盞流水燈,這時再動SW11的最右邊的開關,FPGA又加載Golden程序,LED燈呈現一盞流水燈。板級驗證的結果符合預期結果,功能正確,Multiboot跳轉正確。
總結
以上是生活随笔為你收集整理的使用ICAP原语实现SPI-Multiboot加载的全部內容,希望文章能夠幫你解決所遇到的問題。