第5节 XPS软件的高级操作
推荐给好友
打印
加入收藏
更新于2008-05-28 11:57:04

9.5.1 XPS的软件输入

EDK支持的软件方式有两种:一种是Standalone方式,软件代码直接运行在裸CPU核上;另一种是基于嵌入式操作系统的软件开发模式。前者的运行方式无疑是最快的,虽然缺少操作系统的支持,能实现的功能也是有限的,但也是最简单的方式。对于初学者来讲,使用Standalone方式,可直接在编写板级驱动包、用户定义外设以及软件代码后直接运行系统。此外,在Standalone简单结构的基础上,配合Xilinx的库文件和大量IP,不仅可直接操作硬件,也可以实现网络处理等较为复杂的功能,是应用简单设备的最佳选择。

1.源文件类型简介

XPS的应用软件工程都是基于C/C++语言的,如9.4.3节所述,在XPS工程信息面板的Application页面点击“Add software application project”按键,即可添加一个新的软件应用工程。

每个软件应用工程都包含以下5类源文件:xparameters.h头文件、.c/cpp源代码、.h头文件、.ld连接脚本文件以及.s汇编文件。下面分别进行简要介绍。

1)xparameters.h文件

该文件是XPS根据系统结构自动生成的头文件,包含了硬件系统的相关常量定义,如各个硬件单元的基地址、配置参数以及系统的运行频率等参数。典型的xparameters文件内容如下所示:

/* Definitions for driver GPIO */
// 定义了GPIO的实例化编号为3号
#define XPAR_XGPIO_NUM_INSTANCES 3

/* Definitions for peripheral LEDS_8BIT */
// 定义了GPIO作为LED应用的基地址、高地址等参数
#define XPAR_LEDS_8BIT_BASEADDR 0x40000000
#define XPAR_LEDS_8BIT_HIGHADDR 0x4000FFFF
#define XPAR_LEDS_8BIT_DEVICE_ID 0
#define XPAR_LEDS_8BIT_INTERRUPT_PRESENT 0
#define XPAR_LEDS_8BIT_IS_DUAL 0

/******************************************************************/
// 定义了CPU工作频率
#define XPAR_CPU_CORE_CLOCK_FREQ_HZ 100000000
/******************************************************************/

2)c/cpp文件

c/cpp文件用户源程序,基于标准的C/C++语言,是应用程序的主要部分,也是需要用户手动添加的部分,根据需求编写相关代码。

3)h文件

h文件是用户编写的头文件,与VC环境中的用法是一致的。

4)ld文件

ld文件用于连接用户源代码、用户库以及XPS库文件,并指定生成的目标二进制文件保存具体的配置信息

5)s文件

s文件是用汇编文件编写的,用于设置CPU核的指令数据缓存、处理中断等操作,一般用于BSP和Bootloop应用中,不需要用户修改。

2.软件编译设置

XPS提供了设置软件编译、连接环境的快速配置窗口,在相应的软件工程上单击右键,选择“Set Complier Options”命令,可弹出衍生子窗口,包括编译环境页面、调试和优化页面以及路径页面等三个页面。

1)编译环境配置页面

该页面如图9-73所示,在“Application Mode”栏选择可作为产品发布的执行模式(Executable)和具备辅助信息的调试模式(XmdStub)。“Output ELF file”栏用于设定编译后生成的目标二进制文件的保存路径。“Linker Script”栏用于设定连接脚本文件,在大型程序设计应该使用用户定制的连接脚本文件,即选中“Use Custom Linker Script”;若对于小型程序,则比较适合于使用默认连接文件,可选用“Use Default linker Script”。



图9-73 软件编译环境页面

2)调试和优化页面

该页面如图9-74所示。其中“Optimization Parameters”栏的“Optimization Level”用于设定优化层次,可选择无优化、低、中、高层次以及生成最小目标二进制文件等5个级别进行优化,用户要根据不同的需求来选择。一般来讲,在调试时最好选择无优化选项,当存储空间较小时,可采用最小二进制文件。



图9-74 调试和优化页面

3)路径页面

该页面如图9-75所示。“Search Path”栏的-L行用于添加库文件的查找路径;-I行用于添加头文件的查找路径。“Libraries to link against(-l)”栏用于设定加入连接时需要的库文件路径。



图9-75 路径页面

3.连接脚本文件的配置

熟悉嵌入式开发的读者明白,连接脚本对软件是非常重要的。XPS也为用户提供了简便的配置方法。在“Software”菜单中,单击“Generate Link Script”命令,会弹出图9-76所示的工程选择对话框,在下拉框中选择期望工程后,点击“OK”按键,则会打开相应工程的连接脚本配置界面,如图9-77所示。



图9-76 工程选择页面



图9-77 连接脚本配置页面

连接脚本页面的主要内容如下所示:

1)Section View栏

该栏用于设置工程最终二进制比特文件各个段的映射位置,是连接脚本设置的核心。其中Section列为各个标识段的名称;Size列给出各个标识段的大小;Memory列给出了相应段的映射存储器,可选择处理器片内块RAM(ilmb_cntlr_dlmb_cntlr)、SRAM、各种DRAM(SDR、DDR和DDR2等)以及Flash等。对于小的应用,可将所有段映射到片内块RAM,如果文件较大,则必须映射到外部存储器中。

2)Heap and Stack View栏

该栏标识了程序堆、栈空间的大小和映射的存储器。同样,存储器可选择处理器片内块RAM(ilmb_cntlr_dlmb_cntlr)、SRAM、各种DRAM(SDR、DDR和DDR2等)以及Flash等。

3)Boot and Vector Section栏

该栏给出了程序启动段和向量段的起始位置,前者指定芯片上电后第一个开始执行的程序;后者则包含了中断向量表。这两个段只能映射到
片上内存中。

4)Memory View栏

该栏给出了系统所有的存储器信息,包括起始地址和大小信息。该信息来自于MHS文件,用户是不能修改的。

5)输出栏

该栏位于右下角,“ELF file used to populate section information”栏指定了elf文件的路径和文件名;“Output Linker Script”则用于指定连接脚本文件的存放路径和名称。

9.5.2 XPS中的设计仿真

1.嵌入式系统的仿真介绍

如前所述,嵌入式系统开发分为硬件平台开发和软件开发。硬件平台开发即利用HDL语言编写系统最低层的驱动程序,每次驱动程序更改后
都需要重新下载到FPGA芯片进行验证。如果在程序验证中遇到问题,则需要在程序中加入一些调试手段,如借助于仿真软件进行功能验证。系统低层驱动程序完成后再编写用户框架程序,但这时已不涉及到硬件实现部分,所以程序中的问题用户一般能够发现。因此,嵌入式系统的仿真一般都是指底层硬件模块的仿真。

2.仿真前条件

1)必须有SmartModel-capable仿真器(ModelSim PE/SE或NCSim)。
2)仿真软件的EDK仿真库必须已经编译。后文会详细介绍如何生成ModelSim的EDK软件仿真库。

3.仿真嵌入式设计的意义

1)利用仿真,用户在完成硬件之前就可以测试基本的软件操作函数,这非常有利于软件的开发;
2)仿真可以检查系统的内部工作情况。相比硬件而言,在仿真环境中更容易获得信号和寄存器的值。
3)在仿真中,用户可以完全控制系统。

4.XPS仿真基础

XPS支持在ModelSim或NCSim逻辑仿真器上嵌入式系统的仿真,通过输出嵌入式硬件平台的VHDL或Verilog HDL模型,来完成仿真需求。模型所包括的块RAM(BRAM)存储器外围设备可以通过嵌入式软件ELF文件初始化。EDK可以产生:

  •  行为级模型(基于硬件平台规范);
  • 后综合结构模型;
  • 完全的后布局布线,精确定时模型。

行为级、结构级和时序仿真的验证可以在设计过程中的不同部分进行,如图9-78所示。仿真模型生成工具“Simgen”可自动创建HDL设计文件并对其进行配置。



图9-78 FPGA设计仿真过程

对于支持EDK的仿真器而言,用户在利用它们设计仿真前必须先编译HDL库。编译HDL库的优点包括有:加快执行速度以及存储器的有效利用。仿真库需要用户自行编译才能得到,下面的例子详细介绍编译ModelSim软件仿真库的方法和步骤。

例9-8 在Windows平台上生成EDK9.1的ModelSim仿真库。

1)在XPS中,点击“Simulation”菜单下的“Compilier Simulation Libraries”命令,然后,会弹出仿真库的编译向导,如图9-79所示。



图9-79 EDK仿真库编译向导

2)单击“Next”进入仿真工具选择界面,如图9-80所示,选择ModelSim。同时会列出PC上已安装的仿仿真软件的版本,如其中“Current simulator version”列出了笔者安装的ModelSim版本为6.2.b。需要注意的是,编译EDK库,需要ModelSim版本在6.0d以上(如果选用NCSim,其版本应在05.70-S005以上)。



图9-80 仿真工具选择界面

3)单击“Next”进入库所支持的硬件语言类型选择界面,如图9-81所示。一般选择“Both VHDL and Verilog”即可。



图9-81 硬件语言类型选择界面

4)单击“Next”进入库编译配置界面。如果是第一次编译,需要选择“Complier (or re-compilier)the libraries into the directory indicated below”,如果已经生成了仿真库,只是修改路径的话,则可以选择第二项“Use the complied libraries in the directory indicated below(do not complier)”。如图9-82所示。



图9-82 仿真库编译配置界面

其中,“Directory for complied libraries”用于设定仿真库的存放路径,一般不要和ModelSim、EDK的安装路径在同一盘符下,否则经常编译失败。如笔者的EDK和ModelSim安装在D盘,将EDK库的生成路径设定为F盘下的根目录。“Install SmartModels into the directory given below”用于设定SmartModels的安装路径,需要在环境变量LMC_HOME中指定,该选项一般选用默认即可。

5)单击“Next”进入编译路径信息确认页面,如图9-83所示。如果路径设置不对,可以在此修改。一般情况下,可以将“I want to complier other project specific simulation libraries”选项选中,以获得更多的仿真库。



图9-83 仿真库编译信息确认界面

6)单击“Next”进入编译类型选择页面,如图9-84所示。选择“Compile all library items”,虽然增加了编译时间,但获得了更全面的库,避免以后的多次编译仿真库。然后 单击“Next”进入XPS工程中其余的EDK组件库选择界面,全部采用默认值即可。



图9-84 编译类型选择界面

7)单击“Next”进入仿真库编译页面,如图9-85所示。当编译完成后,两个进度条都到100%,且“Next”按键有效。单击“Next”按键,进入仿真建立需求知识框,没有需要设定的地方,有兴趣的读者可点击查看。



图9-85 仿真库编译界面

8)单击“Next”进入最后一页,即编译完成指示界面,如图9-86所示。该界面显示了生成的仿真库的所有信息。读者一定要将“Save as default simulaton library paths for new XPS projects”的选项选中,以后就不用在新工程中重新编译。单击“Finish”按键,完成整个仿真库的编译过程。



图9-86 仿真库编译完成指示界面

5.仿真注意点

在仿真嵌入式系统时,必须考虑到下面几点:

1)某些系统值已得到了设定

设置全局复位,三态线以及时钟信号为一定的数值。Xilinx综合软件环境(ISETM)工具在仿真VHDL或Verilog设计方面提供了详细的信息。有兴趣的读者可以参见ISE的综合验证设计手册。

2)改变某些设置,这样可以加快仿真的运行时间

与硬件上运行的设计相比,HDL仿真会比较慢。为了改进这一仿真时间,用户可以调整一些参数。例如,在串口通信的仿真中,可通过增加外围设备的波特率来减少仿真时间。

6.帮助手册

XPS工具可以明白系统是如何连接的,HDL设计文件和后台之间的关联,且可以为所测试的设计创建仿真指令文件。当用户调用XPS工具栏命令“Simulation > Generate Simulation HDL Files”时,系统将自动地具备上述各种功能。

另外,XPS的Helper脚本可以简化仿真器的使用,它生成于测试平台(testbench)级。运行时,Helper脚本完成初始化功能,并给出产生波形和list(只在ModelSim中)窗口所使用的指令。顶层脚本调用具体实例的脚本。

在“simulation\<simulation type>”目录下,用户可以看到运行仿真的几个命令脚本。system_setup.do文件是调用其它脚本的起始点。脚本中的命令可以按照用户需要进行定制。通过编辑顶层的波形(system_wave.do)或list scripts,用户可以加入信号或去除信号。对于时序仿真,只给出顶层端口。

注:Simgen并没有为外部存储器提供仿真模型,对仿真模型也没有提供自动的支持。外部存储器模型必须实例化,且连接到仿真测试台,并根据模型规范进行初始化。

7.基于ModelSim的XPS仿真实例

例9-9 在XPS中,利用ModelSim对串口通信模块进行仿真,并给出所创建IP块对收到请求的硬件和软件响应。

1)仿真设定

对于RS232_UART外围设备,如果仿真速度为9600波特率,那么仿真时间很长,而且在其中的很多时刻设备并没有工作。如果将仿真速率加快100倍,那么仿真时间也相应地减短。同时,数据转换的区域也会变小,使得用户可以更容易地评估系统的仿真行为。为了加快UART的波特率,用户需要:

(1)在XPS系统组件视图中,双击RS232_Uart外围设备打开core配置对话框。在指明UART波特率选项的下拉菜单中,选择最大的值921600;

(2)在工具栏中选择“Hardware > Generate Netlist”生成网表,使得新的数值可以提交到用户的设计中。

2)运行仿真

(1)在工程标签下,检查“Project Options > Sim Model”已被设置为“BEHAVIORAL”。如果没有,双击改变这一选项。

(2)选择“Simulation > Generate Simulation HDL Files”运行Simgen工具,产生仿真HDL文件以及helper scripts;在调用命令产生仿真HDL文件时,XPS会生成“simulation\behavioral”目录结构。在“\behavioral”目录下可以找到两个主要的文件类型:DO文件和VHDL文件。

(3)对于system.vhd文件,它可以以文本形式打开,此文件即为所测试器件的顶层文件。它包括了组成该器件的所有信号和端口映射。对于system_setup.do文件,该宏文件自动生成仿真中所运行的许多步骤。其中alias命令调用其它的DO文件。用户可以添加自己的aliases到这个文件中以进行定制的仿真操作。打开system_wave.do文件,此文件显示了用户设计的信号,许多信号都由此文件生成。为便于仿真,可注释掉下列代码,保存并关闭此文件。

# do iocm_wave.do
# do docm_wave.do
# do plb_wave.do
# do plb2opb_wave.do
# do ppc405_0_wave.do
# do reset_block_wave.do
# do isocm_bram_wave.do
# do dsocm_bram_wave.do
# do plb_bram_if_cntlr_1_bram_wave.do
# do sram_256kx32_util_bus_split_0_wave.do
# do dcm_0_wave.do
# do jtagppc_0_wave.do
# do iocm_cntlr_wave.do
# do docm_cntlr_wave.do
# do push_buttons_position_wave.do
# do sram_256kx32_wave.do
# do plb_bram_if_cntlr_1_wave.do

(4)先前产生的ELF文件可以提供有关执行地址以及运行代码的汇编指令等方面的信息。在XPS中,选择“Project > Launch EDK Shell”。此命令窗口可以用来运行EDK的命令。

(5)在XPS命令界面处,改变目录如下:

cd SDK_projects/TestApp_Peripheral/Debug/

此目录为ELF文件所在处。为进行分解,敲入以下命令:

Powerpc-eabi-objdump –S TestApp_Peripheral.elf >> TestApp_Peripheral.dis

这一命令调用PowerPC目标文件,显示具有混合源和分解信息的程序(powerpc-eabi-objdump)。输出被送往TestApp_Peripheral.dis文件中。完成这一过程后,关闭EDK命令窗口回到XPS。

(6)在XPS中,选择“Simulation > Launch HDL Simulator”。如果用户已经安装了EDK支持的仿真器,那么将出现所调用的system_setup.do文件。现在仿真器可以编译并导入用户的设计了。选用ModelSim作为仿真工具时,可在命令窗口敲入以下命令:

c                              编译设计
s                              导入设计
w                              建立波形窗口
rst                            固定复位端口,设置时钟频率为100MHz
run 3ms                  运行仿真3ms

(7)在仿真运行过程中,启动SDK,打开“SDK_projects\TestApp_Peripheral”目录中的test_ip_selftest.c文件。其中可以找到处理器和用户开发IP之间的交互语句,其作用是告知系统读入test_ip的中断寄存器值,如图9-87所示。用户必须找到处理器和外围设备间的这一交互语句,因为处理器需要从属设备作出某些反应。



图9-87 交互语句示意图

(8)用文本打开TestApp_Peripheral.dis文件,找到代码行: TEST_IP_mReadMIR (baseaddr)。这里的汇编代码形式如图9-88所示。



图9-88 汇编代码示意图

(9)在仿真器中,查找FFFC3D4上的信号值或用户设计中所用的其它数值。在PowerPC内部寄存器exeaddr信号的FFFFC3D4处,用户可以放大此数值区域以定位test_ip外围设备的正确重置操作。放大仿真中的区域,可以看到在sl_dbus上有数据线转换。sl_dbus信号在这个位置处的值应当是0x30220301,如图9-89所示。



图9-89 仿真结果示意图

通过分解的源和仿真波形输出,用户可以更好地逐步进行设计并理解内部操作,以及硬件和软件的交互关系。

9.5.3 将EDK设计作为ISE设计的子系统

单独的嵌入式系统不能充分利用FPGA的硬件资源,在某些场合也不能满足用户需求,更多的时候,嵌入式系统是作为PGA设计中控制和调度子系统来应用的。下面介绍嵌入式子系统的设计和应用。

1.嵌入式系统作为子模块的适用情况

在下面两种情况下,用户必须利用ISE将嵌入式处理器系统的FPGA设计作为顶层FPGA设计源的子模块。

首先,用户的FPGA设计是嵌入式处理器系统和其它定制逻辑的结合,此时要利用ISE开发定制的逻辑部分并实现顶层FPGA设计;

其次,FPGA设计包括了嵌入式处理器系统,且用户选择使用工程导航来实现。工程导航允许用户使用由ISE提供的其它工具,如约束编辑器。

2.嵌入式子模块的设计方法

利用XPS和ISE工具来处理嵌入式子模块设计的方法分别称为“top-down”和“bottom-up”。这两种方法都可以使用相同的工具集和功能,其中包括BSB。

1)自顶向下的设计方法

在ISE工程中,可以像调用诸如DCM、加法器等模块的IP Core一样,来调用EDK设计(Microblaze/PowerPC)。在新建工程时,可直接添加Embedded Processor类型的源代码,该选项在安装EDK软件之后才会出现。它与其他子模块是一样的,可在任何需要的地方例化。具体操作过程后面会通用实例来说明。在使用时,需要注意的是:必须把EDK设计的C代码编译后的可执行文件初始化到FPGA的块RAM中。

在这种方法中,XPS自动获得ISE中所选的FPGA器件,创建嵌入式子模块(XMP文件),并将其作为顶层FPGA设计的源文件。用户在ISE工程中只能添加一个嵌入式子模块,但是该嵌入式子模块源可以包括多个微处理器。下面通过一个点亮LED小灯的工程实例来介绍自顶向下的嵌入式子模块设计方法。

例9-10 利用自顶向下的设计方法,将一个嵌入式子模块添加到ISE工程中,要求该嵌入式系统具备点亮3个LED灯的功能。

下面的步骤中,详细给出在ISE设计中创建一个嵌入式处理器子系统,并在XPS中进行设计,最终在FPGA中运行嵌入式子系统。
(1)在工程中新建“Embedded Processor”类型的源代码模版,如图9-90所示。



图9-90 Embedded Processor源代码使用模版

(2)然后系统自动调用EDK,按照上一节的步骤添加GPIO,设置都是一样的。接着生成BSP,库,编写C 代码,编译,生成网表。

(3)在ISE下可以点击View HDL Instantiation Template,查看例化模版。

component cpu is
port (
sys_clk_pin : in std_logic;
sys_rst_pin : in std_logic;
fpga_0_LEDS_GPIO_d_out_pin : out std_logic_vector(0 to 2)
);
end component;

(注:CPU默认生成的vector都是(0 to X),跟我们写的vector(X downto 0)直接连接的话,是对应位连接的,即<2>-<2>,<1>-<1>,<0>-<0>)。

在ISE中通过XST来查看其RTL级结构如图9-91所示。



图9-90 Embedded Processor处理器的RTL结构示意图

(4)接下来的步骤就是在ISE中实现、下载之类的工作了,不再赘述。我们修改EDK的C代码并且编译通过后,只需要在ISE里点击“Update Bitstream with Processor Data”命令即可,因为只更新软件比特流,所以速度是非常快的。也就是说在硬件模块定下之后,只需要修改C代码,这样开发非常方便。

在使用ISE低版本时(ISE 8.2以下),每次Update Bitstream之前必须点击XPS中“Software”菜单下的“Clear Bit”命令,清除比特文件。否则,ISE并不会把C/C++的可执行代码初始化到FPGA的块RAM中,导致CPU不能正常工作。

注意:在实例化用户顶层源文件的子模块后,用户的XPS子模块将出现在层次树的ISE顶层HDL源下。如果用户想修改嵌入式子模块设计中的任何部分,可以运行“Manage Processor Design”或双击重新打开XPS以及导入的嵌入式工程。

2)自下向上的设计方法

在这一方法中,用户必须选择和XPS以及ISE中相同的FPGA结构。为了实现自下向上的开发,用户首先调用XPS并开发嵌入式处理器设计,接着调用ISE并添加嵌入式子模块作为包括在用户顶层ISE工程中的源。其中,只有XMP文件才可以添加为源文件,块存储器映射(Block Memory Map,BMM)文件不能添加到ISE工程中。

如果用户利用XPS已经创建了一个嵌入式子模块设计,那么就可以利用如下步骤添加嵌入式子模块到顶层设计中:

  1. 打开ISE工程导航;
  2. 为用户顶层FPGA设计创建或打开ISE工程;
  3. 为用户ISE工程选择FPGA器件族、封装和速率等级,这些属性和嵌入式子模块中为ISE工程指定的属性相同;
  4. 选择“Project > Add Source”打开添加源的窗口;
  5. 在“Add Existing Sources”对话框中,为嵌入式子模块选择XMP格式的XPS工程文件。用户的XPS子模块将在工程面板中源的位置出现。

注意:在用户实例化顶层源中的子模块后,XPS子模块将出现在层次树里的ISE顶层源目录下。用户可以选择XMP源并运行“View HDL Instantiation Template”来产生HDL模板样例。模板中的HDL部分可以拷贝到用户顶层HDL源文件中。

3.嵌入式子模块的常用操作

1)在顶层设计中加入嵌入式子模块

在用户的顶层FPGA设计中,用户必须实例化并连接嵌入式处理器系统。同时,用户必须拷贝(有时可以进行修改)任何由XPS生成的设计约束到ISE工程的UCF中。

2)连接嵌入式子模块

用户可以连接嵌入式子模块的输出端口到顶层设计的输出端口。对于嵌入式设计的输入端口,可以利用顶层设计的输入端口和其它逻辑来进行驱动。嵌入式子模块的组成端口和MHS文件中的外部端口可以进行一对一的通信。

为了方便端口约束的拷贝:如果在BSB中指定某一具体开发板,用户在顶层设计中使用端口名字应和BSB在嵌入式子模块元件中生成的相同。

3)拷贝约束到ISE工程中

在XPS中运行BSB时,就会在XPS工程的data子文件夹中产生一UCF,<projectname>.ucf。此UCF包括了一些基本时序约束,给出用户所选处理器的参考时钟频率。如果在BSB中用户选择某一特定的开发板,UCF还包括了板上外围设备的完整端口规范。UCF也可能包括某些端口的I/O约束,如IOSTANDARD。

(1)拷贝BSB生成的约束到已有的UCF中

如果用户已将UCF源文件添加到顶层ISE工程中,那么就可以将BSB生成的约束拷贝到其中。对于BSB生成约束中涉及的任何嵌入式子模块端口,如果连接到不同名称的顶层端口上,那么用户就必须相应地对约束里的net名称进行编辑。

另外,用户也可以使用ISE中的约束编辑器,从BSB生成的UCF中导入端口约束到ISE工程约束文件中。但是,只有在BSB生成约束中涉及的所有嵌入式子模块端口都连接到有相同名称的顶层端口时,才可使用这一方法。

(2)在顶层设计中使用BSB生成的UCF

如果用户的顶层设计并没有UCF,那么可以添加BSB生成的UCF副本来作为起始点。

(3)实现包括嵌入式子模块的FPGA设计

在利用XPS进入嵌入式硬件平台设计,以及利用工程导航进入顶层FPGA设计和相应的UCF后,用户就可以开始实现完整的FPGA硬件设计。

4.在XPS中完成嵌入式子模块设计

前面介绍了如何在ISE中完成嵌入式子模块的设计,同样,在XPS中也可以完成嵌入式系统设计。当然,基于XPS的嵌入式系统设计方法属于自下向上的设计方法。

首先,打开XPS,选定芯片和硬件板,新建工程;

其次,选择“Project”菜单中的“Project Options”选项,选择“Hierarchy and Flow”页面,则弹出如图9-92所示的配置界面。



图9-92 XPS中系统层次设定界面

其默认选择为“Implement Design in XPS”,即在XPS中完成嵌入式系统的开发。直接选中“Implement Design in ISE(Export to Project Navigator Flow:DEPECATED)”选项,在“ISE File”输入ISE工程的目录,也可以通过“Broese”按键来选择相应的路径;并选中“Processor Design is a sub-module(Uncherck for top-level)”选项,并在“Top level instance name”后的文本框中输入在高层例化的名字,即可自动将XPS作为高层模块的子系统。

9.5.4 XPS对嵌入式操作系统的支持

嵌入式操作系统和嵌入式设计的应用密切相关,目前主要分为两类:一类是专门为嵌入式系统设计开发的实时操作系统,如VxWorks、Palm OS以及uC/OS等;另一类是由传统的操作系统根据嵌入式系统的特点简化得到的,如WinCE和各种嵌入式Linux系统。本节以uCLinux为例进行介绍。

要基于XPS完成嵌入式操作系统系统,则开发PC机要具备Linux开发环境,因此读者应首先建立自己的uClinux交叉编译环境,将交叉编译其和内核源代码放到指令目录下,再添加到系统路径中即可。本节只介绍XPS对uClinux的支持,至于PC端的配置和操作,读者可参见Linux方面的相关书籍。下面给出基于uClinux的MicroBlaze系统配置的实例,提供一个可运行uClinux的硬件平台。

例9-11 在XPS中建立一个可运行uClinux的MicroBlaze平台。

1)按照前文介绍的方法添加BSP,因为操作系统需要Flash和内存模块,前者充当“硬盘”,后者主要用于运行程序,因此要根据实际情况添加相应的Flash控制器和内存控制器。

2)此外,还需要配置软件平台,点击“Software”菜单中的“Software Platform Seeting”命令,其余保持默认,在“Os and Libraries”配置项的下拉框中选择“uCLinux”即可。

3)点击“OK”按键,退出界面。至此,基于uClinux的基本平台就生成了。

9.5.5 XPS工程的实现和下载

上面的内容,已经介绍了系统设计的相关软件操作,本节在此基础上介绍设计过程中的后续硬件操作步骤。实现和下载总共分成4步,首先,产生系统的硬件网表,即对嵌入式系统进行综合;其次,产生系统硬件架构的比特流文件;再次,编译软件,并将软件代码生成的比特流和系统硬件的比特流合二为一,构成完整的系统描述比特流;最后,将完整的比特流下载到FPGA芯片中。

1.生成系统硬件网表

XPS的硬件平台生成(Platgen)程序可以读入MHS文件中的硬件平台信息,以及MPD文件中的IP特征设置。Platgen中的输出文件为HDL文件,可在“<project name>\hdl\<hdl lang>”中找到。XPS会自动调用XST综合工具将所有的HDL设计文件转化成IP网表(NGC)文件,其原理如图9-93所示。



图9-93 生成硬件网表的元素和过程

选择“Hardware > Generate Netlist”菜单项,这一命令能够完成对硬件平台的综合,如图9-94所示。



图9-94 生成硬件网表命令的菜单示意图

点击“Generate Netlist”后,XPS即调用XST综合,可在控制台窗口中看到相应的综合信息,当综合完毕后,会在控制台窗口中给出综合整体报告,如操作、警告和输出信息的个数,如图9-95所示。



图9-95 系统硬件综合后的输出信息

2.生成系统硬件网表

生成网表之后,就是在此基础上生成硬件比特流文件,即完成翻译、映射和布局布线。在XPS中,通过调用其它的ISE工具(NGDBuild,MAP,PAR和TRACE)对NGC文件和系统约束文件进行处理。XFlow读入输入设计文件、流文件以及可选文件来产生FPGA比特流。通常用户不需要改变流或输入设计文件,但要根据实际硬件配置修改约束文件。其中,这些约束可能为简单的时钟信息或端口位置约束,也可能为复杂的布局、时序参数等约束。整个比特流生成过程如图9-96所示。



图9-96 生成硬件比特流的元素和过程

其中,NGC文件位于“<project name>\hdl\implementation”文件夹中。选择“Hardware > Generate Bitstream”菜单命令时,可启动实现的过程,将NGC网表文件转化为比特流文件,如图9-97所示。



图9-97 生成硬件比特流命令的菜单示意图

比特流的生成阶段,以处理器为中心的设计,所有的逻辑都和此嵌入式处理器系统相关联。因此在比特流生成前需要添加相应的约束文件。在运行BSB向导时,选择Xilinx开发板,则其约束都已预先设定。在完成BSB向导步骤后,会自动生成所有的这些约束,位于“<project name>\data”目录下。执行生成比特流命令后,会在控制台输出窗口列出相应的信息指示,和ISE中实现的过程的输出信息一致,当比特流生成后,再给出图9-98所示的指示信息。



图9-98 比特流生成的指示信息

当系统硬件比特流生成后,即可察看其所占全部硬件资源以及布局布线后的时序分析结果,后续的软件开发不再增加额外的硬件资源,也不会影响已有硬件的各种性能。在XPS中将视图切换到“Project”目录,在“Reference File”目录下的“Log File”的“Implementation/ Xflow.log”中,可察看所有硬件实现结果。其硬件资源分析报告的模版如图9-99所示。



图9-99 XPS硬件资源分析报告模版

图9-99给出的资源报告对应着Xilinx公司Spartan-3E Starter开发板,包含了很多外部资源。其中Microblaze核占用500~600个Slice,
PowerPC核本身不占用额外的硬件

3.编译软件应用程序

XPS中软件代码一般都是基于C语言的,入口函数就是main( )函数,当用户代码书写完毕,调用mb-gcc编译器将其转化为可执行文件。如果第一次编译,会首先编译XPS提供的库函数,如果系统软件架构有误,则不能通过编译,需要对照MSS文件进行修改。

编译之前,首先要生成连接脚本,设定软件代码段、程序启动地址以及存储空间,具体方法如9.5.1节所述。其中,根据系统存储器资源选择各个程序段的存放地址,一般选择外部存储芯片用于存放可执行程序,如果没有外接SDRAM或SRAM等外存,只能选择片内RAM,但对程序大小有一定的限制,软件程序必须通过片内RAM启动。

其次,编译工程。选中工程,点击右键,选择“Build Project”命令即可。编译完成后,会在控制台输出窗口给出生成的可执行文件的详细信息,如图9-100所示。



图9-100 工程编译输出信息

4.配置FPGA芯片

在FPGA中实现一个嵌入式处理器系统,则必须将硬件和软件系统部分都下载到FPGA和程序存储器中。XPS提供了完整的配置方案,如图9-101所示:



图9-101 生成嵌入式系统比特流的元素和过程

在芯片配置阶段,用户可以通过JTAG电缆线将主机和开发板的JTAG口相连,下载硬件比特流和软件ELF文件镜像。其中软件程序需要整合到硬件比特流中,一起下载到FPGA芯片中。

1)需要将期望下载的目标工程设定为片内RAM的初始化程序,选中工程,单击右键,选中 “Mark to Initialize BRAMs”,如图9-102所示,并编译目标工程,



图9-102 设定BRAM初始化程序

2)选中“Device Configuration > Update Bitstream”命令,将编译所生成的可执行文件和硬件比特流合在一起,如图9-103所示。



图9-103 更新配置比特流

此后,对软件代码再进行修改,只需要重新编译并更新即可,不需要重新生成原有的硬件比特流文件,这一特性,极大地节约了系统开发的时间。更新成功后,控制台窗口仍会给出完成指示信息,如图9-104所示。



图9-104 比特流更新成功指示信息

3)选择“Device Configuration > Download Bitstream”菜单命令,对FPGA芯片进行编程,如图9-105所示。



图9-105 FPGA配置命令示意图

执行了配置命令后,XPS会调用iMPACT程序完成边界扫描和下载。需要注意的是,该命令只是将程序下载到FPGA芯片中,断电后程序即丢失。将程序成功下载到FPGA以后,控制台给出的指示信息如图9-106所示。



图9-106 配置成功的指示信息

5.固化嵌入式系统设计

要将XPS设计永久性地固化在FPGA系统中,即当FPGA上电后自动从PROM或Flash芯片中加载程序,有两个方法,即:将系统完整的比特流转化成PROM配置文件,或在嵌入式系统中添加Flash控制器,直接配置Flash存储器。

1)将.bit文件转化成PROM配置文件

该操作利用ISE中的iMPACT组件,将.bit文件转化成配置PROM的配置文件,再由iMPACT来配置到PROM中,详细操作可参考5.4节。该方法非常简单,可快速将嵌入式系统的软、硬件设计文件下载到PROM中,当然其前提是硬件系统提供了PROM器件。

此外,还可将一定的用户数据存放在PROM中,在系统加载完成后,继续控制PROM读取所需数据,相应的硬件设计可参考5.5节。

2)添加Flash软核控制器

在实际的嵌入式应用中,复用PROM(包括处理器的加载以及相应软件应用数据的加载)并不适合所有的嵌入式系统,这是因为PROM的价格较高,对于大、中规模不太适用。因此,使用Flash也是一种很普遍的方法。由于Flash配置方式众多,包括SPI、BPI等方式,下面就不一一介绍,最基本的就是根据Flash的配置电路,在设计中添加相应类型的Flash控制器,达到可使用软核访问Flash的目的即可。

9.5.6 在线调试工具XMD的使用

在EDK开发环境中,嵌入式系统元素都位于FPGA内部,因此调试非常困难。为此,Xilinx提供了多种方法和工具使得用户可以方便地查看所设计的软件和硬件部分。如:利用Xilinx微处理调试器(Xilinx Microprocessor Debugger,XMD)的硬件调试功能;平台工作室SDK软件调试器可以通过XMD接口与目标处理器进行通信;利用综合的逻辑分析仪硬件核,ChipScope Pro工具可以与Xilinx器件内绝大部分的目标设计进行通信。本节将介绍一些Xilinx调试功能的关键部分。

1.XMD调试工具

XMD方便了用户所创建软件项目的调试,同时它也帮助用户验证系统。用户可以利用XMD来调试在硬件板子上运行的程序或者是使用周期精确指令设置仿真器(Cycle-Accurate Instruction Set Simulator,ISS)的程序。图9-107和图9-108分别给出XMD与PowerPC硬核处理器和Microblaze软核处理器的连接结构以及和调试软件的交互方式。



图9-107 XMD与PowerPC的系统连接示意图



图9-108 XMD MicroBlaze 系统连接

注意XMD并不是独立的,而是与其他功能实体同时工作的,比如XPS GUI。通常XMD通过JTAG与目标处理器相连,通过TCP/IP协议完成通信和控制。在上面的图中,基于所选微处理器的类型(PowerPC或MicroBlaze)以及用户配置系统的方法,XMD将所测试设备的状态信息传送给GUI(SDK)。基于用户在SDK中输入的请求,XMD同时还控制处理器的操作。下面给出基于Microblaze软核的XMD调试实例。

例9-12 利用XMD调试基于Microblaze的用户应用代码。

本例以Xilinx公司的Spartan-3E starter开发板为例,详细介绍XPS自动生成的外设测试工程的XMD调试方法。

(1)新建工程,选择Spartan-3E starter开发板。
(2)连接电源和USB连线,其USB连线作为USB下载线使用,可通过iMPACT软件来测试其连通性。
(3)边界扫描通过后,将应用中的“TestApp_Peripheral”工程编译、更新、并下载到FPGA中。
(4)选择XPS中“Debug”菜单中的“XMD Debug Option”选项,会弹出如图9-109所示的配置对话框。在“JTAG Cable”下拉框中,选择“USB”选项,右边的“Frequency”选项会自动调整为“750000”。如果是其他类型JTAG下载线,则需要“JTAG Cable”类型中选择相应的类型或者直接选择“Auto”,然后单击“OK”退出XMD配置界面。



图9-109 XMD配置界面

(5)点击“Debug”菜单中的“Lunch XMD”命令。XPS会启动GDB服务,并自动连接到硬件板。默认的连接id号为“0”,TCP端口为“1234”。如果没有硬件错误,XPS会弹出如图9-110所示的XMD命令窗口。如果连接失败,则该命令窗口不会显示“Connected to “mb” target. id = 0. Starting GDB server for “mb” target <id =0> at TCP port no 1234”的指示信息。



图9-110 XMD后台启动的命令窗口示意图

(6)点击“Debug”菜单中的“Launch Software Debugger”命令,则会弹出如图9-111所示的工程选择对话框。



图9-111 工程选择对话框

在下拉框中选择相应的工程,点击“OK”按键,XPS会弹出用于调试的“Source Window”对话框,如图9-112所示。



图9-112 软件调试对话框

点击图9-112的 图标,即可弹出与目标板的连接对话框,如图9-113所示,直接点击“OK”即可进入调试模式。



图9-113 连接到目标板的配置对话框

然后,即可通过点击 图标来完成单步调试,点击 图标查看本地变量,点击 图标打开控制台,可以用于输出信息,本地变量查看器和控制台的界面分别如图9-114(a)、(b)所示。


(a) 本地变量查看器的界面                                                          (b) 控制台的界面
图9-114 软件调试工具界面

2.SDK软件调试器

平台工作室SDK为无缝调试嵌入式设计提供一个综合的环境。MicroBlaze和PowerPC的ELF文件都可以用SDK进行调试。通过控制软件调试器(比如SDK提供的)的开始、结束和中断(设置断点)操作,用户可以监控程序的执行过程。通过对存储器和/或可变变量的监测和调整功能,软件调试器也可以对程序的操作进行一些运行时间的控制。SDK软件调试器的详细使用将在9.5.8节进行介绍。

3.ChipScope Pro工具

ChipScope Pro工具包括多个功能块,它们都被综合在同一个应用程序中。ChipScope Pro分析仪为ChipScope Pro核提供了器件的配置、触发建立以及跟踪等功能,通过对总线和任意信号值的监测,以及利用JTAG连接对输入和输出的不连续控制,实现对ChipScope Pro核硬件的调试。ChipScope Pro在EDK中调用的详细方法将在9.5.7节进行介绍。

4 平台调试

如果用户单独使用上述的调试功能实体,可以获得很大的帮助。但如果用户进一步地结合使用这些实体,那么这些工具可以提供更大的性能提高:即它们可以给用户提供嵌入式设计中有关软硬件交互的完整描述。对于隔离程序错误源头,这一能力是至关重要的。

1)概述

XPS中的平台工作室调试配置向导可以自动化软硬件调试配置的工作。选择“Debug > Debug Configuration”,可以打开调试配置向导,如图9-115所示,其中有以下几个主要的视图:



图9-115 调试配置界面示意图

(1)系统管理器

向导主窗口左边的选项允许用户选择不同的调试实体。这些选项可以为ChipScope核和处理器配置调试属性。

(2)配置面板

配置面板包括所需操作以及所选核设置的信息。用户可以在基本或高级调试控制属性中进行选择。

(3)控制窗口

控制窗口显示输出、警告、错误以及来自调试配置向导的信息。

2)硬件和软件同时调试

调试配置向导方便了软硬件的同时调试,它可以实现:

(1)连接IBA trig_out到处理器的停止信号,这样IBA就可以将处理器置于调试中断模式。简言之,ChipScope信号终止处理器的运行。
当处理器被终止时,软件调试器寄存处理器停止时的状态,并允许硬件触发器与软件中的活动相关联。处理器停止和调试器中对这一事件进行记录之间的时间差可以短达11个时钟周期,这取决于所用的总线。因此,软件终止很有可能发生在引起硬件触发事件的同一个子程序内。
(2)连接处理器终止信号到IBA trig_in,这样处理器的终止就会触发IBA记录采样值。
调试事件,如断点事件,会强迫处理器停止它的运行过程。当这一事件发生时,总线分析仪会存储这一情况并给出这一时间点前的所有采样,这样用户就可以将软件事件和硬件状态相关联。

(3)连接处理器指令信号到IBA trig_in,这样IBA就可以记录指令序列。处理器和时钟必须在同一时钟频率工作。在这一设置下,可以进行跟踪观察。跟踪缓存的深度受限于芯片上BRAM的数量。

 

<<上一节    下一节>>




 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.