基于SD卡的Virtex FPGA 配置方案
1.引言
本文引用地址:http://dyxdggzs.com/article/190913.htm由于 FPGA 良好的可編程性和優(yōu)越的性能表現,當前采用FPGA 芯片的嵌入式系統數 量呈現迅速增加的趨勢,特別是在需要進(jìn)行大規模運算的通信領(lǐng)域。目前FPGA 配置數據一 般使用基于SRAM 的存儲方式,掉電后數據消失,每次上電后都要重新寫(xiě)入。配置數據的 寫(xiě)入方式有3 種,即使用JTAG 仿真器、使用專(zhuān)用芯片以及使用微處理器。JTAG 仿真器的 方式在調試的時(shí)候使用較多,能隨時(shí)修改,但缺點(diǎn)是FPGA 芯片必須與電腦主機連接,失去 了靈活性。使用專(zhuān)用芯片的方式可以將配置數據事先存儲在非易失性存儲介質(zhì)中,為大規模 升級提供了方便,但不利之處在于專(zhuān)用芯片往往價(jià)格較高,并且也必須采用特定的存儲介質(zhì), 提升了系統成本,而且沒(méi)有利用到板上的現有資源,需要為配置芯片設置出專(zhuān)用的空間,占 用了電路板上的空間資源。而第三種方式可以利用當前嵌入式系統中一般都存在的微處理 器,同時(shí)也可以自行選擇合適的存儲介質(zhì)。下面就這種配置方案進(jìn)行說(shuō)明。
2. 系統介紹
2.1 系統工作原理
本配置方案中使用的微控制器是Philips 公司生產(chǎn)的ARM7 處理器LPC2468。FPGA 則 是Xilinx 公司的Virtex SX95T。存儲配置數據的介質(zhì)是成本較低而且使用廣泛的SD 卡。
系統的工作原理是上電時(shí)微控制器LPC2468 從SD 卡中讀取FPGA 的配置文件,然后 通過(guò)其通用IO 管腳模擬FPGA 的某種配置模式的時(shí)序,將配置文件寫(xiě)入到FPGA 的配置 RAM 中。Virtex 系列FPGA 有幾種不同的配置模式,每種配置模式使用到的管腳以及配置 信號的時(shí)序都是不同的, 因此對配置模式需要作出合適的選擇。
2.2 Viretex 系列FPGA 的配置模式
Viretex 系列FPGA 的配置模式是由上電時(shí)其專(zhuān)用配置管腳的狀態(tài)決定的,對應的關(guān)系 如下表所示:
因在系統中使用微處理器作為主控制器,因此FPGA 的模式需選擇Slave 方式,所以有 2 種模式可以選擇,即Slave SelectMap 和Slave Serial。這2 種模式的區別在與數據管腳的數 目不同,Slave Serial 模式只有1 個(gè)管腳用于數據傳輸,屬于串行傳輸,而Slave SelectMap 模式有8 個(gè)管腳用于數據傳輸,屬于并行傳輸。這2 種模式可以任意選擇,本文選擇的是 Slave SelectMap 模式。
2.3 Slave SelectMap 配置模式
Slave SelectMap 配置模式在管腳信號功能、配置流程、配置數據等方面有自己的特點(diǎn), 在進(jìn)行電路板設計以及程序編寫(xiě)時(shí)需要注意。下面對其主要特點(diǎn)進(jìn)行說(shuō)明。
2.3.1 Slave SelectMap 模式使用的管腳信號:
SelectMap 模式下使用的FPGA 管腳為:
根據上表,可以將微控制器的通用IO 管腳與上述FPGA 管腳連接起來(lái),連接電路圖如圖1 所示:
2.3.2 Slave SelectMap 模式的配置流程
Slave SelectMap 模式下提供時(shí)鐘的是外部器件,本方案中的時(shí)鐘信號是CCLK 使用 ARM 芯片的通用IO 進(jìn)行模擬。同時(shí),該模式下數據管腳有8 個(gè),因此在每個(gè)CCLK 的上 升沿,FPGA 可以讀入1 個(gè)字節的數據。需要注意的是這1 字節的最高位是D0,而不是一 般微處理器默認的D7,在電路板布線(xiàn)和編寫(xiě)配置程序時(shí)應給予相應改變。
配置過(guò)程的具體流程如圖2 所示。
接收完配置數據后,DONE 管腳會(huì )被拉高。但這并不是表示配置過(guò)程已經(jīng)結束,系統仍 需要時(shí)鐘來(lái)進(jìn)行后續的上電啟動(dòng)工作。為保證上電配置過(guò)程的正確進(jìn)行,最好的辦法是將配 置文件中的所有數據寫(xiě)入FPGA 中之后,然后繼續輸出CCLK 信號,直到DONE 管腳被拉 高。之后,再輸出8 個(gè)周期的CCLK,保證配置能正常完成。
根據上述流程,配置程序的主要函數的偽碼如下。
1.初始化函數SelectMAP_Init,在其它函數之前運行。
SelectMAP_Init(){
將ARM 通用IO 設置為對應的SelectMap 管腳信號;
設置 PROGRAM#,CS#和WRITE#管腳為低電平;
延時(shí)至少300ns;
設置 PROGRAM#為高電平;
循環(huán)檢查INIT#是否變?yōu)楦唠娖剑?/p>
}
2.發(fā)送數據的函數SendData_Byte,發(fā)送1 字節的數據。
SendData(uint8 data){
拉低CCLK;
將 D0~D7 電平設置為與data 對應的狀態(tài);
拉高 CCLK;
}
3.發(fā)送數據的函數SendData_Sector,發(fā)送SD 卡中1 個(gè)扇區的數據。
void SendData_Sector(uint8 * data){
聲明計數器,并將初始值設為0;
調用 SendData_Byte 發(fā)送1 個(gè)字節的數據,計數器加1;
檢查 BUSY 管腳的狀態(tài),等待其變?yōu)榈碗娖剑?/p>
檢查計數器是否到達規定的數據塊大小,達到時(shí)函數返回,未到達時(shí)繼續發(fā)送數據;
}
2.3.3 配置文件的格式
FPGA 支持將配置文件生成為幾種不同的格式,但在本方案中不是所有格式都可以使用 的。一般最常用的格式是.BIN 和.BIT 格式。由于.BIT 格式包含頭部開(kāi)銷(xiāo),會(huì )增加額外的處 理過(guò)程,因此本方案沒(méi)有支持.BIT 格式的數據,僅推薦使用.BIN 格式。
2.4 文件在SD 卡中的存儲
發(fā)送數據前,需要先從SD 卡中讀取配置文件。所有文件在SD 卡中都是按照一定的格式來(lái)組織的,本方案默認文件采用FAT16 格式進(jìn)行存儲。FAT16 格式下,SD 卡的結構如下圖所示[3]。
主引導記錄中最重要的參數是邏輯扇區的起始地址。獲得該參數后即可以讀取BIOS 參 數數據塊(BPB)。BPB 中存儲了扇區(Sector)、簇(Cluster)、文件分配表(FAT)的 大小,以及分區總扇區數等參數,是文件進(jìn)行操作時(shí)必不可少的。文件分配表則是指明了文 件存儲的位置,這些位置是以簇為單位的。每個(gè)簇包含的扇區數目在BPB 中說(shuō)明。根文件 夾中存儲了各不同文件的文件名和起始簇以及文件大小等信息。
2.5 配置文件的讀取和發(fā)送
根據上述SD 卡存儲格式的說(shuō)明,可以對存儲在其中的配置數據進(jìn)行讀取并發(fā)送出去。在本方案中,數據的讀取和發(fā)送是同時(shí)進(jìn)行的。
在對 SD 卡進(jìn)行讀取時(shí),首先需要讀取主引導記錄(MBR),獲得邏輯扇區的位置,然 后根據該位置讀取BIOS 參數數據塊(BPB),得到文件分配表(FAT)的位置以及扇區大 小等參數。在讀取文件分配表之前,需要先讀取根文件夾來(lái)獲得文件的起始位置,然后再 通過(guò)文件分配表獲得后續數據的位置。
得到文件的起始簇號之后,在文件分配表中讀取對應該起始簇的字節,獲得文件存儲的 下一個(gè)簇的簇號,這樣可以連續的進(jìn)行讀取。在讀取一個(gè)簇后,即將整簇的數據發(fā)送出去。 如果發(fā)現文件分配表中某一簇對應的數值是0xFFFF,則說(shuō)明是文件最后一個(gè)簇,這時(shí)該簇 的數據可以不足一個(gè)整簇,需要對其中的數據進(jìn)行取舍,以保證發(fā)送數據的正確性。
對配置文件讀取和發(fā)送的函數偽碼如下所示。
ReadSD_FAT16(){
讀取物理第0 扇區內容,即MBR,獲取邏輯0 扇區的位置;
讀取邏輯0 扇區的內容,獲取每扇區字節數,每簇扇區數,FAT 表占據的扇區數等參數;
讀取根文件夾的內容,根據配置文件的文件名獲取其起始簇號和文件長(cháng)度;
將當前簇設置為起始簇;
While(1){
讀取FAT 中對應當前簇的內容,獲得下一個(gè)簇的簇號;
FAT 表中對應當前簇的內容為0xFFFF 時(shí),即說(shuō)明當前簇是最后一個(gè)簇,計算該簇內的有效數據,并進(jìn)行發(fā)送;
讀取當前簇內容,進(jìn)行發(fā)送;
當前簇指向下一個(gè)簇;
}
}
3 結束語(yǔ)
在當前FPGA 使用領(lǐng)域日趨廣泛的情況下,對現有的含有FPGA 的嵌入式產(chǎn)品進(jìn)行升 級更新成為了一項比較繁瑣的工作,特別是在產(chǎn)品數量較多的情況下。本方案提出了采用 SD 卡存儲配置數據的配置方案,使用了目前嵌入式系統中常見(jiàn)的ARM 微處理器和SD 卡, 不僅降低了成本,而且利用了現有資源,節省了電路板布線(xiàn)布局的空間。最重要的是使升級 過(guò)程更加簡(jiǎn)潔,在進(jìn)行調試時(shí)也可以靈活使用。本文只給出了對Virtex FPGA 進(jìn)行配置的情 況,該方案也可以適用于Spartan 系列FPGA。
評論