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器件均可按本文提出的系统架构设计整个系统,该设计方法具有广泛的适应性。
博世推出一款240伏电动汽车充电器,已获全球大多数市场和标准的认证
执行的单片机程序怎么写?
浅谈同轴视频电缆和射频电缆之间的区别
Xilinx可编程逻辑器件设计与开发(基础篇)连载28:Spartan
SK海力士重回零售SSD市场 新款SSD标称持续读取速度高达560MB/s
基于Xilinx FPGA特点的嵌入式Bootloader设计与实现
随着近年来房地产市场出现疲态 空调市场也受到了较大影响
手机芯片的主要作用是什么
各大国际车厂积极亮相CES展示汽车科技
制作您自己的ESC直流无刷电机驱动器
小米7配置曝光:骁龙845+无线充电,依旧是最良心的国产旗舰
机械继电器故障的主要原因
谷歌大脑高级研究科学家:机器学习六年读博经历中的经验与教训
半导体参数测试仪的简介,分析它的特点以及作用
医疗+3D:一影医疗获3500万元A轮融资,迈进3D骨科手术成像时代
如何将OPT3001与Arduino一起用作照度计
青岛华晟智能与陇西县政府签约,共同推动东西部协作产业升级
IEEE标准和其主要格式
通过慢速跳频减少无线通信中的干扰
一文解析涡轮增压与自然吸气