《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 解决方案 > 如何通过创建自己的外设来提高Zynq SoC的处理速度

如何通过创建自己的外设来提高Zynq SoC的处理速度

2013-09-22
关键词: SoPC Zynq SOC

Zynq SoC架构的主要优势之一就是能够通过在器件的可编程逻辑内构建外设来加快处理速度。

这是Adam Taylor 计划编写的Zynq-7000 All Programmable SoC实际操作教程系列的第三部分。前两部分教程分别刊登在《赛灵思中国通讯》第47期和48期。Adam 经常为《赛灵思中国通讯》撰稿,同时他还为All Programmable 星球社区撰写博客 ( www.programmableplanet.com )。

赛灵思 Zynq™- 7000 All Programmable SoC真正的重要优势之一就是能够通过在可编程逻辑(PL)侧构建外设来提高器件处理系统(PS)侧的性能。最初您可能会认为这将是一项比较复杂的工作,但是,创建自己的外设其实很简单。

如果您试图提高PS的性能或者使用PS来控制PL侧的设计行为,那么在PL内添加外设会起到很大的帮助。例如,PS可能会使用一系列存储器映射寄存器来控制PL内的设计运行或选项。

我们选择一种简单模块作为设计实例,该模块用于打开和关闭ZedBoard上的存储器映射LED。我们将使用赛灵思PlanAhead™、XPS和软件开发套件(SDK)工具分三步来创建该模块。

1. 在嵌入式开发套件(EDK)环境中创建模块。

2. 为模块编写VHDL程序并构建系统。

3. 编写使用最新定制模块的软件。

在EDK中创建模块

要创建自己的外设,首先需要从包含Zynq SoC设计的PlanAhead项目中打开Xilinx Platform Studio (XPS) ,并选择菜单选项中的“hardware->create or import peripheral” 。

对我们的实例模块而言,ZedBoard上的7个LED应展示出walking display的效果,除了最重要的那个LED必须在软件应用控制下点亮以外,其他都可以依次相继点亮。尽管这并不是最棒的定制模块应用,但对于流程演示 而言是一种非常有用且简单的实例。一旦掌握了这个流程,您将掌握实现更复杂模块所需的全部知识。

创建外设时只需相继打开10个简单窗口并选择所需的选项。

前两个截屏(如图1所示)询问是否需要创建外设或导入现有的外设,如果是,需要将其关联到哪个项目。下一步,您可在第三个截屏中对模块进行命名并高效地定义版本和修订版本。(注意:可利用外设流程底部的选项通过回读*.cip文件来重新定制已创建的模块。)

选定模块名称后,接下来要选择所需AXI总线类型,如图2所示。我们的实例设计需要的是一种简单的存储器映射控制寄存器型接口,因此我们选择了最上面的AXI4-Lite选项。(如需了解有关不同AXI总线类型的更多信息,敬请访问: http://china.xilinx.com/support/docu- mentation/white_papers/wp379_AXI 4_Plug_and_Play_IP.pdf )。在这个步骤中将创建众多简单寄存器。我们可利用处理系统通过AXI总线对寄存器进行读/写操作。

这些寄存器位于Zynq SoC上的可编程逻辑架构中,因此也能通过用于创建外设功能的用户逻辑应用来访问。

接下来的六个截屏为您提供相应选项,以便对AXI的主配置或从配置以及您将用于控制用户逻辑和支持文件的寄存器的数量进行定制。本例中我们仅使用一 个寄存器,并将其用作AXI-Lite的从配置。简化系统开发的最重要方法是选择外设实现支持标签上的“generate template driver files”选项。这样就能提供一系列有助于所创外设内部通信的源文件和头文件。

最后一步,XPS会生成一系列有助于创建和使用新外设的文件:

• 以您的外设命名的顶层VHDL文件

• 可在其中创建用户逻辑的VHDL文件

• 微处理器外设描述文件:用于定义连接模块的接口,以便将模块与XPS配合使用

• CIP文件:必要时可对外设进行重新定制

• 针对SDK的驱动程序源文件

• 针对SDK的实例源文件

• 微处理器驱动程序定义文件:详细描述外设所需的驱动程序

这些文件将在PlanAhead源目录(即本例中的zed_blog.srcs\ sources_1\edk\proc_subsystem)下创建。

源目录的子目录是包含XPS和PlanAhead所需文件(在与外设同名的目录下)的Pcores目录以及包含SDK所需文件的驱动程序目录。

创建RTL

在Pcores目录中您可以看到两个文件,其中一个与您所创建的组件同名(本例中为led_if.vhd),另一个文件名为
user_logic.vhd。您可在user_logic.vhd这个文件中进行设计创建。同时您将会发现向导已经帮您生成了用于通过AXI总线在此文 件中进行通信所需的寄存器和接口。此外,您可在led_if.vhd文件进行用户逻辑模块实例化。因此,对user_logic.vhd实体所做的任何修 改都必须传送到端口映射中。如果要求使用外部端口(例如我们的设计实例就需要外部端口来点亮LED),还必须传送对led_if.vhd实体所做的修改。

逻辑设计创建完成后,您可能希望对逻辑进行仿真以确保达到预期效果。在Pcores/devl/bfmsim目录下为您提供了总线功能模型。

在XPS中使用您的模块
在创建了VHDL文件或其它文件并确保它们能正常运行后,您将期望在XPS项目中能够应用此模块。要正确地做到这点,需要在VHDL设计过程中确保准备添加的端口使用最新的微处理器外设描述(MPD)文件。

通过在XPS中编辑MPD文件可以顺利完成这一任务。可在Project Local Pcores->USER->core name目录下找到您所创建的外设。右击文件名就可以查看MPD文件。

您需要添加设计中包含的非AXI接口,以便查看并在XPS中正确处理I/O。可通过以下链接查看MPD文件的语法: http://china.xilinx.com/support/docu-mentation/sw_manuals/xilinx14_4/psf... ,如图3所示,语法非常简单明了。图中突出显示的行(即中间列表底部第59行)就是用于将LED输出端口连接到模块的语句。

对MPD文件进行更新后必须点击“rescan user IP repositories”,以确保将修改内容载入XPS。这时就可将器件导入系统,就像来自IP库中的任何其他外设一样。一旦将其放入您希望的地址空间 内(注意:最小4K)并按要求将输出连接到外部端口,就可在必要时运行设计规则检查程序。如果没有任何错误,就可关闭XPS并返回PlanAhead。

返回PlanAhead环境后,需要重新生成顶层HDL。为此,右击您所创建的处理器子系统并选择“create top HDL”选项(参考《Xcell杂志》第82期,了解有关创建Zynq SoC PlanAhead项目方面的内容)。如果已对设计的I/O管脚进行更改,那么在实现之前的最后一步就是修改PlanAhead中的UCF文件。如果您对 管脚满意,就可以执行实现操作,并生成随时可在SDK中使用的比特流。

在SDK中使用外设
到这一步时,我们已经做好了在软件环境中使用外设的准备。与创建和实现任务一样,该流程也非常简单直观。第一步是使用PlanAhead中的 “export hardware for SDK”选项将硬件导出至软件开发套件。接着打开SDK,并检查MSS文件以确定您所创建的外设已经存在。所列外设名称应与旁边的驱动程序名称相同;

在第一个实例中,驱动程序被命名为“通用”。在SDK中使用外设时,通用驱动程序便不是问题。如果您想使用它,就需要涵盖头文件#include "xil_io.h."。这样就可以调用函数Xil_in32(地址)或Xil_out32(地址),以便对外设进行读写操作。

采用这种方法时,需要了解外设的基地址(在xparameters.h中给出)以及寄存器间的偏移地址。在这种情况下,由于本设计实例采用32位寻 址,因此寄存器的间隔为0x04。但是,如果在使用XPS创建外设时选择了“驱动程序-创建”选项,那么将为您的外设专门构建单独的驱动程序。且该驱动程 序也将位于PlanAhead源目录的驱动程序子目录中。

可用这类专门构建的驱动程序来代替设计中的通用驱动程序,但首先您必须设置软件库指向该目录,以便查看新生成的驱动程序。可根据“Xilinx Tools ->Repositories menu”菜单定义该软件库(图4)。

一旦设定的软件库指向正确的目录后,就可以对软件库进行重新扫描并关闭对话框。紧接着,是选择新驱动程序以更新板支持包。右击Project Explorer下的BSP图标,打开板支持包设置。点击驱动程序标签,您将看到包含所有外设及其驱动程序的列表。从适用于该器件的驱动程序列表中选择相 应的驱动程序,就可以修改选择的外设驱动程序(图5)。

通过名称为外设选择驱动程序并点击OK。如果您选择了自动编译选项,那么将会重新编译项目。一旦代码被重新构建,那么就要做好利用所提供的驱动程序与外设进行通信的准备。

您需要在源代码中加入驱动程序头文件#include "led_if.h",并采用来自xpara-meters.h的外设基地址使接口能够明确外设在存储空间中的位置。然后,调用“include” 文件中驱动程序所提供的命令就比较简单了。在我们的设计中,调用示例如下
LED_IF_mWriteSlaveReg0(LED_
ADDR, LED_IF_SLV_REG0_OFF-
SET, 0x01);

写入此命令后,就可以在硬件环境中对软件进行测试并确认其是否按预期正常运行。

正如您所看到的,在Zynq SoC 设计中创建自己的外设并非您最初想象的那么复杂。外设的创建能为您的Zynq SoCPS乃至最终整个解决方案带来诸多优势。