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