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