9.5.7 XPS中Chipscope的使用
如第7章所述,Chipscope的简单易用且功能强大。在XPS中,可用的逻辑控制和分析核包括:
- 综合控制器Pro(Chipscope_icon),为目标FPGA的JTAG端口和多达15个的其它核(IBA,VIO或IBA)之间提供通信的通道。
- 综合逻辑分析仪(Chipscope_ila),由用户可以定制的逻辑分析仪核,可以监控用户设计中的任何内部信号。
- 综合总线分析仪(Chipscope_iba),一个专门用来调试嵌入式系统的逻辑分析仪核,它可以互联芯片上的外围总线(On-Chip Peripheral Bus,OPB)或处理器本地总线(Processor Local Bus,PLB)。其中的嵌入式系统包括了IBM核连接总线。
- 虚拟输入/输出(Chipscope_vio),用来实时监控和驱动内部FPGA信号的核。
1.EDK中的Chipscope分析核
在EDK中,所有的逻辑模块都必须添加到处理的总线上,Chipscope分析核也不例外,全部外挂在OPB/PLB总线上。
1)Chipscope_icon
Chipscope_icon本身并不能监控任何信号,但提供了统一的接口来连接JTAG接口和各个监控核,处于枢纽的地位,如图9-116所示。它和ISE中ChipScope的ICON核功能是一样的,最多可管理15个监控核。

图9-116 EDK中ChipScope核的组成架构
Chipscope_icon核的主要参数如表9-12所列。
表9-12 Chipscope_ila核参数列表

2)Chipscope_ila
Chipscope_ila核可以监控所有自定义信号,与Chipscope_icon核的连接关系如图9-116所示。不过,要在EDK综合前就选择期望监控的信号,这一点与ISE中ILA核的使用是不一样的,后者需要在综合后才能选择信号连接。

图9-117 EDK中ChipScope_lia核的连接架构
和ISE设计中的ILA核一样,Chipscope_ila核是调试中使用最多的一类核,其主要参数如表9-13所列。
表9-13 Chipscope_ila核参数列表

3)Chipscope_opb_iba
Chipscope_opb_iba是用于分析OPB总线的专用核。在EDK中,Xilinx公司建议不要使用Chipscope_ila核来分析总线信号,而专门提供了用于OPB总线信号分析的Chipscope_opb_iba核,可监控OPB总线的数据、地址以及控制信号总线,还可区分总线上的主、从设备。
Chipscope_opb_iba的连接结构如图9-118所示,通过MON_OPB来采样和监控OPB总线,所以其接口信号主要来自MON_OPB。

图9-118 Chipscope_opb_iba核的连接结构示意图
由于该核和OPB总线信号一一对应,使用前最好对OPB总线结构有一个大致的了解。该核在使用中非常简单,只需要直接将其和OPB总线连接起来即可,这里就不再过多介绍。
4)Chipscope_plb_iba
Chipscope_plb_iba核主要用于监控EDK系统中的PLB总线信号,其内部结构、接口参数和Chipscope_opb_iba核一样,只是将MON_OPB换成MON_PLB,这里就不再作介绍。
5)Chipscope_vio
Chipscope_vio是一种用户可定制的实时监控核,主要用于观察FPGA内部信号,和其余核不同的是,它不占用芯片内部的块RAM,可通过图形化界面配置,也可通过Tcl语言编写脚本,在网表级插入必要的监控点来实现。
由于Chipscope_vio核不使用块RAM,只能通过带宽有限的JTAG时钟来采样,因此不适合监控高速信号。
2.XPS中ChipScope核的应用实例
ChipScope的原理和使用方法已在第7章进行了详细的说明,因此下面直接给出XPS中ChipScope的应用实例,将上文内容有机地衔接起来。
例9-13 在XPS工程中插入ChipScope_icon/ila/iba核,完成设计的综合、实现与下载,并给出实际的采集结果。
1) 在XPS工程中添加和配置ICON核
在EDK中添加各个分析核主要通过参数配置的方式来完成,和ISE中的图形化操作相比,显得不太直观,但需设置的内容是一致的。
(1)添加、配置ChipScope_icon核
在EDK中使用Chipscope时,必须添加Chipscope_icon核,其位于“Debug”类IP列表中。打开XPS后,选中Chipscope_icon,点击右键,选择“Add IP”命令,将其添加到设计中,在“Bus Interface”窗口中,在Chipscope_icon上单击右键,选择“Config IP”命令,打开配置属性,如图9-119所示。

图9-119 Chipscope_icon核配置界面
本例计划采用1个Chipscope_ila核和1个Chipscope_opb_iba核,因此将“Number of Control Ports”设为2,其他设置保持不变,单击“OK”即可。再切换到Ports窗口,在“Net”列完成控制端口命名,由于选择了两个核,所以只需要为control0和control1命名。
(2)连接ChipScope_icon核
返回Ports窗口,展开Chipscope_icon核的端口。由于只添加了两个端口,因此只需在control0、control1通路行下拉框中选择chipscope_icon_0_control0、chipscope_icon_0_control0,即可完成ICON核的端口连接,如图9-120所示。

图9-120 Chipscope_icon核的端口连接界面
2)在EDK中添加和配置ILA核
(1)添加、配置Chipscope_ila核
Chipscope_ila核是使用最多的核,也位于“Debug”类IP列表中。该核有众多的参数需要配置,分为“Misc”和“Trigger”两大类。Misc参数是需要首先配置的,设置采样深度、信号位宽、是否将数据作为触发端口等表9-13所列的关键参数,用户可根据需求选择,其界面如图9-121所示。可以看出,Misc参数基本涵盖了ISE中ILA核的参数,各个参数的简要说明可查阅第7章中ILA核相关参数的说明。

图9-121 Chipscope_icon核MISC配置界面
其次,需要配置Trigger参数,其界面如图9-122所示。其中各类触发条件和ISE中ILA核的触发条件是一致的,且每个ILA可以配置4个触发断垣参数,本例只需要1个触发单元,因此只需要配置触发端口0。

图9-122 Chipscope_icon核触发条件配置界面
(2)连接Chipscope_ila核的端口
配置完毕并保存后,需要返回Ports窗口,展开Chipscope_ila核的端口,在CHIPSCOPE_ILA_CONTROLD行的Net列下拉框中选择chipscope_icon_0_control0,将其和ICON核联系起来。如果使用OPB总线的时钟采样所有数据和触发信号,可将CLK行的Net列的下拉框中选择sys_clk_s,如图9-123所示。在TRIG0行的Net列下拉框输入想要观测的信号,和ISE中ILA核相比,其不足之处在于:这里不能通过鼠标操作添加多组信号,只能手动输入,多个信号之间通过“&”连接。

图9-123 Chipscope_ila核端口连接界面
3)在EDK中添加IBA核
(1)添加、配置Chipscope_iba核
Chipscope_iba核的添加方法和Chipscope_ila的方法是相同的,只不过其配置比较麻烦,需要配置10个子窗口,其中部分配置内容和Chipscope_ila的含义是相同的,下面主要介绍OPB_Master和OPB_Slave界面。
OPB_Master页面主要配置OPB主设备的监控参数,在本例中OPB总线上只有1个主设备,因此Master0栏选择1;不使用匹配计数器,将其宽度设为0;其余配置参数如图9-124所示。

图9-124 Chipscope_iba核的OPB_Master配置界面
OPB_Slave页面主要配置OPB从设备的监控参数,在本例中只监控1个OPB从设备,因此Slave0栏选择1;不使用匹配计数器,将其宽度设为0;其余配置参数如图9-125所示。

图9-125 Chipscope_iba核的OPB_Slave配置界面
(2)连接Chipscope_iba核
配置完毕并保存后,需要返回Ports窗口,展开Chipscope_iba核的端口,在CHIPSCOPE_ILA_CONTROLD行的Net列下拉框中选择chipscope_icon_0_control1,将其和ICON核联系起来;在SYS_Rst行的Net列选择sys_rst_s信号,如图9-126所示。

图9-126 Chipscope_iba核端口连接界面
4)综合、实现
首先,选择“Hardware > Generate Netlist”命令,完成对硬件平台的综合;其次,选择“Hardware > Generate Bitstream”菜单命令,启动实现的过程,将NGC网表文件转化为硬件平台比特流文件;最后,选中“Device Configuration > Update Bitstream”命令,将编译所生成的可执行文件和硬件比特流合在一起,形成最终的二进制比特流文件,位于工程目录下的implementation文件夹中。
5)使用Chipscope Analyze采集数据
按照6.5.2节内容,利用Analyzer将生成的比特文件下载到FPGA中,设定触发条件后,iba核采集的数据波形如图9-127所示。

图9-127 Analyzer采集数据界面
读者需要注意的是,在Waveform窗口中,信号名称默认为DataPort[n],不易观察,因此需要从工程中通过导入iba核的.cdc文件辅助显示信号名。它位于工程目录下implementation/chipscope_opb_iba_0_wrapper目录中,文件名为cs_coregen_chipscope_ opb_ila_0.cdc。
9.5.8 软件平台SDK的使用
1.SDK图形界面
在嵌入式开发中,设计人员大部分时间是用来完成软件开发的,SDK为设计工程师提供了完备的软件开发环境。SDK的界面外观如图9-128所示,由窗口和菜单组成,从外形上看,SDK图形界面和微软公司的Studio界面非常类似,使用方法也很相近。

图9-128 SDK用户图形界面
窗口是SDK图形界面的主要部分,设计中80%的任务都是在窗口中进行的,调试和分析也在窗口中完成。如图9-128所示,主界面有4个常态窗口以及Windows程序常见的菜单和工具栏组成。4个常态窗口的介绍如下。
1)C/C++工程窗口
该窗口分为3个部分:二进制代码(Binaries),标识当前应用软件工程编译后生成的二进制文件的名称和类型;调试,记录编译调试用的信息,包括Makefile文件;源文件,包含加入工程的所有C/C++源文件和链接库。同时,通过右击该窗口的工程名称,可以设置该工程的属性、删除和增加文件。
2)源代码编辑窗口
源代码编辑窗口和大部分集成环境类似,此外还具备以下两个独特功能:双击任何一行的行号,可以在当前行设置/取消断点;在编译出错时,出错行的行标前会出现红叉标志错误。
3)大纲窗口
大纲窗口显示了工程的所有函数和所用到的库,单击任何函数,源代码编辑窗口会自动显示该函数体的源代码,便于用户浏览函数并修改函数的内容。
4)信息窗口
信息窗口主要用于调试阶段,帮助用户分析和定位错误,包括:问题窗口(Problems),显示编译阶段的所有错误;控制台窗口(Console),显示代码以及系统输出信息;属性窗口(Properties),显示当前工程的属性设置;XMD控制台,用于XMD实时调试的交互,可输入指令,也可显示调试信息;进程菜单(Process),显示SDK正在运行的操作情况;搜索窗口(Search),可查找字符,并返回查找结果。
另外,SDK支持团队开发。对于每个应用软件工程来讲,必须要先建立工作域,在共同的工作域中建立多个应用软件工程,从而达到共同开发的目的;对于单一工程师来讲,也需要遵循这一过程。
2.导入应用
运行SDK,导入/新建应用软件。这里,我们先导入运行BSB向导时所产生的应用软件。
1)选择“Software > Launch Platform Studio SDK”打开SDK。
2)打开SDK后,出现的向导将帮助用户创建软件应用工程。在向导的对话框里,选择“Import XPS Application Projects”,然后点击“Next”,如图9-129所示。(注:用户当然可以选择创建一个新的SDK应用)。对导入的XMP文件,即顶层的XPS工程文件,会自动告知SDK在硬件平台里使用的处理器,并为每个处理器提供一个指向库的指针。SDK只管理用户的应用软件;而XPS管理那些构成软件平台的库和驱动。

图9-129 导入XPS工程的自动向导示意图
如果此向导没有自动打开或者用户要更新XPS工程,可在SDK中选择“Xilinx Tools > Launch Application Wizard”命令打开向导,其界面如图9-130所示,且会显示所选工程是否标记为BRAM的初始化工程。

图9-130 在SDK中导入XPS工程示意图
3.创建工程以及调试代码
进入SDK界面后,选择“File”菜单下的“New”命令,进入工程建立窗口,如图9-131所示。设计人员可选择C语言应用软件工程、C++语言应用软件工程、CVS应用软件工程以及简单软件工程等4类不同的模版。

图9-131 SDK新建工程示意图
同时,SDK支持两种Makefile文件模式:自动生成和用户自定义。后者主要用于高级开发,对嵌入式系统初学者,一般选择自动生成模式比较稳妥。当用户应用代码文件众多时,需要其按类型、功能、模块分别放在若干个目录中,但这样手工管理非常不方便,因此通过makefile定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作将编译过程自动化。写好后,只需要一个make命令,整个工程完全自动编译,极大地提高了软件开发的效率。
4.XPS和SDK的数据交互
在EDK解决方案中,XPS可以直接将设计转移到SDK,但没有提供XPS直接读入已在SDK中调试成功的应用软件工程,可以说是EDK整体解决方案的一个遗憾。但是,作为一个嵌入式解决方案,必须将软、硬件程序最终生成一个二进制比特文件下载到FPGA/ Flash中,因此,下面介绍如何实现XPS和SDK的数据交互。
1)由XPS进入SDK
(1)手工交互
手动交互就是关闭XPS工程,然后打开SDK,通过导入向导将XPS设计的.xmp工程文件导入。
(2)自动交互
EDK提供了XPS到SDK的自动转换,因此该过程非常简单。在XPS中完成硬件开发后,直接点击“Software”菜单下的“Launch Platform Studio SDK”命令,直接进入SDK。
2)由SDK返回XPS
EDK没有提供自动将SDK工程读入XPS的功能,但SDK工具提供了应用软件的elf文件,因此XPS生成下载目标板文件只需要从elf文件中提取数据,不需要应用软件工程的其他支持。直接在XPS的工程名上点击右键,在出现的菜单中选择“Set Compiler Options”,打开编译属性衍生子窗口,修改生成的elf文件路径和名称,指向SDK生成的应用软件elf文件,单击“OK”保存设置后即可。这样XPS在生成比特文件时,会自动加入SDK生成的elf文件。需要注意的是,利用这种方法完成的交互,由于没有软件部分的源代码,因此所有的软件代码调试还需要在SDK中完成。
更多的时候,为了建立并运行仿真,用户需要回到XPS中。如前面介绍,利用SDK完成了软件开发工作后,需要在XPS中定义一些有关工程管理的问题:
- 必须指定用于BRAM初始化的应用程序。应用标签提供了这一功能;
- 为了和“Test_App_Peripheral”协调工作,XPS需要发现可能的工程管理冲突。由于这时我们还在利用SDK来管理这个软件工程,因此XPS将在工程例子中找到一个冲突;
这里可能出现一个问题:假设有两个用户操作这个XPS工程,一个使用XPS,而另一个使用SDK。那么,最后保存这个工程的用户将覆盖另一个用户的工作。为了避免这一情况的发生,XPS会指出可能的冲突并创建一个可以工作的稳定文件环境。由于更倾向于选择SDK作为软件工程管理者,因此XPS只需知道ELF文件的位置,这样就可以将其和之后的FPGA比特流进行合并。注意在XPS应用标签中还有其它的工程,在进行下一步的步骤前,用户需要确认在工程中是否存在下列部分: - 默认的ppc405_0_bootloop/Microblaze_0_bootloop工程。Bootloop工程启动处理器,并为其提供所需要的jump-to-address命令来寻找外部存储器。注意此bootloop工程不能用来初始化BRAM(可利用工程:Test_App_Peripheral来执行这一任务)。
- 由BSB向导创建的工程,包括:TestApp_Memory和TestApp_Peripheral工程。在前面介绍的BSB向导中,我们选择了测试存储器和其它的外围设备。在下面的步骤中,我们将选择并配置有关软件,这样就可以对其进行仿真并下载到FPGA或board存储器器件中。
- 在SDK中为用户定制的IP中增加测试软件
在SDK环境中,可以给先前创建的用户定制外设(test_ip)增加一些测试软件。整个过程包括:- 查找此核的软件测试文件;
- 用户将这些测试文件导入到应用工程TestApp_Peripheral中;
- 编辑“test_ip_selftest.c”文件,为“test_ip”核指明基地址(因为test_ip_selftest程序需要一个基地址指针)。用户可以参考xparameters.h文件获取这一信息;
- 重新创建工程(可以设置SDK来自动完成这一过程)。
下面通过实例来介绍如何为定制IP添加测试软件。
例9-14 本例实现在定制IP中增加测试软件的方法。
1) 需要导入软件测试文件。首先,点击SDK主窗口处的“C/C++ Projects”标签;其次,在“C/C++ Projects”面板中的“TestApp_Peripheral”工程处点击右键,选择“Import”;第三,在导入对话框中,选择“File system”。浏览顶层工程下的驱动器目录,找到TestApp_Peripheral/ src目录,最后选择所有的源文件,点击“Finish”。如图9-132所示。

图9-132 源文件选择窗口
2) 编辑“test_app_peripheral.c”文件。在“C/C++ Projects”标签中,找到“test_ip_ selftest.c”文件,双击打开此文件;“test_ip_selftest.c”文件包括了“TEST_IP_SelfTest”程序的功能定义,如图9-133所示。

图9-133 test_ip_selftest.c文件
其次,从图中可以看到,“TEST_IP_SelfTest”程序需要一个基地址指针。用户可以按照如下步骤在“xparameters.h”中找到“TEST_IP”的基地址值:在“C/C++ Projects”标签中,打开“ppc405_0_sw_platform/ppc405_0/include”目录以便显示“xparameters.h”文件,双击“xparameters.h”,在编辑窗口打开此文件。查找“TEST_IP_0_BASEADDR”。这样,设计人员就得到了基地址定义信息,在为“TestApp_Peripheral.c”文件增加功能时需要利用此信息。
最后,在“TestApp_Peripheral.c”文件中,在最后的打印语句前插入代码如下:
TEST_IP_SelfTest(XPAR_TEST_IP_0_BASEADDR);
3) 重建工程。如果选择了“Build automatically”选项(在Project工具栏中),在保存“TestApp_Peripheral.c”文件时,工程就自动得到更新。如果没有选定此选项,那么选择“Project > Build Project”。完成创建后,可以看到在“TestApp_Peripheral”工程下创建了Debug目录。工程的ELF文件即位于这个目录中,在之后的测试驱动时我们将使用该ELF文件。此时用户完成了SDK中所需要的所有工作。
4) 利用“C/C++ Build”的配置设定,用户可以控制所建立的工程类型。用户可以在SDK中选择“Help > Help Contents”,利用其中的“C/C++ Development User Guide > Reference > C/C++ Project Properties > Managed Make Projects > C/C++ Build > Build Settings”得到更多的帮助信息。
5)返回XPS完成最终测试。首先,在XPS中,选择“Applications”标签;其次,在“Project:TestApp_Memory”上点右键,去掉初始化BRAMs的选项(我们将利用“TestApp_Peripheral”来进行这一工作)。最后利用XPS来管理数据,在TestApp_Peripheral工程中将利用这些数据来初始化BRAMs。在SDK中创建了TestApp_Peripheral工程后,XPS将认为用户正利用SDK中管理此工程。为了操作TestApp_Peripheral工程,XPS需要用户将其改变为ELF-only的工程。双击“Project:TestApp_Peripheral”打开如图9-134所示的对话框。

图9-134 XPS ELF文件管理选项
6)选择“Convert XPS application into an ELF-only application”。点击OK后,XPS会继续管理初始化BRAM所用到的数据,但将软件工程管理功能转移给SDK。在“Project: TestApp_Peripheral”工程上右键菜单中,选其为初始化BRAMs的工程。此时用户可以看到在“Mark to Initialize BRAMs”边上有打勾的标记,如图9-135所示。

图9-135 选择初始化BRAM的工程
7)在应用标签中,选择TestApp_Peripheral工程右键菜单中的Executable选项。在“\SDK_projects\TestApp_Peripheral\Debug”目录中查找SDK生成的ELF文件(在前面的例子中,SDK工具已将此ELF文件放在Debug目录中)。
现在软件和硬件部分都已创建,接下去的工作就是对它们进行测试。可以通过下载到实际的硬件电路板完成。由于硬件电路板的多样化,限于篇幅,这里就不再介绍。


