Bootloader程序是指嵌入式系統(tǒng)在正常工作之前,配置系統(tǒng)運行環(huán)境,引導(dǎo)操作系統(tǒng)的一小段程序。通過這段程序,我們可以初始化硬件設(shè)備、建立內(nèi)存空間映射等,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適的環(huán)境,為系統(tǒng)的正常運行做好準備。對于不使用操作系統(tǒng)的嵌入式系統(tǒng)而言,應(yīng)用程序的運行同樣也需要依賴一個準備好的軟、硬件環(huán)境,因此從這個意義上來講,BootLoader程序?qū)τ谇度胧较到y(tǒng)是必需的。
BootLoader程序與硬件系統(tǒng)密切相關(guān),依賴于具體的嵌入式板級硬件設(shè)備的配置。比如板卡的硬件地址配置、微處理器的類型和其他外設(shè)的類型等。也就是說,即使是基于相同嵌入式微處理器構(gòu)建的不同嵌入式目標板,BootLoader程序也不是完全通用的,仍需要修改其源程序。
與ARM等嵌入式系統(tǒng)的啟動過程所不同的是,FPGA必須先將內(nèi)部硬件邏輯配置完成之后,才能運行程序代碼。雖然可以直接將程序代碼例化到片內(nèi)BRAM中,但是由于FPGA內(nèi)部的BRAM資源有限,而且硬件邏輯配置時就會占用其中的資源,因此遇到大型系統(tǒng)設(shè)計時(例如帶有TCP/IP協(xié)議的大型程序),片內(nèi)BRAM資源不夠,就必須使用外部的RAM來儲存程序代碼和堆棧,這就需要設(shè)計Bootloader程序來完成用戶程序的引導(dǎo)。
本文結(jié)合Xilinx FPGA的特點詳細給出了Bootloader程序設(shè)計和實現(xiàn)過程。本設(shè)計所實現(xiàn)的Bootloader程序是在FPGA硬件配置完畢之后在MicroBlaze軟核處理器上運行的一段啟動代碼,用來把Flash中的用戶程序傳輸至外部RAM,并引導(dǎo)系統(tǒng)從用戶程序中開始運行。
一、系統(tǒng)硬件平臺的實現(xiàn)
本設(shè)計的實現(xiàn)是以Xilinx公司的Spartan-3E FPGA、STMicroelectronics公司的SPI串行Flash(M25P16)、Micron Technology公司的DDR SDRAM (MT46V32M16)為主要器件構(gòu)建硬件平臺。下圖(圖1)為系統(tǒng)硬件框圖。
基于SRAM工藝的FPGA是易失性的,系統(tǒng)掉電以后其內(nèi)部配置數(shù)據(jù)將丟失,因此需要外接存儲器件保存其配置數(shù)據(jù),比如外接Flash芯片。
本設(shè)計選擇的是STMicroelectronics公司的SPI 串行 Flash(M25P16),容量是16Mbit?;赟PI接口的串行Flash的配置方式不需要另外的單片機或CPLD進行配置控制,簡化了電路設(shè)計。同時所需的FPGA引腳較少,節(jié)省了FPGA芯片的管腳資源,對于需要諸多外設(shè)的復(fù)雜系統(tǒng)的設(shè)計是十分有利的。
Xilinx公司的Spartan-3E系列FPGA支持多種配置方式,因此需要配置模式選擇管腳來選擇SPI方式進行啟動配置。因此3個模式選擇管腳應(yīng)該被配置SPI模式即M[2:0]=0x01。同時還需要配置FPGA的SPI參數(shù)選擇管腳,本設(shè)計配置為VS[2:0]=0x03。
本設(shè)計中RAM是作為系統(tǒng)運行時,用戶程序儲存,用戶數(shù)據(jù)儲存,堆棧等的存儲器。所以可以選擇多種類型的器件,比如SRAM,DDR SDRAM。本設(shè)計使用的是Micron Technology公司的DDR SDRAM (MT46V32M16),是一片容量為512 Mbit (32M x 16)的16位總線寬度的芯片。由于DDR SDRAM是高速器件,要注意時序問題,所以在PCB布線時要布等長線,必要時使用蛇形線來實現(xiàn)等長線。該芯片使用SSTL2_I電壓標準(2.5V),而FPGA的同一個Bank的I/O引腳只能使用一個電壓標準,所以DDR SDRAM的引腳應(yīng)連接在FPGA的同一個Bank上。這樣在分配FPGA的Bank電壓時,不同I/O引腳電壓標準的外設(shè)使用不同的Bank,以避免引發(fā)沖突。
二、系統(tǒng)的軟件設(shè)計:
本系統(tǒng)的配置文件設(shè)計采用了IP(Intellectual Property)資源復(fù)用的設(shè)計方法。IP資源復(fù)用是指在集成電路設(shè)計過程中,通過繼承、共享或購買所需的智力產(chǎn)權(quán)內(nèi)核(IP),然后再利用EDA工具進行設(shè)計、綜合和驗證。
Xilinx公司對其公司的FPGA芯片提供了專用開發(fā)工具EDK(Embedded Development Kit) 。此工具包含了各種與嵌入式系統(tǒng)開發(fā)相關(guān)的IP。本系統(tǒng)的設(shè)計即是在EDK中完成。開發(fā)流程分為硬件邏輯設(shè)計流程和軟件設(shè)計流程。
1、硬件邏輯設(shè)計流程
在硬件邏輯開發(fā)流程中,首先根據(jù)系統(tǒng)需求在EDK中選擇IP核,按照系統(tǒng)架構(gòu)進行連接和組合。本系統(tǒng)以MicroBlaze軟核處理器為中心,EDK中提供了兩種同樣符合IBM CoreConnect標準的總線:PLB(Processor Local Bus) 和OPB(On-Chip Peripheral Bus)供MicroBlaze軟核使用。PLB總線和OPB總線的工作頻率為50MHz。OPB為32位總線,主要用于與外部設(shè)備相連接;PLB為64位總線,用于高速IP核之間互連。PLB與OPB的通信是通過轉(zhuǎn)換訪問控制IP核(PLB to OPB)完成的。
本設(shè)計的用戶程序的運行需要外部存儲空間,因此在OPB上為MicroBlaze外接DDR SDRAM內(nèi)存芯片。MicroBlaze通過掛載在OPB總線的DDR SDRAM控制IP核從DDR SDRAM的讀寫數(shù)據(jù)。由于配置文件存儲在SPI 接口的Flash中,MicroBlaze通過 SPI控制 IP核,對SPI Flash存儲器進行讀寫,此核也使用OPB總線與MicroBlaze處理器相連接。系統(tǒng)啟動時需要先運行BootLoader引導(dǎo)程序,這段代碼需要配置在系統(tǒng)的BRAM中,所以Block RAM (BRAM) IP核也是必須的。系統(tǒng)調(diào)試時還需要串口連接PC機,所以用于控制串口的OPB UART IP核也是需要的。
EDK根據(jù)用戶選用IP核搭建出的系統(tǒng)結(jié)構(gòu),生成MHS(Microprocessor Hardware Specification)文件。此文件中主要定義了系統(tǒng)硬件細節(jié)、MicroBlaze軟核、SPI控制IP核等的具體配置參數(shù)、系統(tǒng)所需的各種存儲空間的地址分配。MHS文件生成后,EDK根據(jù)此文件以及FPGA的其余功能文件一起,綜合生成下載配置文件,硬件設(shè)計部分完成。整體連接關(guān)系如下圖(圖2)所示。
2、軟件設(shè)計流程
完成了以上各項選擇工作,接下來就可以開始進行實際的Bootloader程序設(shè)計了。由于本設(shè)計處理器首先執(zhí)行Boot Loader的代碼,再引導(dǎo)至用戶程序。因此,軟件部分的設(shè)計應(yīng)包括Boot Loader程序的設(shè)計,系統(tǒng)及用戶程序設(shè)置,配置文件制作三部分。
2.1、Bootloader程序設(shè)計
Bootloader的總體結(jié)構(gòu)框架如下圖(圖3)。Bootloader主要由驅(qū)動程序和應(yīng)用程序兩部分組成。這樣的分層結(jié)構(gòu)有利于快速的開發(fā)和移植。驅(qū)動程序負責(zé)驅(qū)動串口和SPI Flash。應(yīng)用協(xié)議負責(zé)對系統(tǒng)進行引導(dǎo)。
系統(tǒng)加電或復(fù)位后,處理器通常都從預(yù)先確定的地址上取指令。一般來說處理器復(fù)位時都從地址0x00000000處取它的第一條指令。而嵌入式系統(tǒng)通常都有某種類型的固態(tài)存儲設(shè)備(比如:ROM、EEPROM或FLASH等)被安排在這個起始地址上。因此在系統(tǒng)加電或復(fù)位后,處理器將首先執(zhí)行存放在起始地址處的程序。通過開發(fā)工具EDK可以將BootLoader程序定位在起始地址開始的存儲空間內(nèi)。所以,BootLoader程序是系統(tǒng)加電后,用戶應(yīng)用程序運行之前,首先必須運行的一段代碼。對于MicroBlaze軟核處理器,第一條指令是從0x00000000地址取出的,此地址分配給了可引導(dǎo)的掛載在PLB總線上的BRAM存儲器。
BootLoader的通常包括以下主要步驟(以執(zhí)行的先后順序):
1)硬件設(shè)備初始化。
2)復(fù)制用戶程序到RAM空間(DDR SDRAM)。
3)校驗已復(fù)制的用戶程序。
4)指針跳轉(zhuǎn)到預(yù)先設(shè)定的用戶程序RAM空間首地址。
下圖是Boot Loader的執(zhí)行流程圖。
Boot Loader主要內(nèi)容及其代碼實現(xiàn):
首先初始化SPI控制器,其中XPAR_SPI_FLASH_BASEADDR是SPI Flash器件的首地址。
Initialize_Spi_Controller(XPAR_SPI_FLASH_BASEADDR);
XSpi_mEnable(XPAR_SPI_FLASH_BASEADDR);
其次復(fù)制SPI Flash內(nèi)的代碼至DDR SDRAM,BOOT_SECTOR參數(shù)是Flash中存儲用戶程序的段首地址,本設(shè)計中取為0x60000,注意這里的地址要與之后制作的配置下載文件的相應(yīng)參數(shù)保持一致。WORDS_TO_COPY參數(shù)是用戶程序的最大長度,本設(shè)計取值為0x10000,即64KB。destination_location參數(shù)是由* destination_location = (unsigned char *) DESTINATION_ADDR而來,DESTINATION_ADDR為DDR SDRAM在系統(tǒng)中的首地址,也就是用戶程序?qū)⒁尜A在DDR SDRAM區(qū)間的首地址。
M25P16_start_read (XPAR_SPI_FLASH_BASEADDR, BOOT_SECTOR, 0x00, 0x00, SCK_FASTER_THAN_20MHz);
for (i = 0; i 《 WORDS_TO_COPY/16; i++)
{
spi_transfer(my_send, my_receive, 16);
for (k=0; k《16; k++)
*destination_location++ = my_receive[k];
}
M25P16_end_read (XPAR_SPI_FLASH_BASEADDR);
再次,對復(fù)制的代碼進行部分校驗:
destination_location = (unsigned char *) DESTINATION_ADDR;
M25P16_start_read (XPAR_SPI_FLASH_BASEADDR, BOOT_SECTOR, 0x00, 0x00, SCK_FASTER_THAN_20MHz);
for (i=0; i《150; i++)
{
spi_transfer(my_send, my_receive, 16);
for (k=0; k《16; k++)
{
if (my_receive[k] != *destination_location++)
{
print(“\n\r !ERROR! File not copied correctly\n\r”);
while(1);
}
}
}
M25P16_end_read (XPAR_SPI_FLASH_BASEADDR);
最后進行指針跳轉(zhuǎn),跳轉(zhuǎn)到用戶程序所在位置:
boot_app = (int (*) (void)) DESTINATION_ADDR;
boot_app();
while(1) { ; }
2.2、系統(tǒng)及用戶程序設(shè)置
在實際應(yīng)用的時候,系統(tǒng)中除了Bootloader程序,還會有實現(xiàn)嵌入式系統(tǒng)功能的用戶編寫的應(yīng)用程序。也就是說,在EDK環(huán)境中將會有兩個工程。首先需要將Bootloader工程例化到BRAMs中,即系統(tǒng)會先運行Bootloader程序。其次,需要修改用戶程序存放的地址空間,即將用戶程序?qū)懭隓DR SDRAM的首地址,本設(shè)計將用戶程序存放在以0x44000000開始的DDR SDRAM的地址空間。之后,還需要修改用于生成下載文件的配置參數(shù)文件bitgen.ut,將“-g StartUpClk:JTAGCLK”修改為“-g StartUpClk:CCLK”。這是因為從外部RAM配置FPGA時,外部RAM的時序?qū)⒂蒄PGA提供,而不是由JTAG接口的時鐘信號線來提供。FPGA通過它的CCLK引腳輸出時鐘信號,引導(dǎo)整個配置過程。
2.3、配置文件的制作
由于總體配置文件是由包含Bootloader及硬件平臺的系統(tǒng)配置文件和用戶程序文件兩部分所組成。所以無法利用EDK工具直接生成。下面將給出制作系統(tǒng)配置文件的主要過程。
首先,利用Xilinx公司的ISE軟件的iMPACT工具將原系統(tǒng)配置文件轉(zhuǎn)化為可下載至Flash的MCS文件。
其次,將系統(tǒng)編譯用戶程序生成的ELF文件(Executable and Linkable Format)轉(zhuǎn)化為二進制文件,再利用Xilinx公司提供的二進制文件轉(zhuǎn)化工具(xbitread.exe)將二進制文件轉(zhuǎn)化為十六進制文件。
第三步,利用Xilinx公司的MCS文件制作工具(xmcsutil.exe),將十六進制用戶程序文件轉(zhuǎn)化為可下載的MCS文件,然后將第一步生成的MCS文件和剛才生成的MCS文件合并為最終的配置文件。
最后,使用iMPACT工具通過JTAG口,將配置文件下載至Flash中,整個系統(tǒng)構(gòu)建完畢。
結(jié)束語
基于Xilinx FPGA嵌入式Bootloader的設(shè)計方法已經(jīng)在省部級項目“用于強力輸送帶的高速X射線探測器系統(tǒng)”中得以實現(xiàn)。通過這種設(shè)計,該系統(tǒng)可以進行靈活的修改和升級。Xilinx公司的Spartan-3E/A系列芯片,以及目前最高端的Virtex5系列芯片,都支持SPI啟動方式,因此這些FPGA器件均可按本文提出的系統(tǒng)架構(gòu)設(shè)計整個系統(tǒng),該設(shè)計方法具有廣泛的適應(yīng)性。
評論
查看更多