第9章ZedBoard入门前面大家已经对ZYNQ架构以及相应的开发工具有一定的认识,接下来我们将带领大家来一起体验ZYNQ,体验软硬件协同设计的魅力。由于时间的关系,下面的一些实验(本章及后续章节的实验)可能有不完善的地方,欢迎读者向我们反馈。9.1跑马灯本实验将指导大家使用Vivado集成设计环境创建本书的第一个Zynq设计。这里,我们使用跑马灯这个入门实验来向大家介绍VivadoIDE的IPIntegrator环境,并在Zedboard上实现这个简单的Zynq嵌入式系统。之后,我们将会使用SDK创建一个简单的软件应用程序,并下载到Zynq的ARM处理器中,对在PL端实现的硬件进行控制。本实验分为三个小节来向大家进行介绍:第一节我们将使用VivadoIDE创建一个工程。在第一节的基础上,第二节我们将继续构建一个Zynq嵌入式处理系统,并将完成后的硬件导入到SDK中进行软件设计。最后一节我们将使用SDK编写ARM测试应用程序,并下载到ZedBoard上进行调试。实验环境:Windows7x64操作系统,Vivado2013.4,SDK2013.49.1.1Vivado工程创建1)双击桌面Vivado快捷方式,或者浏览StartAllProgramesXilinxDesignToolsVivado2013.4Vivado2013.4来启动Vivado.2)当Vivado启动后,可以看到图9-1的GettingStarted页面。图9-1Vivado开始界面3)选择CreateNewProject选项,图9-2所示的NewProject向导将会打开,点击Next。图9-2NewProject对话框4)在ProjectName对话框中,输入first_zynq_design作为Projectname,选择C:/XUP/Zed作为Projectlocation,确保Createprojectsubdirectory被勾选上,如图9-3,点击Next。图9-3ProjectName对话框5)在ProjectType对话框中,选择RTLProject,确保Donotspecifysourcesatthistime选项没有被勾选,如图9-4,点击Next。图9-4ProjectType对话框6)在AddSource对话框中,选择Verilog作为目标语言,如果你对VHDL熟悉的话,你也可以选择VHDL,如果这里你忘记了选择,在工程创建完成后,也可以在工程设置中选择你熟悉的HDL语言。如果你已经有了源文件,在这里就可以选择Addfile或者Adddirectory进行添加,由于我们没有任何的源文件,所以这里我们直接点击Next即可,如图9-5。图9-5添加源文件7)在AddExistingIP对话框中,点击Next。8)在AddConstraints对话框中,点击Next。9)在DefaultPart对话框中,在Specify框中选择Boards选项,在下面的Board列表中选择ZedBoardZynqEvaluationandDevelopmentKit,点击Next,如图9-6。图9-6芯片选择10)在NewProjectSummary对话框中,点解Finish完成工程创建,至此,我们已经使用Vivado创建了一个Zynq设计的工程框架,图9-7为Vivado的工程界面,在第四章我们已经对该界面进行过介绍,如果还不熟悉的读者再回到前面复习一下。下面我将使用FlowNavigator的IPIntegrator功能完成第二节的嵌入式系统设计。图9-7Vivado工程界面9.1.2在Vivado中创建Zynq嵌入式系统这一节我们将创建一个简单的Zynq嵌入式系统,该系统使用ZynqPL部分实现一个通用I/O控制器(GPIO),控制器同ZedBoard上的8个LED相连接,并且通过AXI总线连接到PS端,这样我们就可以通过将要在第三小节中实现的ARM应用程序来对LED进行控制。系统结构图如图9-8所示。ZYNQPSAXIGPIODevelopmentBoardZYNQPLAXI图9-8系统结构图1)创建一个BlockDesign。在FlowNavigator窗口中展开IPIntergrator,选择CreateBlockDesign,如图9-9。图9-9创建BlockDesign2)在BlockDesign对话框中输入zynq_system_1作为Designname,如图9-10,点击OK继续。这时,在workplace区域将会打开IPIntegrator的图表画布,我们将在这个空白区域中像画画一样的构建自己的系统。这里操作的最小单位是IP核,Xilinx官方还有一些第三方机构给我们提供了很多的免费IP核,你可以直接在这里添加使用,当然,用户也可以自定义自己的IP核,然后添加到工程中使用,或者提供给其他用户使用,在13章第一节我们将会向大家介绍如何制作自己的IP核。图9-10输入设计名称3)在空白画布中,右键空白区域,并选择AddIP选项,或者点击画布最上方的绿色提示信息中的AddIP链接,如图9-11。4)这时一个IP核列表将会弹出,在Search一栏输入Zynq,在搜索结果列表中双击ZYNQ7ProcessingSystem添加PS端的IP核到画布中,如图9-12所示。由于我们使用的是ZedBoard,这一步完成后Vivado会对Zynq处理器进行相应的配置。同时在IDE的下面,选择TCLConsole你将看到如下的信息,其实我们在Vivado图形化界面所做的所有操作都将转化为TCL命令来执行。create_bd_cell-typeip-vlnvxilinx.com:ip:processing_system7:5.3processing_system7_0图9-11添加IP图9-12添加PSIP核在空白画布中,可以看到ZYNQ7ProcessingSystem被以图形化的方式添加进来,当前的IP模块是一个初始化界面,如果要使这个模块能在ZedBoard工作起来,首先对其进行相应的配置。5)双击ZYNQ7ProcessingSystem模块,打开其配置界面,如图9-13所示,首先先来熟悉一下这个界面。Documentation:提供该IP模块相关的文档帮助。PageNavigator:这里提供了该IP模块的详细配置列表。ZynqBlockDesign页面显示了ZYNQ7ProcessingSystem的总体概貌,我们可以通过点击绿色部分对相应的模块进行查看或者配置;PS-PLConfiguration页面提供了PS到PL的相关接口配置信息以及PS部分一些配置信息;PeripheralI/OPins页面主要是对一些通过外设接口的配置;MIOConfiguration页面主要是对MIO以及EMIO的分配控制。ClockConfiguration页面主要是对PS端时钟资源的配置及管理。DDRConfiguration页面主要是对DDR控制器一些参数的配置。Interrupts页面主要是对中断进行配置管理。Presets:这里主要提供了一些开发板的预定义配置功能,Vivado将会按照已经设置好的配置信息来对该IP核进行配置,而不需要我手动的来配。点击该按钮,我们可以看到Vivado现在已经支持的开发板有Microzed、ZC702、ZC706、ZedBoard以及一个Default配置选项。ImportXPSSettings:这个功能主要是将XPS中的ZYNQ7ProcessingSystem的配置信息导入进来,其实就是导入一个xml文件。由于我们使用的是ZedBoard开发板,且只用到Vivado提供的默认配置,所以这里选择PresetsZedboard,点击OK来完成对ZYNQ7ProcessingSystem的配置。下一步我们将要连接PS端的DDR与FIXED_IO接口到顶层接口。6)左建选择ZYNQ7ProcessingSystem模块上的DDR接口,当光标变成笔装的时候右键并选择MakeExternal,如图9-14,对于FIXED_IO使用同样的方法。13425图9-13ZYNQ7ProcessingSystem界面注:5、6两步更加简单的方法是点击Diagram顶端的RunBlockAutomation设计协助链接来完成对ZYNQ7ProcessingSystemIP核的配置并将DDR与FIXED_IOMakeExternal,如图9-15所示。当选择/processing_system7_0的时候,相应的IP核图形界面会变成高亮显示,表示其已被选中,并将会被自动配置。在弹出的RunBlockAutomation对话框中确保ApplyBoardPreset被勾选,否则其只会将DDR与FIXED_IO连接到顶层端口,而不会对ZYNQ7进行默认配置。如果你在手动完成了ZYNQ7的配置又要使用RunBlockAutomation这个功能,那么一定要确保ApplyBoardPreset选项没有被选中,否则它将会使用默认配置来覆盖你原来的配置。图9-14MakeExternalInterface操作图9-15RunBlockAutomation-ZYNQ当完成了ZYNQ7ProcessingSystemIP核的添加并对其进行配置后,你的BlockDesign应该如图9-16所示。下面将添加AXIGPIOIPcore到系统中,该IP核被放在PL端,通过AXI总线同ARM相连接,并通过GPIO接口控制ZedBoard上的8个LED小灯。我们将使用IPIntegrator的设计协助工具来将AXIGPIO连接到PS端。图9-16ZYNQ7ProcessingSystem外部连接7)右键Diagram窗口的空白区域,在弹出的菜单列表中选择AddIP选项,在搜索栏中输入GPIO,并在搜索结果列表中双击AXIGPIO将该IP添加到系统中。8)在Diagram窗口顶部点击RunConnectionAutomation链接,并选择/axi_gpio_0/S_AXI选项,这时可以看到GPIOIPcore的S_AXI接口被高亮显示,如图9-17,点击OK完成。图9-17RunConnectionAutomation-GPIO这时可以看到有两个新的IP模块自动被添加了进来:ProcessorSystemReset:这个IP提供一个定制化的Reset功能,包括所有外设,互联以及处理器生。AXIInterconnect:提供AXI总线互联控制,它将PL端外设同PS端连接起来。9)同样点击RunConnectionAutomation链接,并选择/axi_gpio_0/GPIO,RunConnectionAutomation对话框将被打开,在SelectBoardInterface的下拉菜单中选择leds_8bit选项,点击OK,如图9-18所示。图9-18RunConnectionAutomation-GPIO注:当使用如上的方式来对GPIOMakeExternal时,Vivado会自动在系统中添加约束文件,将GPIO连接到ZedBoard的LED引脚上。10)当完成上面一步,在Diagram中应该看到如图9-19所示的画面。图9-19ModuleConnectSystem11)IPIntegrator将会自动为挂在AXI总线上的逻辑设备分配地址空间,这样ARM才可以寻址到PL端的逻辑设备。选择AddressEditor选项,并展开Data,如图9-20。可以看到IPIntegrator已经为AXIGPIO分配了64K的地址空间,基地址为0x41200000。由于ARM是统一编址的,所以在编写ARM程序的时候就可以像读写内存一样直接对该地址进行读写,从而实现对该IP核的控制。图9-20地址编辑器12)保存工程:Ctrl+S13)在Diagram窗口的左面工具栏中选择ValidateDesign按钮检测设计的有效性。这个操作将会调