ZYNQ之输出“Hello World”第一步Vivado 工程建立创建一个名为“ps_hello”的工程建立过程不再赘述参考“PL 的”Hello World”LED 实验”。点击“Create Block Design”创建一个 Block 设计也就是图形化设计。“Design name”这里不做修改保持默认“design_1”这里可以根据需要修改不过名字要尽量简短否则在 Windows 下编译会有问题。点击“Add IP”快捷图标。搜索“zynq”在搜索结果列表中双击“ZYNQ7 Processing System”6) 双击 Block 图中的“processing_system7_0”配置相关参数。7) 首先出现的界面是 ZYNQ 硬核的架构图可以很清楚看到它的结构可以参考 ug585 文档里面有对 ZYNQ 的详细介绍。图中绿色部分是可配置模块可以点击进入相应的编辑界面当然也可以在左侧的窗口进入编辑。 下面对各个窗口的功能一一介绍。8) 接下来是 PS-PL Configuration 界面这个界面主要是进行 PS 与 PL 之间接口的配置主要是 AXI 接口这些接口可以扩展 PL 端的 AXI 接口外设所以 PL 如果要和 PS 进行数据交互都要按照 AXI 总线协议进行 xilinx 为我们提供了大量的 AXI 接口的 IP 核。9) 之后进入 PS 端外设的配置阶段一开始接触 ZYNQ 可能会很疑惑看到密密麻麻的外设无从下手。这里解释一下 ZYNQ 的 PS 端外设很多是复用的相同的引脚标号可以配置成不一样的功能比如下图中的 16-27 可以配置成 Enet0也可以配置成 SD0、 SD1但只能配置成一种外设比如如果配置 Enet0也就不能再选择 SD0、 SD1 了。至于该怎么去选择是由原理图和 PCB 决定的可以通过查看原理图或用户手册选择。10) 从原理图中我们可以找到串口连接在 PS 的 MIO48-MIO49 上所以在“Peripheral I/OPins”选项中使能 UART1MIO48 MIO49 PS 端 MIO 分为两个 Bank Bank 0 也就是原理图中的 BANK500电压选择“LVCMOS 3.3V” Bank 1也就是原理图中的 BANK501电压选择“LVCOMS 1.8 V”。 如果不配置 Bank1 电平标准可能导致串口无法接收。11) 配置 QSPI QSPI 可以作为 ZYNQ 的启动存储设备 ZYNQ 可以通过读取 QSPI 中存储的启动文件加载 ARM 和 FPGA从原理图得知我们选择 Quad SPI Flash 为 Single SS 4bit IO。12) 配置以太网在 PS 端设计有以太网接口根据原理图选择 Ethernet 0 到 MIO16-MIO27。MDIO 为以太网 PHY 寄存器配置接口选择 MDIO 并配置到 MIO52-MIO53。配置 USB0 到 MIO28-MIO39。除了 QSPI 启动 ZYNQ还有 SD 卡模式启动 ZYNQ选择 SD 0配置到 MIO40-MIO45选择 Card Detection MIO47用于检测 SD 卡的插入。打开 GPIO MIO PS 便可以控制剩余未分配的 MIO用作 GPIO在 GPIO MIO 中选择 MIO46 作为 USB PHY 的复位。1.2.2 MIO 配置修改 Enet0 的电平标准为 HSTL 1.8V Speed 为 fast这些参数非常重要如果不修改网络可能不通。其他部分保持默认。1.2.3 时钟配置在“Clock Configuration”选项卡中我们可以配置 PS 时钟输入时钟频率这里默认是33.333333和板子上一致不用修改 CPU 频率默认 666.666666Mhz这里也不修改。同时 PS 还可以给 PL 端提供 4 路时钟频率可以配置这里不需要所以保持默认即可。还有 PS 端外设的时钟等也可以进行配置这里保持默认。1.2.4 DDR3 配置在“DDR Configuration”选项卡中可以配置 PS 端 ddr 的参数 AX7010 配置 DDR3 型号为“MT41J128M16 HA-125” AX7020 配置 DDR3 型号为“MT41J256M16 RE-125” 这里ddr3 型号并不是板子上的 ddr3 型号而是参数最接近的型号。 Effective DRAM BusWidth”选择“32 Bit”。点击“Run Block Automation” vivado 软件会自动完成一些导出端口的工作。点击“OK”以后我们可以看到 PS 端导出一些管脚包括 DDR 还有 FIXED_IODDR 是DDR3 的接口信号 FIXED_IO 为 PS 端固定的一些接口比如输入时钟 PS 端复位信号MIO 等。连接 FCLK_CLK0 到 M_AXI_GP0_ACLK按 CtrlS 保存设计本次实验不需要添加其它 IP直接按快捷键 CtrlS 保存当前设计。接下来点击下图箭头所指示的按钮验证当前设计。验证完成后弹出对话框提示没有错误或者关键警告 点击“ OK” 如下图所示如果验证结果报出错误或者警告大家需要重新检查自己的设计。生成顶层 HDL 模块在 Sources 窗口中选中 Design Sources 下的 sysetm.bd, 这就是我们刚刚完成的 Block Design 设计。右键点击 sysetm.bd在弹出的菜单栏中选择“ Generate Output Products”如下图所示弹出“Generate Output Products”对话框 如下图所示在对话框中 Synthesis Options 选择 Global Run Setings 用于设置生成过程中要使用的处理器的线程数进行多线程处理 保持默认或设置为个人电脑处理器最大可使用线程数都可以一般选择最大可使用线程数的一般。然后点击“Generate”来生成设计的综合、实现和仿真文件。在“ Generate”过程中会为设计生成所有需要的输出结果。 比如 Vivado 工具会自动生成处理系统的 XDC约束文件因此我们不需要手动对 ZYNQ PS 引出的接口 DDR 和 FIXED_IO 进行管脚分配。Generate 完成后在弹出的对话框中点击“ OK”。在 Sources 窗口中 点击“ IP Source”标签页 可以看到 Generate 过程生成的输出结果。在“ Hierarchy”标签页再次右键点击 system.bd然后选择“ Create HDL Wrapper”。在弹出的对话框中确认勾选“ Let Vivado manage wrapper and auto-update” 然后点击“ OK”。创建完成后 Design Sources 结构如下图所示system_wrapper.v 为创建的 Verilog 文件 箭头所指的“ 品” 字形图标指示当前模块为顶层模块。 该模块使用 Verilog HDL 对设计进行封装 主要完成了对 block design 的例化 大家也可以双击打开该文件查看其中的内容。另外我们在上图 中勾选了“ Let Vivado manage wrapper and auto-update” 这样我们在修改了 BlockDesign 之后就不需要再重新生成顶层模块 Vivado 工具会自动更新该文件。管脚约束对于使用过 PL 端的设计 在完成封装后 我们需要对涉及到的管脚进行分配和约束。 点击左侧导航栏的“Open Elaborated Design” 进行约束和分配。接下来软件会有个弹窗提醒 将鼠标放置在英文提示上便会出现中文翻译这里直接点击 OK 进行下一步即可。打开后管脚约束界面如图 所示 如果软件没有正确显示该界面 可以将右上角的下拉栏展开 打开 I/O Planning 皆可切换到该页面。完成分配后使用快捷键 CtrlS 对约束文件进行保存 此时软件会弹出弹窗让用户进行命名 将光标停在英文上即可出现对应翻译。 在下方 File name 中对文件进行命名 这里读者可自行命名 只要符合命名规范即可。生成比特流bit完成了管脚约束后即可开始比特流的生成 比特流中包含着对 PL 端的配置信息 其中就包括对引脚的分配以及电平的约束 因此生成比特流需要在进行管脚分配和约束之后。 当然如果设计并未使用到 PL 部分资源 可以直接跳过该环节。点击“Generate Bitstream” 开始生成比特流 如图 所示。 此时软件会提示没有可用的实现结果 是否先进行综合实现再自动生成比特流 我们直接点击 Yes 即可。点击 Yes 后软件会弹出设置界面 这里我们只需保持默认的在本地启动运行即可 并将工作进程设置为最大值 该值越大 生成比特流所花的时间越小。随后点击 OK 等待比特流生成。比特流生成的时间较长 需要耐心等待 在生成比特流时 vivado 软件右上角会显示此时的运行状态。当比特流生成完成时 右上角会出现√ 的标识 如图 所示。 在进行工程的一些操作时 可以通过右上角来对此时软件的运行状态进行判断。比特流生成完毕后便会出现如图所示弹窗 出现的几个选项我们都不需要用到 因此直接点击 Cancel 取消即可。 至此 比特流生成完成 接下来开始导出硬件。导出硬件首先我们需要在右侧点击关闭按钮 关闭 elaborated design关闭之后的操作为 block design 这是才能成功导出硬件接着点击 File 然后在展开的功能栏中选择 Export 最后在 Export 的多个选择项中选择“ExportHardware…” 将硬件描述文件导出。此时软件会弹出弹窗 我们就来到了硬件导出的向导界面 我们点击 Next进入下一步此时窗口会让我们选择询问我们是只到综合 还是包含比特流 对于本次设计 我们涉及到了 PL 端的资源使用 因此需要选择比特流 如图 所示。比特流中包含有 PL 端的配置信息 因此对于涉及到 PL 端资源的设计 导出硬件描述文件时我们需要包含比特流 以配置 PL。 而对于纯 PS 端的设计用户在导出时无论是否勾选包含比特流都是可以的。此时我们需要一直点击 Next 来到 File 界面 此时文件名和存储路径保持默认。然后我们接着继续点击 Next 最后点击 Finish 开始导出硬件平台硬件描述文件的导出过程十分迅速 当软件下方的信息窗口出现如图 所示信息时 代表硬件描述文件已经导出。启动 Vitis硬件导出完成后 vivado 部分的设计已经完成 接下来打开 Vitis 开始 CPU软件程序设计。 点击 Tools 在展开的功能栏中选择“ LaunchVitis IDE”。接下来软件会弹出弹窗让我们设置工作空间的路径 这里我们新版的 Vitis和旧版的 SDK 不同 Vitis 从 Vivado 中启动每次都需要重新选择存储位置 如果重复选择同一个存储位置就会报错。在此我们将程放进已经创建好的 Vitis 文件下 这样有助于文件的查找与整理。 同时要保持下面的 Use this as the default and do not ask again 不能勾选保持默认即可 不然每次打开 Vitis 运行的都是这个 Vitis 文件 最后点击 Launch 运行 Vitis。Vitis 调试CPU 软件程序设计打开 Vitis 软件界面如图 软件启动后我们还没有任何工程 我们需要创建一个工程平台 用来做硬件平台的基础。项目名称填入“hello”也可以根据自己的需要填写点击 Next到这里我们来到了 Platform 界面 Platform平台 是硬件组件 (XSA) 和软件组件域/BSP、 FSBL 等引导组件等 的组合Create a new platform from hardware XSA :该界面可以让我们创建一个新的硬件平台 且文件后缀名会改成.XSA。Select a platform from repository:选择一个已有的硬件平台来创建文件 后面会给大家详细展示 。Platform Info:该界面以看到工程所支持的硬件平台 处理器型号等。接着在 Platform 界面我们选择创建一个新的硬件平台 然后按照步骤依次点 击 。 先 是 寻 找 到 Vivado 文 件 工 程 文 件 下 导 出 硬 件 时 生 成 的system_wrapper.xsa 文件 然后点击“打开”。这里我们保持默认选项 最后点击 Finish 生成 platform 如图所示。最终生成的硬件平台如图 所示在 Vitis 下方的信息及控制栏中有几个比较重要的功能Problems:该界面会显示当前工程运行的警告、 错误等信息 在进行开发时可以通过该窗口快速对工程进行纠错。Console:控制台面板 软件的编译进度等信息都会显示在该窗口 可通过该窗口确定程序的下载状态以及开发板工作状态等。创建 Vitis 工程打开 Vitis 后我们需要新建一个 Vitis 工程 点击软件左上方的 File 在展开的功能栏中依次选择 New/Application Project。接下来点击 Next 进入 Platform 界面 如图 所示 此时我们就可以看到工程所支持的硬件平台 处理器型号等。 这里我们保持默认 点击 Next 进行下一步。这里我们来到了 Application Project Details 界面 这个界面我们需要为工程命名 还会同步创建一个后缀为_system 与应用工程文件同名的文件。 并且应用工程文件会放在这个后缀为_system 的系统文件下。 这么做的目的 是为了配合下方的 ARM 核配置模式。 因为 xc7z020 器件是双核 cortex-A9 此处的处理器配置 大家可以将工程建立在其中一个核上 或者选择 SMP 建立在双核上。 那么在选择双核的情况下 应用工程文件都会包含在这个系统文件下 方便大家对项目进行操作。 同时要注意 需要勾选 Show all processors in the hardwarespecification 选项 才能选择处理器 否则就是默认为单核状态。接下来我们需要为工程命名 然后一直点击 Next 进入到下一步。这里我们需要为工程选择模板 选择 Empty Application 此时右边窗口便会出现当前工程模板的描述 点击 Finish 完成工程创建。创建完成后可以看到此时工程资源栏多出了一个文件夹 如图所示其中 key_ctrl_led 为本次创建的工程 被包含在 key_ctrl_led_system 文件下。并且相较于 SDK 板级支持包已经合并进了硬件平台文件里面 如图 所示