Xilinx系ZYNQ学习笔记(二)ZYNQ入门

news2024/9/21 4:30:10

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 简单介绍
    • 简称
  • xc7z020型号FPGA
  • ZYNQ实操
    • 通用IO
    • 点亮LED灯
      • 硬件逻辑基础


前言

简单入门一下ZYNQ是何种架构,如何编程,至于深入了解应该要分开深入学习Linux和FPGA


简单介绍

其基本架构都是在同一个硅片上集成 FPGA 和 CPU,并通过高速、高带宽的互联架构连接起来。
ARM 的顺序控制、丰富外设,开源驱动、FPGA 的并行运算、高速接口、灵活定制、数字之王的特性交错相融,相得益彰。再加上其内部多条高速桥接总线,使其数据交互链路畅行无阻。

SOPC 和 SoC FPGA 是统一的,都是由 FPGA 和处理器组成。在 SoC FPGA 中,嵌入的是 ARM 公司 32 位的 Cortex-A9 硬核处理器,简称 PS(Processor System)。
而 SOPC 技术中,嵌入的是 Xilinx 自己开发的 32 位MicroBlaze 软核处理器,两者指令集与处理器性能均有差异。Cortex-A9 硬核处理器性能远远高于 MicroBlaze 软核处理器。

Zynq-7000 SoC FPGA 片上的 PS 部分,不仅集成了双核的 Cortex-A9 硬核处理器,还集成了各种高性能外设,如 MMU、DDR3 控制器、NAND FLASH控制器等,有这些外设,PS 部分就可以运行成熟的 Linux 操作系统,提供统一的系统 API,降低开发者的软件开发难度。而 Microblaze 或 NIOS II、Risc-V 软核 CPU 虽然可以通过配置,用逻辑资源来搭建相应的控制器以支持相应功能,但是从性能和开发难度上来说,无法与之媲美。因此,采用基于 SoC FPGA 架构进行设计开发是比较好的选择。

虽然 SoC FPGA 芯片上既包含了有 ARM,又包含了有 FPGA,但是两者一定程度上是相互独立的,SoC 芯片上的 ARM 处理器核并非是包含于FPGA 逻辑单元内部的,而是与 FPGA 一同封装到同一个芯片中,JTAG 接口、电源引脚和外设的接口引脚都是独立的。因此,如果使用 SoC FPGA 芯片进行设计,即使不用片上的 ARM 处理器,ARM 处理器部分占用的芯片资源也无法释放出来,不能用作通用的 FPGA 资源。而 SOPC 则是使用 FPGA 通用逻辑和存储器资源搭建的 CPU,当不使用 CPU 时,CPU 占用的资源可以被释放,重新用作通用 FPGA 资源。

SoC FPGA 芯片上包含现场可编程逻辑门阵列,可以根据实际应用需求设计相应的逻辑电路,FPGA 侧设计的功能电路可以直接连接到 PS 的总线上,从而映射为 PS 的一个外设,由 PS 对其进行读/写操作,该操作就像处理器操作本身片上含有的外设一样简单方便。
例如 S3C2410 处理器的片上 UART 控制器带有 16 个字节的 FIFO 缓冲,但是在某些大数据量的应用中,片上的 UART 控制器不能完全满足要求,需要有更大容量的 FIFO 来满足功能开发需求,此时只能通过软件的方式处理。但SoC FPGA就可以实现64 字节的接/收 FIFO

单独的 FPGA 设计的系统也有其不足之处,由于 FPGA 实现功能都是通过功能固定的逻辑电路实现的,那么当应用中需要灵活的控制和人机交互或者复杂的以太网协议通信时,使用 FPGA 实现就会有较大的难度,即使使用复杂的状态机能够勉强实现功能,也面临着功能固定、修改难度大的问题。例如液晶显示屏绘制波形,或者 TCP/IP 协议传输到远端服务器时,而 ARM 处理器有较大的优势。这些在调试中深有体会,像之前IIC通信,复杂又开发时间长。

我们之前板子用的FPGA+ARM,是电路板连接,各自使用独立器件,相互间的通信速率会有较大的限制,器件间使用高位宽的并行总线,存在竞争冒险(数据位到达时间不一致导致输出异常)的情况,因此数据线翻转速率有较大的限制,通信频率无法做到很高。
而 SoC FPGA使用的是片上集成的方式,在同一个芯片上集成 FPGA 和 PS 系统,两者间通过一种高性能、高带宽、低延迟的片内总线 AXI 连接,为两者通信提供了较高的数据带宽,大大提高了两者的通信带宽和通信效率。

简称

PS:(Processing System),ZYNQ可以大概分为ARM和FPGA两部分,PS就是ARM的SOC部分,是整块板子的处理系统。

PL:(Progarmmable Logic),意为可编程逻辑,也就是ZYNQ上的FPGA部分。

MIO:(Multiuse I/O),多功能IO引脚,如果学过单片机可以把它理解为引脚复用,属于PS部分,也就是ARM部分。值得一提的是,MIO 信号对 PL部分是不可见的,所以对 MIO 的操作可以看作是纯 PS 的操作。

EMIO:(Extendable Multiuse I/O),可拓展多功能IO引脚,依然属于PS部分,但是连接到了PL上,再从PL的引脚连到芯片外面实现数据输入输出。如果MIO不够用的话, PS 可以通过驱动 EMIO 控制 PL 部分的引脚 。EMIO 有 64 个引脚可供我们使用。

APU:(Application Processor Unit),应用处理器单元,曾经AMD公司用它来特指加速处理器(Accelerated Processing Units),但是在ZYNQ上的意思就截然不同,注意区分。APU包含了双ARM-CortexA9核,加上高速缓冲,DMA,定时器,中断控制,浮点和NEON协处理,可以类比51单片机中的MCU,Cortex-M系列的STM32上的MPU来理解。

但是APU这个称呼还是有说法的,没有了M就说明意图摆脱微处理器Micro的名头,换上Application就不简单了,说明在上面可以跑应用程序, 暗示着这个系统是需要全尺寸的操作系统的。

TTC:(Triple Time Counter),直译就是三倍时间计数器,其实是这个计数器内有3个独立通道,可以独立计数。挂在APB上,为系统或外设提供定时或计数服务的。

WDT:看门狗定时器,有两个, 分别监视ARM-Cortex A9用的。 如果软件跑飞,无法清定时器,一段时间后,看门狗就复位。一般没什么用,学STM32时就觉得这功能还挺厉害,能一直监视程序有没有跑飞,后来发现跑飞的几率太小了,现在的板子稳定性都很好,以至于我现在都没见到过看门狗起作用,不过也算是个风险保障。

SWDT:系统级看门狗定时器, 这个看门狗的时钟和复位信号,都可以来自于芯片外部, 这样,即使系统有严重故障,比如时钟频率本身都有问题了,仍然可以通过与系统无关的外部信号计数,计数满就复位。

SCU:(Snoop Control Unit),用来保持双核之间的数据Cache的一致性,两个ARM-Cortex A9,如果一个写存储时只写进缓存,没写进主存,如果第二个A9读操作,涉及到第一个写脏了的数据段, SCU要保证第二个A9的缓存里是最新的数据。 SCU的存在,才使得两个核成互相联系的“双核”,才能成为MPsoc。

AHB:Advanced High performance Bus,先进高性能总线,主要用于高性能模块(如CPU、DMA和DSP等)之间的连接

APB:APB(Advanced Peripheral Bus),外围总线的意思。该总线协议是ARM公司提出的AMBA总线结构之一,主要用于低带宽的周边外设之间的连接,例如UART、1284等,它的总线架构不像AHB支持多个主模块,在APB里面唯一的主模块就是APB 桥。

xc7z020型号FPGA

xc7z020 芯片有 3 个 IO Bank 设计为了 FPGA 的通用 IO Bank, 为 Bank34、Bank35、Bank13(xc7z010 芯片为两个,Bank34 和 Bank35),总共 125 个可用IO,这些引脚中大部分既可以作为单端输入输出,也可以作为差分输入输出。支持的 IO 电平标准也非常多,从 LVCMOS 1.8V 到 LVCMOS 3.3V 等多种 IO 标准。

其中,有 12 个引脚可以用作全局时钟输入引脚,在 Vivado 软件的 Open Elaborated Design 中,这些引脚以 MRCC 时符号标记
在这里插入图片描述
实际使用时,如果是单端时钟信号输入,建议接在以“MRCC”标志标记的引脚上。另外,这些引脚如果不接时钟输入,也可以作为通用的 IO 使用。但是Altera中这些只能当通用输入IO,不能当输出,Xilinx应该类似的吧

同一个 IO Bank 中的 I/O,只能使用同一种电压标准的IO电平。是通过专用的 I/O 电压设置引脚来
设置的。这些引脚的名称为 VCCO_x,其中 x 为对应的 Bank 编号,一般设计原理图时要考虑供电电压。

ZYNQ实操

通用IO

MIO 分配在 GPIO 的 Bank0 和Bank1,属于 PS 部分, 而 EMIO 也是 PS 上 GPIO 的一部分,但连接到了 PL,分配在 GPIO 的 Bank2 和 Bank3。MIO 在芯片外部有 54 个引脚,这些引脚可以用于 GPIO、SPI、UART、USB 等功能上,每个引脚都同时具有多种功能。EMIO 有 64 个引脚, EMIO 与 MIO 的不同在于,EMIO 连接到了 PL,再从 PL 输出信号,而 MIO 直接从 PS 端输出。

一些 IOP(I/O Peripheral)信号仅在 MIO 接口上可用,如 USB 外设信号;一些信号在 MIO 或 EMIO 接口上可用,如 UART 信号;而一些接口信号只能在 EMIO 接口上访问,如 UART的 Modem signals 接口信号。

引脚的分配(路由)必须按组进行,信号不能被分割并路由到不同的 MIO 引脚组。例如,如果 SPI_0_CLK 路由到 MIO 引脚 40,那么 SPI_0 接口的其他信号必须路由到 MIO 引脚 41 ~ 45。

点亮LED灯

硬件逻辑基础

创建图形化设计模块,在里面添加ZYNQ的IP核,双击即可进入IP核设计界面
在这里插入图片描述
左侧栏为 zynq IP 核配置的导航窗口,共分为八个部分:
Zynq Block Design: 图形化向导界面,可以快速知道各部分功能使用情况,并能迅速跳转到对应项设置。
PS-PL Configuration: PS-PL 接口配置界面,可以对 AXI,HP,DMA 等总线接口进行配置。
Peripheral I/O Pins: I/O 外设引脚配置界面,可对 I/O 外设引脚进行MIO 以及 EMIO 的配置,配置时需要注意 Bank 电平。
MIO Configuration:MIO 配置界面,相较于 I/O 外设引脚配置界面,功能更为复杂。
Clock Configuration: 时钟配置界面,页面用来配置 PS 输入时钟、外设时钟,以及 DDR 和 CPU 时钟等。
DDR Configuration: DDR 配置界面,控制 DDR 型号以及细节参数等。
SMC Timing Calculation: SMC 时序计算界面,可进行 SMC 时序计算 。
Interrupts: 中断控制界面,可对 PS 与 PL 间的中断进行配置。

PS 端的引脚是固定的,我们不需要分配, PL 端的按键和 led 灯都需要一个 EMIO 信号,因此我们将 EMIO 的位宽设置为 2。设置完成后检查电平状态,将 Bank1 的电平设置为 1.8V。
在这里插入图片描述
使能完自己会打勾
在这里插入图片描述
还要配置DDR:
DDR 全名为双速率同步动态随机存储器(Double Data Rate Synchronous Dynamic Random Access Memory),也就是我们常说的内存。基于 PS 端的应用,大部分都需要基于片外存储外设 DDR 上运行。因此在使用时,我们需要配置 DDR 型号。
在这里插入图片描述
配置完成后多了一个GPIO0
在这里插入图片描述
将 IP 核的引脚导出,点击上方的蓝色小字“Run Block Automation”,让系统自动帮我们导出引脚。
在这里插入图片描述
之后手动到处GPIO0,在导出时,我们也可以先点击选中 IP核,然后右键点击 Make External 或者通过快捷键 Ctrl+T 一次性导出所有引脚。导出的引脚信号也支持重命名,只需点击信号名,然后在左侧的“External Interface Propetirs”栏内的“Name”修改即可
在这里插入图片描述
在这里插入图片描述

FCLK_RESET0_N:全局复位信号,低电平有效。
M_AXI_GPIO:通用 AXI 接口信号,M 代表其作为主机信号。
M_AXI_GPIO_ACLK:M_AXI_GPIO 的输入时钟信号。
FCLK_CLK0:PS 输出时钟信号。

M_AXI_GPIO_ACLK 虽然本次设计并未使用到,但是如果不给其一个输入信号,软件便会报错。为了防止出现该现象,我们只需将 FCLK_CLK0和 M_AXI_GPIO_ACLK 连接即可。之后验证
在这里插入图片描述
生成封装:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
system_wrapper.v 文件为顶层例化文件,在用户修改设计并生成输出后,只要更新 Wrapper,system_wrapper.v 中的内容便会被覆盖。建议用户手动创建一个顶层文件,在文件中例化 system_wrapper.v文件,并添加自己的逻辑代码。

根据硬件进行分配引脚,这里分配了一个LED和按键的引脚
在这里插入图片描述
之后生成比特流就行,点击“Generate Bitstream”开始生成比特流

之后"File- Export-Export Hardware…”,导出硬件,因为涉及到PL端,勾选比特流
在这里插入图片描述
在这里插入图片描述
对于纯 PS 端的设计,用户在导出时无论是否勾选包含比特流都是可以的。

之后打开SDK,2020版本集成到visit IDE中
在这里插入图片描述
在这里插入图片描述

browser里面选择刚刚生成的文件.xsa
在这里插入图片描述
在这里插入图片描述
之后在File里面新建一个application应用,用我们的硬件逻辑来编程
在这里插入图片描述
因为我们前面没有配置串口,所以一般选的hello world也选不了,就选个空应用
在这里插入图片描述
接下来就是移植库的操作,写自己的main函数
在这里插入图片描述

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

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

相关文章

『Android』如何配置 Jetpack-Compose 环境

记录配置Jetpack Compose环境的一些坑~ 直接创建kotlin项目或创建java项目后再配置均可 根目录 build.gradle 配置kotlin环境构建脚本 buildscript {ext.kotlin_version 1.4.32dependencies {classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version&q…

T5:运动鞋图片识别

T5周:运动鞋品牌识别 **一、前期工作**1.设置GPU(用CPU可忽略该步骤)2.导入数据3.查看数据 **二、数据预处理**1.加载数据2.可视化数据3.配置数据集 **三、构建CNN网络模型****四、编译模型****1、设置动态学习率** **五、训练模型****六、模…

【iOS】——响应者链和事件传递链

事件传递 事件传递流程 发生触摸事件后,系统会将该事件封装成UIEvent对象加入到一个由UIApplication管理的事件队列 UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常,先发送事件给应用程序的主窗口…

什么你还不懂keepalived高可用负载均衡架构?

1、部署keepalived 1.1、keepalived简介 vrrp 协议的软件实现,原生设计目的为了高可用 ipvs 服务 官网: http://keepalived.org/ 功能: 基于 vrrp 协议完成地址流动 为 vip 地址所在的节点生成 ipvs 规则 ( 在配置文件中预先定义 ) 为 ipvs 集群的各 RS 做健康状态检测 基…

Linux 操作系统 --- 信号

序言 在本篇内容中,将为大家介绍在操作系统中的一个重要的机制 — 信号。大家可能感到疑惑,好像我在使用 Linux 的过程中并没有接触过信号,这是啥呀?其实我们经常遇到过,当我们运行的进程当进程尝试访问非法内存地址时…

NC 数组中只出现一次的两个数字

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 一个整型数组…

Apache--简介与基本使用

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 一、Apache简介 Apache HTTP Server(在Red Hat发行版中俗称Apache或httpd)是由Apache Software Foundation在Apache License…

windows bat脚本基础指令详解

pause暂停批处理的执行并在屏幕上显示"请按任意键继续…"echo显示指令,会把需要显示的内容展示出来。echo off在此语句后所有运行的命令都不显示命令行本身,但是本身的指令是会显示出来的。不显示本行命令行call调用另一个批处理文件&#xff…

Ricardo Milos

目录 一、题目 二、思路 三、payload 四、思考与总结 一、题目 <!-- Challenge --> <form id"ricardo" method"GET"><input name"milos" type"text" class"form-control" placeholder"True" va…

【C++STL详解(十一)】map/set/multimap/multiset的介绍与使用

目录 一、关联式容器 二、键值对 三、set 介绍 简单使用 1.构造 2.相关迭代器 3.容量 4.修改 四、multiset 五、map 介绍 使用 1.定义的方式 2.迭代器相关 3.容量与operator【】(重点) 4.修改 小总结&#xff1a; 六、multimap 一、关联式容器 在CSTL中…

【学习笔记】A2X通信的协议(十三)- 消息功能定义和内容

目录 11 消息功能定义和内容 11.1 概述 11.2 通过PC5信令消息进行的A2X通信 11.2.1 A2X直接链路建立请求 11.2.1.1 消息定义 11.2.1.2 目标用户信息 11.2.1.3 密钥建立信息容器 11.2.1.4 Nonce_1 11.2.1.5 KNRP-sess ID的最高有效位&#xff08;MSB&#xff09; 11.2…

替代 SMR 算法!两步孟德尔随机化方法 TWMR 与 revTWMR 整合xQTL+GWAS数据分析基因表达与疾病的关联

全基因组关联研究&#xff08;GWAS&#xff09;是研究大型队列中基因型与表型关系的重要工具。GWAS的已知局限性主要在于从与致病变异相关的连锁不平衡区域中识别生物学机制&#xff0c;而无法直接获得基因层面的表型关联。为了解决这个问题&#xff0c;基于转录组关联研究&…

C语言——函数专题

1.概念 在C语言中引入函数的概念&#xff0c;有些翻译为子程序。C语言中的函数就是一个完成某项特定任务的一小段代码&#xff0c;这个代码是有特殊的写法和调用方法的。一般我们可以分为两种函数&#xff1a;库函数和自定义函数。 2.库函数 C语言国际标准ANSIC规定了一些常…

Docker 容器运行时如何实现与宿主机的目录挂载

虽然容器启动前挂载目录相对简单,只需要在启动容器的时候通过-v 参数即可轻松实现,但对于已运行的容器进行目录挂载则稍显复杂。本教程将深入讲解如何在不中断容器运行的情况下,为已运行的Docker容器配置目录挂载,实现灵活的数据共享与持久化策略。 一、环境准备 为了本次实…

ffmpeg采用gpu加速增加水印

1.环境需要 系统 windows10 ffmpeg&#xff0c;ffprobe 字体文件 python3以上版本 2.环境配置 从官网上下载ffmpeg版本https://github.com/BtbN/FFmpeg-Builds/releases&#xff0c;这里我用的是这个&#xff0c;解压之后里面包含ffmpeg&#xff0c;ffprobe&#xff0c;f…

使用Kernel Memory进行RAG评估:AI助力企业知识管理新突破

在现代企业知识管理中&#xff0c;随着业务的不断发展和扩展&#xff0c;各种文档和数据呈现爆炸式增长。为了有效且高效地管理这些知识&#xff0c;企业通常会导入大量文档。然而&#xff0c;当涉及到对文档切片质量和回答准确度的判断时&#xff0c;传统的人工方法显得既费时…

复现dom破坏案例和靶场

目录 1.dom型xss平台 第一关 Ma Spaghet !: &#xff08;1&#xff09;&#xff1a;当get参数中存在somebody时&#xff0c;h2回显 &#xff08;2&#xff09;&#xff1a;当get参数中不存在somebody时&#xff0c;h2回显 第二关Jefff&#xff1a; 第三关&#xff1a;Ugan…

【前端面试】挖掘做过的nextJS项目(中)

https://blog.csdn.net/weixin_43342290/article/details/141170360?spm1001.2014.3001.5501文章浏览阅读105次。需求:快速搭建宣传官网1.适应pc、移动端2.基本的路由跳转3.页面渲染优化4.宣传的图片、视频资源的加载优化5.seo优化全栈react web应用、tailwind css原子工具的支…

动态规划篇--代码随想录算法训练营第三十二天|343. 整数拆分,96.不同的二叉搜索树,01背包理论,01背包优化

343. 整数拆分 题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 讲解视频&#xff1a; 动态规划&#xff0c;本题关键在于理解递推公式&#xff01;| LeetCode&#xff1a;343. 整数拆分 题目描述&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k …

c++47 二级指针

二级指针的输入和输出模型 指针的输入&#xff1a;主调函数分配内存 指针输出 &#xff1a;被调用函数分配内存 指针做输入第一种模型 #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h>// 二级指针做输…