【转载】"30年---我与赛灵思FPGA的故事”:ZYNQ-7000使用总结(2)——PS部分的使用
ZYNQ-7000包括PS和PL两部分,其中你可以只使用PS部分,而不用PL部分,这样可以认为你在单纯的使用一个ARM Cortex A9 MPore芯片。更多的情况下,我们会将PS和PL部分联合使用,不然也就失去了使用ZYNQ芯片的意义。但是,为了更好的理解和学习ZYNQ,我们先讲一个只使用PS部分的例子,这样可以更快的掌握工具的使用和开发流程。
和大多数教程一样,我们这里实现一个在串口输出“Hello World”的程序(如果你刚开始接触ZYNQ,强烈推荐看这一篇文章,因为我会配很多图做非常详细的说明,后续的文章就不会这样详细的说明了)。
设计流程
打开PlanAhead,选择“Create New Project”,接下来按图中所示进行选择即可:
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12706-1.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12707-2.png)
设置工程名和工程位置,这里为“demo_ps”,位置如图所示。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12708-3.png)
工程类型选择“RTL Project”,并勾选下面的复选框。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12709-4.png)
这里选择硬件平台,本实验所用的是zc702,选择结果如下图:
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12710-5.png)
注:这里在选择硬件平台的时候,有两种方法,一种是在“Parts”选项里面选,这里面会有六个选项去选择。也可以在“Boards”里面选,这个里面只有三个选项,推荐在这个里面确定自己的硬件平台。而且根据我的测试,如果这里在“Parts”里面选择硬件平台后,后面不会出现“BSB
Wizard”,但是在后者里面选的话,就会出现。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12711-6.png)
选择好以后,这里是工程的整个信息,确认没有问题后点击“Finish”。然后就会进入工程页面,现在整个工程是空的,我们需要加入内容。点击左边的“Add Source”:
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12712-7.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12713-8.png)
选择“Add or Create Embedded Source”,下一步以后,选择“Create Sub-Design”,创建子系统,这里起名为“system”,点“OK”,然后Finish。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12714-9.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12715-10.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12716-11.png)
这里让我们选择是否添加“Processing
System7”实例。刚才说过,我们创建的子系统工程是的,这里我们首先需要往里面加入一个处理器。如果选择“Yes”,就出出现“BSB
Wizard”,引导我们加入处理器实例。如果选择“No”,就需要我们手动加入。因为加处理器IP的方法和加其他IP核的方法是一样的,这里我选择“No”手都加入(如果你选择的是“Yes”,那出现BSB
Wizard之后,保证所有的默认值,在最后一步移除GPIO_SW、LEDs_4Bits两个外设模块,然后确定就可以了)。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12717-12.png)
选择了“No”以后,会出现上图这样,然后我们在右边的“IP Catalog”中的“Processor”类下选择“Processing System”,右击选择“Add IP”,弹出下面的确认框,选择“Yes”。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12718-13.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12719-14.png)
如上图,我们已经将处理器IP核加入我们这个工程。然后选择“Zynq”选项卡,会出现下图,图中所示的东西就是我们刚才加的处理器IP核,但是默认他是没有配置的,也就是说所有的资源或特性是没有使用的。这里我们点击“Import”,然后会出现系统自带的多个模板,这里我们选择第二个,即ZC702的模板,点击“OK”,会弹出一个确认框,告诉我们处理器IP配置会更新,选择“Yes”。然后过一会,新的配置过的处理器IP核就生成了。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12720-15.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12721-16.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12722-17.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12723-18.png)
我们对比这个配置后的图和前面没有配置的图会发现颜色不一样。配置过的都会以其他颜色显示,没有配置也即没有使用的都会默认是灰色。点击那个“I/O Peripherals”,我们就可以看见那些在用的前面的确有打勾。如下图:
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12724-19.png)
然后我们,关闭XPS,回到PlanAhead。会发现PlanAhead里面的“Design
Sources”下面多出了一个“system.xmp”文件,这个就是我们刚才在XPS里面配置的处理器系统。但是还没有完,因为没有将这个系统的对外接口留出来。右键点击“system”,选择“Create
Top HDL”,便会生成一个“system_stub.v”文件,打开这个文件,
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12725-20.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12726-21.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12727-22.png)
我们可以看见这个文件里面就是我们刚才配置过的处理器子系统。具体内容的含义以后再讲解。这里我们不需要做任何修改。然后我们在菜单栏选择“File”——“Export”——“Export Hardware for SDK”,出现下图:
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12728-23.png)
这里我们把“Launch SDK”勾掉。这个是我使用的SDK 14.4的bug,如果不勾掉,它会自动打开SDK,但是却找到到编译工具链。如果你使用SDK14.4以后的版本,可以勾选该选项,会直接将工程导入到SDK,并自动打开SDK。因为这里有这个bug存在,我们后面需要手动将导出去的硬件平台导入到SDK中。然后点击OK,会将我们刚才配置的硬件平台导出到我们的工程目录下,我这里的目录为“E:\FPGA\workspace\xilinx\demo_ps\demo_ps.sdk\SDK\SDK_Export\hw”。
打开SDK,选择“File”——“New”——“Application Project”,出现下图:
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12729-24.png)
在“Target Hardware”中选择“Create
new”,出现下图,选择“Browse”,定位到刚才的导出目录,在“hw”文件夹下会有一个“system.xml”文件,选择该文件,其他部分会自动填充,默认的名字为“system_hw_platform”,确认后,会返回到我们刚才创建应用工程的地方,但是硬件平台部分已经是我们刚才导入的硬件平台,如后面的图所示:
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12730-25.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12738-26.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12731-27.png)
然后我们这里选择给应用工程起名“hello_world”,默认的BSP名为“hello_world_bsp”,这里不用修改。然后点击“Next”,出现下图,选择“Hello
World”模板,点击“Finish”。当然还有其他模板,大家可以自己研究研究。那个LwIP的模板不错,特别适合网络通信。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12732-28.png)
工程建立好以后,默认会自动编译,如果是严格按照我说的来的话,编译不会出错。至此,我们整个项目就算完成了。如下图,主要包括三大部分:硬件平台system_hw_platform、BSP文件hello_world_bsp、应用程序hello_world。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12733-30.png)
要运行这个程序,我们需要进行如下设置:右键点击“hello_world”——“Run As”——“Run
Configurations”,出现下图,双击“Xilinx C/C++
ELF”,便会出现下图这个页面。连接好开发板(开发板如何连接,参考官方文档,这里不做介绍),打开串口终端,点击“Run”,便会输出“Hello
World”。至此,整个设计流程就完了。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12734-32.png)
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12735-33.png)
文件、代码分析
运行成功以后,我们不妨打开system_hw_platform下面的“system.xml”文件,如下图,可以看出这里有我们前面在XPS中配置过的模块,并且都有对应的地址。另外,硬件平台下的ps7_init.c和ps_init.h文件主要是一些硬件的初始化:比如DDR、clocks、plls、MIOs等,硬件初始化后,应用程序就可以在硬件上顺利运行了。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12736-34.png)
然后我们再打开“hello_world_bsp”下的“system.mss”文件,如下图,这个是我们的BSP的信息,有的模块后面还有文档和例子。主要是一些驱动方面的例子和文档。
![](http://xilinx.eetrend.com/files-eetrend-xilinx/blog/201406/7287-12737-35.png)
需要说明的是,BSP是SDK根据我们的硬件平台自动生成的(确切的说是根据system.mss自动生成的)。如果我们需要修改BSP,那么不能单纯的修改BSP里面的某个源文件,因为编译的时候这些文件都会重新生成,所以直接修改是没有用的,必须修改system.mss文件才可以。不过大多数情况下是不需要修改BSP文件的。这一部分在后面的文章中会做更多的说明,这里不再详述。
然后我们分析一下我们应用程序的代码。使用自带的“Hello
World”模板,会生成四个源文件:helloworld.c、platform_config.h、platform.c、platform.h。其实,对于我们这个例子来说,只需要helloword.c文件就行了。你可以将helloworld.c里面的“init_platform();”语句注释掉,那么main函数里面就只有一个打印语句,程序仍然可以正常运行。这里之所以会有其他文件,主要是如果你使用的是Microblaze等平台的时候会有用。
/*
* helloworld.c: simple test application
*/
#include
#include "platform.h"
void print(char *str);
int main()
{
init_platform();
print("Hello World\n\r");
return 0;
}
关于BSP——BSP全称board support package,一般翻译为板级支持包,它主要是在系统上电后进行一些基本的初始化,BSP一般是和特定的硬件平台以及操作系统相关的。在大多数情况下,BSP里面会包含大部分的驱动程序。
关于Standalone OS——我们刚才的这个例子是运行在裸机下的,也就是没有操作系统的。此时这个Standalone OS就充当了一个“操作系统”,它实质是一个简单的低级软件层。他主要是提供一些访问处理器特性的接口,比如caches、中断、异常、基本输入输出、系统配置等。它是单线程的。
至此,所有的设计就算完了。在这个例子中,我们只用到了PS部分,PL部分,也即FPGA部分并没有使用。我们可以看出,整个设计流程为:先在PlanAhead里面建立工程,然后在这个工程中建立一个处理器系统工程,建好后,会自动打开XPS。在XPS中,我们会配置这个处理器系统,这里我们没有自己配置,而是直接调用了一个模板,大家可以参考Xilinx的一些官方文档,自己配置一些模块试试。配置好以后,我们重新回到PlanAhead中,创建顶层的HDL文件,然后整个硬件平台就算搭建完了。我们将这个硬件平台导出到SDK中,就可以在SDK中利用这个硬件平台进行应用开发了。而且Xilinx SDK会自动帮我们生成BSP文件,极大的减小了我们的工作量。
转载自:http://xilinx.eetrend.com/blog/7287