9.3.1 EDK的介绍与安装
1.Xilinx嵌入式开发工具集
一般而言,由于嵌入式系统涉及了软件和硬件的开发以及两者的综合设计,因此其开发是较为复杂的。Xilinx为了简化基于FPGA的嵌入式开发流程,提供了功能强大、操作简单的工具集ISE和EDK。
1)集成软件环境ISE
ISE是Xilinx公司FPGA逻辑设计的基础。在这个环境中,设计者可以进行约束文件的编写,时序分析,逻辑布局布线以及器件编程等。本书第4章对ISE的使用进行了较为详细的说明,这里就不再累述。
2)嵌入式开发套件(Embedded Development Kit,EDK)
EDK自带了许多工具和IP,可以用来设计完整的嵌入式处理器系统,主要包括Xilinx平台工作室XPS和软件开发套件SDK。读者需要注意的是:只有安装了ISE软件,才能正常运行EDK,且二者的版本要一致。
下面对EDK的组成模块进行简要说明:
- Xilinx平台工作室(Xilinx Platform Studio,XPS)
XPS是用来设计嵌入式处理器系统硬件部分的开发环境或GUI,是系统设计者构建 Xilinx嵌入式系统时必用的工具套件。在XPS中,可以完成嵌入式系统架构的创建、软件代码的编写、设计的编译以及FPGA芯片的硬件配置。
- 软件开发套件(Software Development Kit,SDK)
SDK是集成的开发环境,基于Eclipse。它支持C/C++,用于嵌入式软件应用的开发和验证。
- 其它EDK部分
EDK还包括其它的一些部分,如:用于Xilinx嵌入式处理器的硬IP;用于嵌入式软件开发的驱动和库;在MicroBlaze和PowerPC处理器上用于C/C++软件开发的GNU编译器和调试器;有关文档以及一些工程样例等。
2.EDK软件的安装
EDK9.1软件安装的基本硬件要求如下:CPU在P III以上,内存大于256M,硬盘大于4G的硬件环境安装。为了更好地使用软件,至少需要512M内存,CPU的主频在2GHz以上。需要注意的是,安装EDK之前,必须安装ISE9.1。EDK的具体安装过程如下:
1)将安装光盘放进DVD光驱,等待其自动运行(如果没有自动运行,直接执行光盘目录下的Setup.exe文件程序即可),欢迎界面后会出现如图9-19所示的获取注册码对话框,可以通过网站、邮件和传真方式申请注册码。如果已有注册码,单击“Next”按键后继续。

图9-19 EDK9.1安装程序的欢迎界面
2)下一个对话框是Xilinx软件的授权声明对话框,如图9-20所示,选中“I accept the terms of this software license”,单击“ Next”后进入注册码输入对话框,输入正确的注册码后,单击“ Next”按键后,出现安装路径对话框,单击“Browse”按键后选择自定义安装路径,单击“ Next”按键继续。

图9-20 EDK9.1安装注册ID输入界面
3)接下来的几个对话框分别是选择安装设计环境、设置环境变量,这两个步骤保持默认即可。最后进入安装确认对话框,单击“Install”按钮,即可按照用户的设置自动安装ISE。需要注意的是,在选择安装设计环境时,用户需要选择自己使用的芯片所对应的模块,这样才能在开发中使用这些模块,一般选择“Select All”。
4)安装完成后,会在桌面以及程序菜单中添加EDK的快捷方式。双击即可进入EDK集成开发环境。
9.3.2 EDK设计的实现流程
1.基于EDK的开发流程
一个完整的嵌入式设计流程包括硬件设计和调试、软件设计与调试,各个步骤相对独立但又相辅相成。由于嵌入式应用场合多样,且软、硬件都可裁剪,因此并不是每个设计都要完成所有的步骤。图9-21为基于EDK的嵌入式设计的简化流程图。

图9-21 简化的嵌入式设计流程图
通常ISE FPGA开发软件在后台运行,XPS工具调用ISE软件提供的功能。XPS主要用来嵌入式处理器硬件系统的开发。微处理器、外围设备以及这些组件之间的连接问题,另外还有它们各自的属性设置都在XPS里进行。简单的软件开发可以在XPS里完成,而对于更复杂的应用开发和调试,Xilinx则推荐使用SDK工具。硬件平台的功能验证可以通过硬件描述语言HDL仿真器完成。XPS提供了行为级、结构级以及定时精确级等三种类型的仿真。验证过程结构由XPS自动产生,其中包括了仿真的HDL文件。设计者只需要输入时钟时序、重配置信息以及一些应用代码即可。仿真细节将在下面的内容中进行相关讲述。完成设计后,在XPS中将FPGA比特流和可执行可链接格式文件下载,就可以进行目标器件的配置。
完整的EDK开发流程如图9-22所示,其主要步骤有:
- 创建硬件平台:利用XPS的板级开发包向导(BSB Wizard)快速构建设计的硬件平台,是EDK设计的第一步。
- 添加IP Core以及用户定制外设:在XPS中添加所需的IP Core,对于XPS库中缺少的模块,需要用户自行设计。同样,XPS提供了建立用户自定义外设的向导,可简化该过程。
- 生成仿真文件并测试硬件系统:生成硬件系统的仿真文件,可选择行为级、结构级以及时序级仿真,利用ModelSim等工具测试系统,特别是用户自定义的外设;如果测试失败,需要返回上一步修改。
- 生成硬件比特流:生成硬件网表和比特流文件,这个步骤类似于传统FPGA设计的综合、布局布线、生成编程文件这3个操作。
- 开发软件系统:针对软件需求编写硬件代码,确定软件的操作系统、库、外设驱动等属性,针对每个应用软件工程,设置编译器、优化级别、使用的连接文件等信息。等设置完成后,编译生成.elf格式的可执行代码。
- 合并软、硬件比特流:编译软件后,需要将软、硬件可执行文件合并在一起,生成最终的二进制比特文件。
- 下载:使用JTAG编程电缆或编程器将更新后的最终比特流烧写到FPGA、PROM、FLASH以及CF卡。
- 在线调试:可利用XMD工具或ChipScope工具调试,通过JTAG编程电缆在线调试,下载可执行软件代码、控制执行,并监控相关系信息。

图9-22 完整的嵌入式设计流程图
2.EDK设计比特文件的组成
如前所述,最终下载到FPGA的嵌入式比特流文件是软、硬件比特流合并在一起的,详细的组成部分如图9-23所示。硬件部分比特流包括MHS文件、用户自定义HDL代码,二者经过综合实现后,产生.ngc网表,生成硬件系统的比特流文件;软件系统包括MSS文件、用户.c/cpp/asm文件,通过GCC编译器,生成目标文件.obj,再经过连接合成软件系统的比特流文件;最后通过Data2MEM过程,将软、硬件比特流合成完整系统比特流文件,通过JTAG链路下载到FPGA芯片中。

图9-23 EDK配置比特文件的组成结构
9.3.3 EDK的文件管理架构
对于嵌入式应用来讲,软、硬件协同开发是非常重要的,虽然EDK提供了XPS工具和SDK工具这两个图形化平台,但仍以文件结构管理为基础,图形化平台只是方便用户操作的,所有的设置内容都会写入相应的文件中。了解相应格式的文件是掌握EDK工具操作的必备知识。本节将介绍EDK构建嵌入式系统软、硬件系统的文件,以及管理、存储数据文件的模式和流程。
1.板级支持包Board Support Package(BSP)
BSP为每个处理器定义了系统的硬件元素。它包括了不同的嵌入式软件元素,如软件驱动文件、所选的库、标准I/O设备、中断处理程序以及其它相关的特征。因此,在将处理器、外围设备组装到硬件系统上,且定义了地址映射后,可以利用XPS来产生BSP。
与硬件组件类似,XPS允许用户规定软件平台部分并管理软件应用。XPS的应用标签包含了用户所需要的工具和命令。
2.XMP工程文件
EDK设计的工程文件就是.xmp格式,定义了EDK工具的版本、相关的硬件配置文件(MHS)和软件配置文件(MSS)、目标器件的类型、软件的源码和库位置等信息。用UltraEditor等文本编辑工具可打开查看,ProgStart为程序的起始位置,对应着内存的起始地址;StackSize标志着堆栈信息。与MSS中的信息是一致的。总的来讲,XMP文件是由XPS软件自动生成的,用户一般不要自行修改。下面通过在实际的XMP文件中添加注释来解读XMP文件。
#Please do not modify this file by hand
XmpVersion: 9.1 #EDK版本
VerMgmt: 9.1
IntStyle: default
MHS File: system.mhs
MSS File: system.mss
NPL File: projnav/system.ise
Architecture: virtex2p #目标器件家族
Device: xc2vp30 #目标器件型号
Package: ff896 #目标器件封装
SpeedGrade: -7 #目标器件速度等级
UseProjNav: 0
PNImportBitFile: projnav/system.bit
PNImportBmmFile: implementation/system_bd.bmm
UserCmd1:
UserCmd1Type: 0
UserCmd2:
UserCmd2Type: 0
TopInst: system_i
GenSimTB: 0
InsertNoPads: 0
WarnForEAArch: 1
HdlLang: VHDL #所使用的HDL语言类型
Simulator: mti #仿真工具为ModelSim
SimModel: BEHAVIORAL #仿真模型为功能仿真模型
MixLangSim: 1
UcfFile: data/system.ucf
FpgaImpMode: 0
ShowLicenseDialog: 1
Processor: ppc405_0 #处理器类型为硬核PowerPC
BootLoop: 0
XmdStub: 0
Processor: ppc405_1
BootLoop: 0
XmdStub: 0
SwProj: config_decoder_revb
Processor: ppc405_0 #下面是各类文件的说明
Executable: config_decoder_revb/executable.elf
Source: config_decoder_revb/src/xi2c_l.c
Source: config_decoder_revb/src p_config_decoder.c
Source: config_decoder_revb/src/uart.c
Header: config_decoder_revb/src/xi2c_l.h
Header: config_decoder_revb/src/uart.h
DefaultInit: executable
InitBram: 1
Active: 1
CompilerOptLevel: 2
GlobPtrOpt: 0
DebugSym: 1
ProfileFlag: 0
ProgStart: 0X45000000 #程序起始地址
StackSize: #堆的大小
HeapSize: #栈的大小
LinkerScript:
ProgCCFlags:
CompileInXps: 1
NonXpsApp: 0
3.MHS文件和其他相关的硬件平台元素
MHS文件是硬件结构描述文件,定义了系统结构、外围设备和嵌入式处理器,也定义系统的连通性、系统中每个外围设备的地址分配和对每个外围设备的可配选项。该文件可随意更改,在图形界面中对硬件结构的任何改动,都要写入该文件中。同样,对于高级用户,可通过直接修改MHS文件来代替XPS中的图形操作。MHS文件严格按照分层设计的思想,每个硬件模块都是一个独立的组件,再通过上层模块连接起来,形成整个系统。下面通过在实际的MHS文件中添加注释来解读MHS文件。
PARAMETER VERSION = 2.1.0 #定义了参数集版本
PORT sys_clk_pin = dcm_clk_s, CLK_FREQ = 50000000, DIR = I, SIGIS = CLK
#定义了系统时钟,大小为50MHz,方向为输入,标记为时钟信号
PORT sys_rst_pin = sys_rst_s, DIR = I, RST_POLARITY = 1, SIGIS = RST
PORT sg2fsl_r = xlsg_ifacesg2fsl_r, DIR = I
PORT fsl2sg_ctrl = xlsg_ifacefsl2sg_ctrl, DIR = O
PORT fsl2sg_data = xlsg_ifacefsl2sg_data, DIR = O, VEC = [0:31]
PORT fsl2sg_exists = xlsg_ifacefsl2sg_exists, DIR = O
PORT sg2fsl_ctrl = xlsg_ifacesg2fsl_ctrl, DIR = I
PORT sg2fsl_data = xlsg_ifacesg2fsl_data, DIR = I, VEC = [0:31]
PORT sg2fsl_w = xlsg_ifacesg2fsl_w, DIR = I
PORT fsl2sg_full = xlsg_ifacefsl2sg_full, DIR = O
#子模块定义,以BEGIN和END定义段
BEGIN microblaze #定义名称
PARAMETER INSTANCE = microblaze_0 #定义例化名称
PARAMETER HW_VER = 6.00.a #定义软件版本
PARAMETER C_USE_FPU = 0
PARAMETER C_DEBUG_ENABLED = 1
PARAMETER C_NUMBER_OF_PC_BRK = 2
PARAMETER C_AREA_OPTIMIZED = 1
PARAMETER C_FSL_LINKS = 1
#下面开始全是端口信号
BUS_INTERFACE DLMB = dlmb
BUS_INTERFACE ILMB = ilmb
BUS_INTERFACE DOPB = mb_opb
BUS_INTERFACE IOPB = mb_opb
BUS_INTERFACE SFSL0 = xlsysgenfsl_v20_1
BUS_INTERFACE MFSL0 = xlsysgenfsl_v20_0
PORT DBG_CAPTURE = DBG_CAPTURE_s
PORT DBG_CLK = DBG_CLK_s
PORT DBG_REG_EN = DBG_REG_EN_s
PORT DBG_TDI = DBG_TDI_s
PORT DBG_TDO = DBG_TDO_s
PORT DBG_UPDATE = DBG_UPDATE_s
END
……
4.MSS文件和其它的软件平台元素
除了硬件部分利用MHS文件来描述硬件元素, XPS还利用了微处理器软件规范(MSS)文件进行一个类似的软件系统描述。此MSS文件和用户的软件应用一起,组成了描述嵌入式系统软件部分的主要源文件。利用这些文件以及EDK的库和驱动器,XPS就可以编译用户的应用程序。而编译后的软件程序生成为可执行可链接格式(ELF)的文件。
和MHS文件一样,高级用户也可通过直接修改MSS文件达到更改软件配置的目的。下面通过在实际的MSS文件中添加注释来解读MSS文件。
PARAMETER VERSION = 2.2.0 #定义参数版本
BEGIN OS #定义了操作系统,以BEGIN和END定义段
PARAMETER OS_NAME = standalone
PARAMETER OS_VER = 1.00.a
PARAMETER PROC_INSTANCE = microblaze_0
PARAMETER STDIN = RS232_DCE
PARAMETER STDOUT = RS232_DCE
END
BEGIN PROCESSOR #定义处理器类型,以BEGIN和END定义段
PARAMETER DRIVER_NAME = cpu
PARAMETER DRIVER_VER = 1.01.a
PARAMETER HW_INSTANCE = microblaze_0
PARAMETER COMPILER = mb-gcc
PARAMETER ARCHIVER = mb-ar
PARAMETER XMDSTUB_PERIPHERAL = debug_module
END
BEGIN DRIVER #定义驱动,以BEGIN和END定义段
PARAMETER DRIVER_NAME = uartlite
PARAMETER DRIVER_VER = 1.01.a
PARAMETER HW_INSTANCE = debug_module
END
……
5.UCF文件
EDK工具和ISE一样,都通过UCF文件来添加信号的管脚约束与时序约束。在EDK设计中,UCF文件用来指定管脚的功能是最常用的,可通过文本编辑器修改,相关的语法和ISE中是一致的,如4.4.2节所示。
6.CMD文件
EDK在配置FPGA时仍通过调用iMPACT软件来完成的,但没有相应的图形化界面,而是通过命令行的方式实现的,将所需要的命令写在同一个文本中,然后采用批处理的方式实现,该文件就是.CMD 文件。CMD文件可通过文本编辑器修改,其基本内容如下所示。
setMode -bscan
setCable -p auto
identify
assignfile -p 1 -file implementation/download.bit
program -p 1
quit
其中,setMode用于设定边界扫描模式;setCable用于设置编程电缆类型;assignfile用于指定编程使用的比特流文件;program为器件编程的指令;quit为退出命令。
一般来讲,CMD文件中修改最多的是assignfile指令和program指令,其后面的数字为器件在JTAG链上的位置。在实际中,设计人员要首先通过iMPACT软件获取到详细的JTAG链信息,然后再将相应的数字填入CMD文件。其中在iMPACT显示的JTAG链中,最左端的器件标号为
1,以后的器件编号从左向右依次递增。
7.平台工作室软件开发套件(SDK)
平台工作室SDK方便了嵌入式软件应用工程的开发。SDK有自己的GUI,基于Eclipse开放资源工具组件。此SDK是XPS的补充部分;即利用SDK可以开发外围设备和处理器元件所使用的软件,而这些设备和元件都连接在XPS中。
对于每个复杂软件应用,用户都应该建立一个SDK工程。工程包括了用户的C/C++源文件、可执行输出文件以及相应的功能文件,如用来建立工程的“make”文件。通常每个SDK工程目录都位于嵌入式系统的XPS工程目录树下,每个SDK工程只产生一个可执行文件,<project_name>.elf。因此对于一个XPS嵌入式系统而言,可能有多个相应的SDK工程。


