FPGA - ZYNQ 基于EMIO的PS和PL交互

前言:

Xilinx ZYNQ系列的芯片,GPIO分为 MIOEMIOAXI_GPIO三种方式。

MIO   :固定管脚,属于PS端,也就是ARM端。

EMIO  :通过PL扩展,使用时需要分配PL(FPGA)管脚,消耗PL端资源。

AXI_GPIO:封装好的IP核,PS通过M_AXI总线可以控制PL的IO接口,使用时,消耗管脚资源和逻辑资源。

MIO:

MIO(Multiuse I/O),多功能IO接口,分配在GPIO的Bank0 和 Bank1,属于Zynq的PS(ARM)部分。

这些引脚,可以直接用在GPIO、SPI、UART、TIMER等等一些PS端外设,这些引脚与PS直接相连接,不需要添加引脚约束,并且也不占PL端资源。

Bank0有32个MIO引脚,Bank1有22个MIO引脚,54个引脚直接通过MIO连接到PS上。

EMIO:

EMIO(Express Multiuse I/O),扩展多功能IO,分布在BANK2、BANK3,依然属于Zynq的PS部分,只是直接连接到了PL上,当MIO不够使用时,可以通过EMIO控制PL部分的引脚。

当我们想通过PS来访问PL又不想浪费AXI总线时,就通过EMIO接口来访问,使用的时候,需要添加约束文件,分配PL端的引脚。

AXI_GPIO:

AXI_GPIO,相当于GPIO的IP核,通过AXI总线挂在PS上的GPIO。

我们在FPGA工程上添加相应的GPIO的IP核,然后生成相关PL端的逻辑,并且添加约束文件,以分配PL端的管脚才能正常使用。其占用了PL端的逻辑和资源。

开发目的:

PS端GPIO外设使用、EMIO使用、PS与PL联合调试

开发流程:

1,工程创建

双击打开Vivado软件,界面如下图所示

首先点击Quick Start 下的 Create Project 创建新工程,也可点击工具栏中的 File->Project->New...进行创建。

进入新建工程向导后next,编辑工程名称和工程目录

对需要的工程类型进行选择,将光标放置在对应的选项上即可出现对应的中文翻译。这里我们勾选“RTL Project”,因为我们是完全新建工程,所以勾选下方的现在不指定资源,接着点击“next”进行下一步。

接下来选择对应的开发板型号

接下来会弹出工程摘要界面,该界面会对工程的类型以及所选用芯片的器件型号进行总结,用户可通过该界面检查是否有创建错误。确认无误后点击 Finish 完成工程创建

2,模块创建

创建完成后Vivado工程后软件界面及对应功能如下图

接下来点击“Create Block Design”创建一个模块设计,在弹出的窗口中对设计命名。 

接下来对其命名 注意:不能使用中文以及空格命名。

创建完成后软件界面如图所示,可以看到此时Design栏中出现了我们刚创建好的“system”模块设计。此时我们的设计内没有任何内容,需要点击 “+”为设计添加IP核。

3,硬件系统创建

添加IP核

 在弹出的搜索栏中输入 zynq,可以看到下方出现了“ZYNQ7 Processing System”, 如图所示。该IP核为ZYNQ7 处理系统IP核,双击该IP核添加。 添加完成后的zynq IP核如图所

 大部分IP核在添加完成后,并不能直接满足用户的需求,我们还需对IP核 的接口信号以及一些相关参数进行配置

双击IP核 进入配置

 首先配置DDR

uart配置

uart波特率配置 

GPIO配置

Bank电平配置 Bank0(3.3v)  Bank1(1.8v)

使能完外设接口后我们返回图形化向导界面,如图所示。可以看到在GPIO外设和uart后面已经打上了√,代表此时我们已经使能该接口。在进行硬件逻辑系统搭建时,我们可以通过该界面快速一览使用到了哪些zynq资源。

配置完 DDR后即完成了本次 zynq IP 核的配置,点击 OK,可以看到此时 zynq IP 核如图 2-31所示,因为我们配置了GPIO外设,相较于配置前,此时多 了一个GPIO_0端口。

添加ila

然后导出引脚

 

在涉及到的模块较多的场合,系统会出现自动连接(Run Connection Automation)的选项,如图  所示。点击该项并设置需要连接的模块后,软件便会自动生成 AXI 互联 IP 核(AXI Interconnect)和处理器系统复位 IP 核 (Processor System Reset),并自动连接 AXI信号,部分时钟信号和复位信号。 但是软件在连接时,有时会将信号连接到用户期望之外的端口上。因此,连线复杂的设计通常需要手动对部分端口信号进行连接。 

验证设计

端口连接完成后使用快捷键 Ctrl+S 或者点击左上方的保存按钮保存设计, 随后点击上方的√来对设计进行验证。

 系统开始对设计进行验证,当出现以下弹窗时,证明设计无误。如果出现 警告,则需要重新检查系统。

4,生成封装

点击sources资源栏下我们创建的system模块设计,单击右键,在展开的功 能中选择“Generate Output Products...”生成输出。

接下来软件会弹出生成输出前的设置界面,如图所示。在合成选项栏 直接选择“Out Of context per IP”即可,下方的“Number of jobs”选项选择最 大值。该值会影响生成输出时的速度,该值越大,生成输出的速度就越快,最 大值与电脑配置有关,设置完成后点击“Generate”开始生成。

 输出的生成比较慢需要等待一段时间,生成完成后软件会弹出如图 所 示弹窗,点击OK即可。

接着我们还是点击sources资源栏下我们创建的system模块设计,单击右键, 在展开的功能中选择“Create HDL Wrapper...”创建HDL封装。

在弹出的窗口中选择让 vivado管理封装和自动更新,随后点击 OK开始创建封装。

当Sources栏出现蓝色的设计文件时,则代表封装已经创建和更新完成,如图所示。

这里需要注意的是,mcu_design.v 文件为顶层例化文件,在用户修改设计并生成输出后,只要更新 Wrapper,mcu_design.v 中的内容便会被覆盖。 若用户需要在顶层中手动加入一些语句,在修改硬件生成输出后只要更新 Wrapper这些语句便会被覆盖。如果您的设计中需要加入自己的逻辑代码,建议用户手动创建一个顶层文件,在文件中例化mcu_design.v文件,并添加自己的逻辑代码。

5,管脚约束

对于使用过PL端的设计,在完成封装后,我们需要对涉及到的管脚进行分 配和约束。点击左侧导航栏的“Open Elaborated Design”进行约束和分配。

打开后管脚约束界面如图所示,如果软件没有正确显示该界面,可以 将右上角的下拉栏展开,打开I/O Planning皆可切换到该页面。

在管脚约束界面中,我们需要做的是对使用到的PL端的管脚进行分配并对 管脚电平进行约束,本次设计所涉及到的为PL端的按键和PL端的LED灯。

具体管脚查询自己所用到的开发板型号说明文件 查询完成管脚分配

完成分配后使用快捷键 Ctrl+S 对约束文件进行保存,此时软件会弹出弹窗 让用户进行命名,将光标停在英文上即可出现对应翻译。在下方File name中对文件进行命名,这里读者可自行命名,只要符合命名规范即可。

 6,生成比特流

完成了管脚约束后即可开始比特流的生成,比特流中包含着对PL端的配置信息,其中就包括对引脚的分配以及电平的约束,因此生成比特流需要在进行管脚分配和约束之后。当然如果设计并未使用到PL部分资源,可以直接跳过该 环节。 点击“Generate Bitstream”开始生成比特流,如图所示。此时软件会提示没有可用的实现结果,是否先进行综合实现再自动生成比特流,我们直接 点击Yes即可。

 

比特流生成的时间较长,需要耐心等待,在生成比特流时,vivado 软件右 上角会显示此时的运行状态,如图所示。

当比特流生成完成时,右上角会出现√的标识, 

7,导出硬件

首先点击 File,然后在展开的功能栏中选择 Export,最后在 Export 的多个 选择项中选择“ExportHardware...”将硬件描述文件导出。

此时软件会弹出弹窗询问我们是否包含比特流,对于本次设计,我们涉及到了 PL 端的资源使用,因此需要勾选比特流,如图 所示。勾选比特流后 点击OK开始导出。

比特流中包含有PL端的配置信息,因此对于涉及到PL端资源的设计,导 出硬件描述文件时我们需要包含比特流,以配置 PL。而对于纯 PS 端的设计, 用户在导出时无论是否勾选包含比特流都是可以的

8,启动SDK

硬件导出完成后 vivado 部分的设计已经完成,接下来打开 SDK开始 CPU 软件程序设计。点击File,在展开的功能栏中选择“Launch SDK”

接下来软件会弹出弹窗让我们设置硬件描述文件和工作空间的路径,这里我们保持默认即可,点击OK运行SDK。

9,CPU软件程序设计

打开SDK软件界面如图 所示,其中“system_wrapper_hw_platform_0” 为从vivado中导出的硬件资源描述文件。

创建SDK工程

接下来会进入工程创建界面,如图所示。此时需要为工程命名, 其余部分软件已经帮我们设置好了,例如工程所支持的硬件平台,处理器型号 等。这里我们保持默认,点击Next进行下一步。 

 

这里我们需要为工程选择模板,选择 Empty Application,此时右边窗口便 会出现当前工程模板的描述,点击Finish完成工程创建。

创建完成可以看到工程资源中多了两个文件夹

 添加用户代码

如图所示,将工程下拉展开,右键单击 src 文件夹,在弹出的功能栏 中选择New/Source File。

接下来我们需要对该源文件命名,这里必须命名为 main.c,其余部分保持 默认即可。点击Finish完成创建。

完成创建后软件的编辑器自动帮我们打开了 main.c 文件,同时还打开了一 个system.mss的文件,如图所示。 

在写入用户代码前,我们先跳转到系统为我们打开的 system.mss 文件查看。 可以看到该文件除了对板级支持包进行了相关说明外,还提供了许多相关的驱 动例程和相关文档供开发者参考。

接下来返回main.c,向其中添加以下代码:

#include "xparameters.h"
#include "xgpiops.h"
#include "xstatus.h"
#include "xplatform_info.h"
#include <xil_printf.h>#define GPIO_DEVICE_ID  	XPAR_XGPIOPS_0_DEVICE_ID
#define	LED_MIO0			7
#define	LED_MIO1			8#define	LED_EMIO			54XGpioPs Gpio_PS;	/* The driver instance for GPIO Device. */int main()
{XGpioPs_Config *GPIO_ConfigPtr;//初始化GPIO外设GPIO_ConfigPtr = XGpioPs_LookupConfig(GPIO_DEVICE_ID);XGpioPs_CfgInitialize(&Gpio_PS, GPIO_ConfigPtr,GPIO_ConfigPtr->BaseAddr);//选择gpio管教方向XGpioPs_SetDirectionPin(&Gpio_PS, LED_MIO0, 1);XGpioPs_SetDirectionPin(&Gpio_PS, LED_MIO1, 1);XGpioPs_SetDirectionPin(&Gpio_PS, LED_EMIO, 1);//使能gpio管教XGpioPs_SetOutputEnablePin(&Gpio_PS, LED_MIO0, 1);XGpioPs_SetOutputEnablePin(&Gpio_PS, LED_MIO1, 1);XGpioPs_SetOutputEnablePin(&Gpio_PS, LED_EMIO, 1);while(1){XGpioPs_WritePin(&Gpio_PS, LED_MIO0,0x0);XGpioPs_WritePin(&Gpio_PS, LED_MIO1,0x0);XGpioPs_WritePin(&Gpio_PS, LED_EMIO,0x0);sleep(1);XGpioPs_WritePin(&Gpio_PS, LED_MIO0,0x1);XGpioPs_WritePin(&Gpio_PS, LED_MIO1,0x1);XGpioPs_WritePin(&Gpio_PS, LED_EMIO,0x1);}return 0;}

Ctrl+S 保存设计,SDK 会自动编译,在确认编译无误后,接下来便可以开 始进行板级验证了。

10,下载验证

点击我们创建的led工程,随后点击上方菜单栏的Run,在展开的功能选项 中选择“Run Configurations...”。软件会打开如图所示界面。

接下来我们要新建一个任务,将烧录文件下载到开发板中具体步骤如下:

双击GDB或System Debugger新建配置任务 

在右侧检查是否添加比特流文件和 PS初始化脚本,通常软件会自动添加,如果没有,用户可以关闭并重新打开该界面或自己手动添加。比特 流只在使用到PL资源时需要,在纯PS的设计中不需要添加比特流。

确认下方四个选项都被勾选,这四个选项分别是系统复位、配置 FPGA、 PS 初始化和 PL-PS 电平转换。后两个选项通常是默认勾选的,用户需要手动勾选前两项以确保PL部分能够被正确配置。

点击上方的Application切换到应用界面。

检查.elf文件是否添加且烧录任务是否被选中。这里.elf文件由软件编译 产生,参与用户程序的运行。SDK默认情况下设置了自动编译,用户保 存设计后软件便会编译并生成.elf文件,所以当搜索不到.elf文件时检查 设计是否保存。

点击“Run”开始烧录

下载完成后 即可观察板级结果

总结

        在sdk开发中,sdk软件中提供了一些例程,在学习和开发的过程中可以查看学习这些例程更好的帮助我们学习和开发。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/824875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵌入式硬件需要过哪几关?

目标是成为一名硬件工程师,用电烙铁和电路板一统江湖,游戏共有九关。 第一关:基础基础还是基础! 你要有一定的基础,模电,数电这些都得会一些。一般科班出身的专业有电信,通信,自动化等等。 你如果完全没这些基础,连电阻,电容都不认识,那就需要在这关待上很久啦。 …

混合app开发

安卓与h5交互 原生调用js js调用原生 ios与h5交互 代码演示 ios调用h5 xcode创建一个ios项目 h5调用原生 h5部分代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" conten…

论文解读:(CoOp)Learning to Prompt for Vision-Language Models

文章汇总 存在的问题 虽然训练类别通常具有文本形式&#xff0c;例如“金鱼”或“卫生纸”&#xff0c;但它们将被转换为离散标签&#xff0c;只是为了简化交叉熵损失的计算&#xff0c;从而使文本中的语义封装在很大程度上未被利用。这样的学习范式将视觉识别系统限制在闭集…

claude国内不能用

AnthropicAI 公司旗下的Claude 3 大型语言模型&#xff0c;以其卓越的性能直接挑战了GPT-4的市场地位。Claude 3 系列中包含了几个不同版本&#xff0c;如Claude 3 Opus、Claude 3 Sonnet 以及 Claude 3 Haiku&#xff0c;每个版本都针对特定的应用场景进行了优化。 在这些版本…

通过阿里云向量检索 Milvus 版和通义千问快速构建基于专属知识库的问答系统

背景介绍 阿里云向量检索 Milvus 版是一款 Serverless 全托管服务&#xff0c;确保了与开源 Milvus 的完全兼容性&#xff0c;并支持无缝迁移。它在开源版本的基础上增强了可扩展性&#xff0c;能提供大规模 AI 向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力…

土壤多营养级分析经典思路:细菌+真菌

摘要 羊肚菌的人工栽培一直是全球研究的热点&#xff0c;了解土壤微生物生态对提高羊肚菌产量和减轻病原菌危害具有重要意义。以往的研究往往聚焦到细菌或真菌单一群落。本研究探究土壤中细菌真菌多营养级联合分析&#xff0c;更加深入的确定羊肚菌生长与土壤微生物生态之间的潜…

Netty学习——实战篇5 Netty 心跳监测/WebSocket长连接编程

1 心跳监测 MyServer.java public class MyServer {public static void main(String[] args) {NioEventLoopGroup bossGroup new NioEventLoopGroup(1);NioEventLoopGroup workerGroup new NioEventLoopGroup();try {ServerBootstrap serverBootstrap new ServerBootstrap…

SpringMVC(二)【请求与响应】

0、测试环境 我们简化开发&#xff0c;创建一个简单的环境&#xff08;因为没有其它包比如 service、dao&#xff0c;所以这里不用 Spring 容器&#xff0c;只用 SpringMVC 容器&#xff09;&#xff1a; Servelet 容器配置&#xff1a; package com.lyh.config;import org.s…

Web前端-Vue组件库Element

黑马程序员JavaWeb开发教程 文章目录 一、快速入门&#xff08;1&#xff09;什么是Element&#xff08;2&#xff09;快速入门 二、常见组件1、表格2、分页&#xff08;Pagination&#xff09;3、表单 三、案例&#xff08;1&#xff09;根据页面原型完成员工管理页面开发&…

MySql中truncate,delete有什么区别?什么情况下id会不会连续呢?

TRUNCATE和DELETE都是用来删除表中数据的SQL命令&#xff0c;但它们的工作方式和使用场景有所不同&#xff1a; DELETE命令&#xff1a;DELETE命令用于从表中删除一行、多行或所有行。你可以添加WHERE子句来指定要删除的行。例如&#xff0c;DELETE FROM table_name WHERE cond…

内网代理技术总结

代理技术就是解决外网和内网的通信问题&#xff0c;例如&#xff0c;我的一个外网主机想要找到另外一个网段下的一个内网主机&#xff0c;理论上是无法找到的。如果我们想要进行通信的话就要使用代理技术。我们可以找到一个与目标内网主机在容易网段下可以通信的外网主机&#…

FMECA对于装备通用质量特性的作用分析——SunFMEA软件

FMECA是一种在产品设计、生产和维护过程中广泛应用的质量分析工具。它通过对产品可能出现的故障模式、故障影响和故障严重度进行分析&#xff0c;为设计者提供改进设计、提高产品质量和可靠性的重要依据。在装备通用质量特性方面&#xff0c;FMECA同样发挥着重要的作用。今天Su…

万兆以太网MAC设计(4)CRC_process模块

文章目录 前言一、模块功能二、实现过程三、仿真总结 前言 上文介绍的MAC_RX模块当中增加了CRC校验和比对的功能&#xff0c;本文将根据CRC校验的结果&#xff0c;来决定将数据输出到上层用户还是丢弃。 一、模块功能 接收MAC_RX模块输出的AXIS数据&#xff0c;存入本地环形…

rust学习(BorrowMut异常)

现象&#xff1a; 编译没有问题&#xff0c;运行时出现&#xff1a; 代码&#xff1a; pub fn do_test() {let v Arc::new(RefCell::new(100));let v1 v.try_borrow_mut().unwrap();let v2 v.try_borrow_mut().unwrap(); } 原因&#xff1a; 一个cell貌似不能同时被借用…

香港裸机云多IP服务器都有哪些配置?

香港裸机云多IP服务器是一种高效、灵活的云计算服务&#xff0c;为用户提供了多IP地址的配置选项&#xff0c;以满足各种复杂的网络需求。这种服务器在配置上具有丰富的多样性和高度的可定制性&#xff0c;下面我们就来科普一下香港裸机云多IP服务器的主要配置。 首先&#xff…

开源模型应用落地-chatglm3-6b-模型输出违禁词检测(九)

一、前言 受限于模型本身的一些缺陷&#xff0c;任何模型均可能会生成一些不正确的输出。如何通过技术的手段去规避模型潜在的风险&#xff0c;提升推理质量是需要持续探究的过程。 如何利用第三方内容安全审核服务去检测模型输出内容的合规性&#xff0c;请查看&#xff1a;开…

【资源分享】Stata 17免费下载安装

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验&#xff0c;帮助大家尽早适应研究生生活&#xff0c;尽快了解科研的本质。祝一切顺利&#xff01;—…

LabVIEW仪器信息管理系统

LabVIEW仪器信息管理系统 在计量检测实验室的日常工作中&#xff0c;仪器检定校准是一项基础而重要的任务。随着科技的进步和实验室工作量的增加&#xff0c;传统的人工管理方式已经难以满足现代实验室对效率和准确性的要求。开发一套基于LabVIEW的仪器信息管理系统显得尤为必…

魔方网表ERP mailupdate.jsp 任意文件上传漏洞复现

0x01 产品简介 魔方网表ERP是一款高效、灵活的企业资源规划解决方案,旨在帮助企业实现数智化转型,消除信息孤岛,打造全程一体化的管理体系。魔方网表ERP拥有强大的表单功能和模块化的产品特点,使得企业可以根据自身业务需求,通过简单的拖拽和配置,快速搭建符合自身特点的…

python爬豆瓣top250电影

文章目录 前言分析与实现1.对豆瓣网网站进行Ajax分析2.发送请求3.进一步筛选&#xff08;提取&#xff09; 完整代码 前言 通过这个项目&#xff0c;可以让小白对爬虫有一个初步认识&#xff0c;爬取豆瓣top250是一个初学者学爬虫的必经之路&#xff0c;话不多说&#xff0c;我…