曹 慧,程宏斌,2*,汪 洋,2,鄭喜鳳,2
(1. 長春希達(dá)電子技術(shù)有限公司 吉林 長春 130103;2. 中國科學(xué)院 長春光學(xué)精密機(jī)械與物理研究所 吉林 長春 130033)
常規(guī)LED顯示控制系統(tǒng)主要由上位機(jī)、發(fā)送卡和接收卡組成,通過網(wǎng)絡(luò)鏈路,實(shí)現(xiàn)LED顯示屏的顯示和控制。發(fā)送卡接收視頻和控制信號(hào),并將數(shù)據(jù)打包傳輸接收卡。接收卡截取自己需要的數(shù)據(jù)完成灰度調(diào)制或控制響應(yīng),并通過千兆網(wǎng)將數(shù)據(jù)串行轉(zhuǎn)發(fā)給下一張接收卡[1-3]。
在指揮、監(jiān)控中心等工程項(xiàng)目中,LED顯示屏要求(7×24)h不間斷運(yùn)行,因此確??刂葡到y(tǒng)程序升級(jí)正確越發(fā)重要。系統(tǒng)通過網(wǎng)絡(luò)傳輸更新發(fā)送卡、接收卡外置Flash存儲(chǔ)的程序文件,在過程中存在因干擾產(chǎn)生錯(cuò)誤數(shù)據(jù)或遇到掉電、誤擦除等破壞程序文件完整性的情況,致使現(xiàn)場(chǎng)可編程門陣列(Field Programmable Gate Array,F(xiàn)PGA)[4-12]不能再次調(diào)用,人工逐一板卡燒錄程序費(fèi)時(shí)費(fèi)力,造成重大顯示故障。通過Xilinx Spartan-6 FPGA的MultiBoot特性,完成FPGA多重配置設(shè)計(jì),在Flash某一固定區(qū)域存儲(chǔ)備用程序,當(dāng)FPGA更新程序出錯(cuò)時(shí),調(diào)用備用程序保障常規(guī)顯示和網(wǎng)絡(luò)鏈路功能,隨后在線更新程序,提高控制系統(tǒng)的容錯(cuò)率。
Spartan-6 FPGA在通電時(shí)從外部Flash加載存儲(chǔ)的項(xiàng)目程序文件(mcs),完成FPGA的配置后執(zhí)行系統(tǒng)功能。mcs文件一般只包含一個(gè)比特流配置文件,但也允許有多個(gè)。Spartan-6 FPGA具有MultiBoot邏輯配置模塊,來實(shí)現(xiàn)MultiBoot和Fallback操作。MultiBoot操作可以有選擇地從Flash的多個(gè)比特流文件中加載其中的一個(gè),通過ICAP設(shè)置寄存器并觸發(fā)IPROG命令,在系統(tǒng)不重復(fù)上電情況下對(duì)FPGA重新配置[4-6],實(shí)現(xiàn)不同的功能。Fallback操作是在切換加載比特流文件過程中出錯(cuò)時(shí),用預(yù)存的安全比特流文件替代并進(jìn)行FPGA的重新配置。
MultiBoot邏輯配置流程中有Header、MultiBoot和Golden 3個(gè)比特流配置文件,此時(shí)外部Flash存儲(chǔ)器中的比特流文件組織模式及FPGA配置流程如圖1所示。
圖1 MultiBoot邏輯配置流程Fig.1 MultiBoot logic configuration process
Header配置文件包含同步字、MultiBoot和Golden配置文件在Flash存儲(chǔ)的起始地址等信息[7]。系統(tǒng)上電時(shí),F(xiàn)PGA從0地址加載Header配置文件,根據(jù)存儲(chǔ)的地址跳轉(zhuǎn)并加載MultiBoot配置,這是滿足用戶使用的系統(tǒng)常規(guī)程序。Golden配置文件為備用的安全程序,當(dāng)加載MultiBoot配置出錯(cuò)時(shí),觸發(fā)Fallback操作,加載該安全程序配置FPGA。
如圖1所示,Header、MultiBoot和Golden(Fallback)配置文件在加載過程中出錯(cuò)時(shí),根據(jù)相應(yīng)寄存器內(nèi)設(shè)置的起始地址值FPGA會(huì)重新加載3次,加載次數(shù)的計(jì)數(shù)器名稱為Strike。若Strike的計(jì)數(shù)值為6,則從0地址開始,F(xiàn)PGA執(zhí)行Header→MultiBoot→Golden (Fallback)→Header的循環(huán)加載。若期間MultiBoot或Golden(Fallback)配置文件加載成功,則停止循環(huán)。每次循環(huán)Strike值加1,最多3次,Strike值為9則停止所有配置加載。
Fallback操作一旦被觸發(fā)且加載Golden配置成功,只有重啟系統(tǒng)或使用IPROG命令才能實(shí)現(xiàn)重新加載其他FPGA配置文件。MultiBoot特性提高了器件利用率及系統(tǒng)安全性、降低了復(fù)雜系統(tǒng)的成本。
LED顯示系統(tǒng)方案設(shè)計(jì)如圖2所示,增加MultiBoot控制模塊,采用狀態(tài)機(jī)編碼,按照指令流程通過Xilinx內(nèi)置的ICAP核向配置文件發(fā)送IPROG命令,熱啟動(dòng)調(diào)用Flash中存儲(chǔ)的備用程序,實(shí)現(xiàn)對(duì)FPGA重新配置。
圖2 系統(tǒng)方案設(shè)計(jì)Fig.2 System scheme design
采用FPGA型號(hào)為Xilinx Spartan-6 Lx16、Flash型號(hào)M25P16,F(xiàn)PGA與SPI Flash物理連接的硬件電路如圖3所示,數(shù)據(jù)寬度為×1 SPI配置的方式,M[1∶0] = 2′b01[8-9]。
圖3 配置接口硬件電路Fig.3 Configuration interface hardware circuit
LED顯示控制系統(tǒng)針對(duì)不同的顯示屏需要進(jìn)行相匹配的顯示參數(shù)設(shè)置,在SPI Flash內(nèi)采用顯示參數(shù)設(shè)置與程序運(yùn)行功能相獨(dú)立地址存儲(chǔ),系統(tǒng)上電時(shí)加載程序比特流文件和顯示參數(shù)設(shè)置文件,完成FPGA配置后實(shí)現(xiàn)不同顯示屏的正常顯示。
發(fā)送卡、接收卡的Flash存儲(chǔ)區(qū)分為程序文件區(qū)和設(shè)置文件區(qū)。程序文件區(qū)保存實(shí)現(xiàn)各自功能的程序比特流數(shù)據(jù);發(fā)送卡設(shè)置文件主要包含視頻信號(hào)截取、屏幕帶載分辨率、數(shù)據(jù)分包編碼信息等;接收卡設(shè)置文件主要包含單卡帶載分辨率、級(jí)聯(lián)編碼、顯示灰度和刷新率、Gamma表、校正系數(shù)表等。
SPI Flash的容量選擇與系統(tǒng)設(shè)計(jì)的加載模式和FPGA芯片的型號(hào)有關(guān)。在發(fā)送、接收端采用相同的主備兩種FPGA配置加載設(shè)計(jì)方案,SPI Flash內(nèi)存儲(chǔ)Header、主程序MultiBoot、備用程序Golden比特流文件和2個(gè)程序附屬顯示設(shè)置文件(Config.hex)。所用型號(hào)為M25P16,16 Mbit(0x000000-0x1FFFFF)容量的Flash詳細(xì)的存儲(chǔ)空間如表1所示。
表1 Flash存儲(chǔ)空間Tab.1 Flash storage space
軟件設(shè)計(jì)主要分為兩個(gè)部分:第一部分是在FPGA上開發(fā)的應(yīng)用模塊。實(shí)現(xiàn)系統(tǒng)發(fā)送卡、接收卡各自的功能,同時(shí)也為配置重載模塊提供時(shí)鐘信號(hào)和觸發(fā)信號(hào),本文采用在線 Flash程序?qū)懭胪瓿珊筝敵龅臉?biāo)識(shí)信號(hào)作為觸發(fā)信號(hào)。第二部分是FPGA配置重載模塊。包括Header文件編寫、MultiBoot和Golden程序文件中例化ICAP核,滿足觸發(fā)條件后,發(fā)送IPROG命令,實(shí)現(xiàn)FPGA重新配置。程序備份啟動(dòng)及升級(jí)流程如圖4所示。
圖4 程序運(yùn)行流程圖Fig.4 Program operation flowchart
根據(jù)程序運(yùn)行流程,Header配置文件作為啟動(dòng)引導(dǎo)作用,參照Xilinx Spartan-6指令對(duì)內(nèi)部相關(guān)寄存器的規(guī)則[7](如表2所示),逐條編譯指令數(shù)據(jù)形成Header配置文件并保存為HEX形式,圖5為向內(nèi)部寄存器GENERAL2寫入指令數(shù)據(jù)的詳解示例。
MultiBoot和Golden程序功能完全相同,需要注意的是:Golden備用程序內(nèi)對(duì)應(yīng)上位機(jī)程序升級(jí)指令的Flash擦除、寫入的偏移地址為MultiBoot主程序地址,且各程序在SPI Flash起始地址需要與Header程序文件內(nèi)地址設(shè)置值對(duì)應(yīng)。在主備程序的MultiBoot控制模塊中同時(shí)例化ICAP核, Xilinx的編譯平臺(tái)ISE中調(diào)用ICAP原語路徑為Edit→LanguageTemplates,Verilog→Device Primitive Instantiation→Spartan-6→Config/BSCAN Components→Internal Configuration Access Port(ICAP_SPARTAN6),調(diào)用接口如下:
ICAP_SPARTAN6_inst (
.BUSY(BUSY), // Busy/Ready output
.O(O), // 16Bit Configuartion data output
.CE(CE), // ICAP Enable input(Active-Low)
.CLK(CLK), // Clock input
.I(I), // 16Bit Configuration data input
.WRITE(WRITE) // Read/Write control input
);
表2 Header配置文件內(nèi)指令Tab.2 Header configuration directive definition
續(xù) 表
圖5 指令數(shù)據(jù)詳解示例Fig.5 Detailed examples of command data
在使用該接口時(shí),通過如圖2所示的MultiBoot控制模塊中狀態(tài)機(jī)只對(duì)CE、CLK、I、WRITE 4個(gè)信號(hào)不斷賦值來發(fā)送指令數(shù)據(jù),不用關(guān)注BUSY、O的值[7]。ICAP寫數(shù)據(jù)的指令時(shí)序圖如圖6所示。
圖6 ICAP寫數(shù)據(jù)指令時(shí)序圖(I總線寬度為16 bit)Fig.6 ICAP write data instruction timing chart (I bus width is 16 bit)
按照Xilinx Spartan-6指令對(duì)內(nèi)部相關(guān)寄存器的規(guī)則,通過狀態(tài)機(jī)完成表2中序號(hào)1→2→8→11→12→13的6個(gè)指令I(lǐng)CAP賦值,生成IPROG指令。ICAP_SPARTAN6數(shù)據(jù)總線寬度為16 bit,需要把引用的6個(gè)32 bit指令數(shù)據(jù)依次拆分為16 bit數(shù)據(jù),以主備程序內(nèi)Flash寫入完成標(biāo)識(shí)Spi_wda=1為觸發(fā)信號(hào),實(shí)現(xiàn)主備程序在線更新后按照運(yùn)行流程自動(dòng)重啟對(duì)FPGA重新配置。寫IPROG指令狀態(tài)機(jī)如圖7所示。
圖7 寫IPROG指令狀態(tài)機(jī)Fig.7 Write IPROG instruction state machine
在狀態(tài)機(jī)發(fā)送IPROG指令數(shù)據(jù)到ICAP核的過程中,需要先將16 bit位寬度數(shù)據(jù)分為高低各8 bit位寬字,在每8 bit位寬字內(nèi)進(jìn)行一次位轉(zhuǎn)換(Bit Swapping)操作,確保ICAP_SPARTAN6核接收到位轉(zhuǎn)換后的正確指令。位轉(zhuǎn)換操作參照如下Verilog語句:
wire [15∶0] I; ∥進(jìn)行Swap之后的有效數(shù)據(jù)
reg [15∶0] I_REG; ∥進(jìn)行Swap前的I寄存數(shù)據(jù)
assign I = {I_REG[8], I_REG[9], I_REG[10], I_REG[11], I_REG[12], I_REG[13], I_REG[14], I_REG[15], I_REG[0], I_REG[1], I_REG[2], I_REG[3], I_REG[4], I_REG[5], I_REG[6], I_REG[7]}; ∥Flash主SPI模式下,數(shù)據(jù)需要按照每8 bit進(jìn)行一次Swap操作(即每個(gè)字8個(gè)Bit數(shù)據(jù)進(jìn)行高低位互換)。
同理,按照上述方法,增加外部觸發(fā)信號(hào),參照表2中所有指令數(shù)據(jù),增加、修改圖8狀態(tài)機(jī)流程,則可以在MultiBoot控制模塊中根據(jù)內(nèi)部觸發(fā)、外部觸發(fā)信號(hào)輸出給ICAP核不同數(shù)據(jù),實(shí)現(xiàn)系統(tǒng)FPGA被動(dòng)和主動(dòng)兩種不同的熱啟動(dòng)重新配置方式。
Xilinx Spartan-6系列的FPGA需要將后綴名為mcs的內(nèi)存鏡像文件固化到外部配置存儲(chǔ)器中,上電后FPGA自動(dòng)加載并完成配置。本文的mcs文件包含3個(gè)比特流文件和2個(gè)HEX文件,在整合到mcs文件的過程中,需要指定每個(gè)比特流、HEX文件在Flash中存放的物理地址,且必須與系統(tǒng)程序設(shè)計(jì)內(nèi)有關(guān)Flash擦除、寫入、讀取等指令設(shè)置的起始地址相同,這樣FPGA才能根據(jù)地址找到對(duì)應(yīng)的程序和數(shù)據(jù)。
采用Xilinx ISE平臺(tái)完成主備兩個(gè)程序的工程項(xiàng)目文件設(shè)計(jì)后,通過軟件的Generate Programming File生成主程序MultiBoot.bit和備程序Golden.bit。把相關(guān)文件放在同一目錄下,使用ISE平臺(tái)內(nèi)的命令行窗口ISE Design Suite 32/64 Bit Command Prompt工具[10],按照以下步驟完成Flash存儲(chǔ)芯片中初始可燒錄的內(nèi)存鏡像(mcs)文件。
(1)promgen -p bin -r Header_SPIx1.hex -o Header_SPIx1.bin。如圖8所示,把編寫后的Header配置文件進(jìn)行格式轉(zhuǎn)換。
圖8 Header配置文件格式轉(zhuǎn)換Fig.8 Header configuration file format conversion
(2)promgen -w -p mcs -spi -s 2048 -data file up 000000 Header_SPIx1.bin -u 000044 Golden.bit -data file up 080000 Config.hex -u 100000 MultiBoot.bit -data file up 180000 Config.hex -o D:/H_M_G.mcs。
命令中各參數(shù)說明:
-spi:生成的mcs文件要固化到SPI Flash中;
-p mcs:生成文件的格式是mcs格式;
-s 2048:定義外部存儲(chǔ)器的容量,2 048 kbytes×8/1 024=16 Mbit;
-data_file up 000000 Header_SPIx1.bin:名字為Header_SPIx1的BIN文件在Flash的起始地址為0x0;
-u 000044Golden.bit:名字為Golden的比特率文件在Flash的起始地址為0x44;
-u 100000MultiBoot.bit:名字為MultiBoot的比特率文件在Flash的起始地址為0x100000;
-data_file up 080000 Config.hex:名字為Config的HEX文件在Flash的起始地址為0x80000;
-data_file up 180000 Config.hex:名字為Config的HEX文件在Flash的起始地址為0x180000;
-o D∶/H_M_G.mcs:合成后的文件名和保存的目錄。
合并完成mcs文件后,通過ISE設(shè)計(jì)平臺(tái)中IMPACT軟件將mcs文件固化到SPI Flash中。
通過ISE平臺(tái)中集成的Simulation軟件對(duì)設(shè)計(jì)進(jìn)行仿真,通過添加Test Bench,模擬激勵(lì)信號(hào)為升級(jí)程序?qū)懲闒lash的標(biāo)識(shí)信號(hào)Spi_wda,對(duì)MultiBoot控制模塊進(jìn)行仿真。圖9是Flash重新加載時(shí)對(duì)ICAP核輸入信號(hào)的仿真結(jié)果,可以看到,狀態(tài)機(jī)成功生成了IPROG命令,并將位轉(zhuǎn)換后的數(shù)據(jù)發(fā)送給ICAP模塊。
圖9 ICAP_SPARTAN6 IPROG命令仿真Fig.9 ICAP_SPARTAN6 IPROG command simulation
如圖10所示,本設(shè)計(jì)通過LED顯示平臺(tái)進(jìn)行主備升級(jí)程序的測(cè)試。測(cè)試過程及結(jié)果如下:
升級(jí)程序格式轉(zhuǎn)換為HEX文件,由上位機(jī)軟件通過網(wǎng)絡(luò)傳輸升級(jí)指令和程序數(shù)據(jù),分別發(fā)送給LED控制系統(tǒng)的發(fā)送卡、接收卡。通過修改程序HEX文件內(nèi)數(shù)據(jù)和在上位機(jī)傳輸數(shù)據(jù)過程中拔掉網(wǎng)線、掉電,模擬升級(jí)過程中出現(xiàn)的突發(fā)情況,對(duì)發(fā)送卡、接收卡進(jìn)行獨(dú)立的測(cè)試。通過LED顯示屏能否正常顯示圖像和系統(tǒng)指示燈狀態(tài)觀測(cè)FPGA是否正確加載配置。
圖10 LED顯示平臺(tái)(軟件、控制系統(tǒng)、顯示屏)Fig.10 LED display platform (software, control system, display)
系統(tǒng)主備程序的顯示功能一致,顯示配置文件一致,主程序工作狀態(tài)指示燈閃爍頻率是備程序的2倍。在系統(tǒng)主程序正常工作時(shí),模擬主程序升級(jí)故障,觀測(cè)到板卡自動(dòng)重啟后系統(tǒng)指示燈從高頻變?yōu)榈皖l閃爍,LED顯示屏顯示正常,確認(rèn)板卡備程序自動(dòng)啟用;此時(shí)正常進(jìn)行程序升級(jí),觀測(cè)到板卡自動(dòng)重啟后系統(tǒng)指示燈由低頻變?yōu)楦哳l閃爍,LED顯示屏顯示正常,確認(rèn)板卡主程序升級(jí)成功并自動(dòng)啟用;當(dāng)備程序已經(jīng)啟用,模擬升級(jí)故障時(shí),觀測(cè)到板卡自動(dòng)重啟后系統(tǒng)指示燈維持低頻閃爍狀態(tài),LED顯示屏顯示正常,確認(rèn)板卡主程序升級(jí)失敗,自動(dòng)保持啟用備程序。
本文LED顯示控制系統(tǒng)的發(fā)送卡、接收卡程序采用主備程序熱啟動(dòng)設(shè)計(jì),在LED顯示屏使用過程中極大地保障了系統(tǒng)在線升級(jí)的安全性和時(shí)效性。同時(shí),顯示程序文件與顯示配置文件分區(qū)存儲(chǔ)、靈活調(diào)用,通過上位機(jī)軟件對(duì)Flash擦除、寫入顯示配置時(shí),既滿足不同LED顯示屏需要靈活配置,又規(guī)避了對(duì)顯示程序直接操作的風(fēng)險(xiǎn)。在Xilinx Spartan-6 FPGA系統(tǒng)設(shè)計(jì)中編寫狀態(tài)機(jī)調(diào)用ICAP核,通過內(nèi)部、外部觸發(fā)信號(hào)可以控制FPGA重新配置。該設(shè)計(jì)方法靈活方便,易于操作,可分時(shí)復(fù)用提高編程資源的利用率和系統(tǒng)穩(wěn)定性,在工程應(yīng)用中有很高的應(yīng)用價(jià)值。