0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Vivado中进行ZYNQ硬件部分设计方案

454398 来源:xilinx社区 作者:xilinx社区 2020-11-03 12:33 次阅读

ZYNQ概述

ZYNQ内部包含PS和PL两部分,PS中包含以下4个主要功能模块:

  • Application processor unit (APU)
  • Memory interfaces
  • I/O peripherals (IOP)
  • Interconnect

ZYNQ内部的总体框架如所示,PS中包含2个ARM Cortex-9的内核,一些基本的外设扩展口以及Memory接口。PS和PL的相互通信通过两个通路完成,分别是GP(General Purpose)Ports和HP(High Performance)Ports。

GP Ports包含2个Master接口和2个Slave接口,符合标准的AXI协议数据位宽是32bit。HP Ports包含4个接口,全部是PL作为Master;有两个专用的连接到DDR Controller的接口和一个连接到OCM的接口。HP与GP相比,最大的特点在于有额外的FIFO作为Buffer,可以提高传输效率和数据吞吐量。

所以从功能角度,GP Ports主要用于寄存器的读写以及小数据量的传输;HP Ports用于大量数据的传输,主要是Memory数据的读写。

ZYNQ中最常用的设计思路是将主程序放在PS中完成,在PL中设计相应的逻辑功能作为PS的外设使用,将逻辑设计封装成IP,且每个IP都包含一个标准的AXI-Lite接口。PS对于逻辑设计的控制是通过控制逻辑设计的功能寄存器,进而控制逻辑设计进行相应的操作,同时将工作情况通过状态寄存器返回给PS端。如果逻辑设计与PS端需要进行大量数据的交互,则会在逻辑设计中增加AXI-Full接口,与PS的HP Port相连。

综上,ZYNQ设计的基本流程包含以下步骤:

1. Vivado中搭建ZYNQ平台,完成基本外设控制。
2. 创建逻辑设计,并封装成IP。
3. ZYNQ设计中调用封装的IP。
4. 对设计的IP进行仿真

ZYBO开发板简介

ZYBO是Digilent开发的以XC7Z010-1CLG400C为核心处理器的开发板,其主要功能包括有:

  • 1片32bit位宽,512MB容量的 DDR3
  • 1个 HDMI port
  • 1个VGA source port
  • 1个(1Gbit/100Mbit/10Mbit) Ethernet PHY 与RJ45接口
  • 1个MicroSD slot
  • 1个OTG USB 2.0 PHY
  • 1个外部 EEPROM
  • 1个耳机输出接口和1个麦克风输入接口
  • 1片128Mb QSPI Flash作为加载Flash
  • 1个JTAG接口和1个USB-Converter下载接口
  • GPIO: 6 pushbuttons, 4 slide switches, 5 LEDs
  • 6个 Pmod ports

其板上器件分布情况如图 2和图 3所示。


Vivado中进行ZYNQ硬件部分设计

Step1: Viavdo中选择XC7Z010-1CLG400器件,建立工程。

Step2: 建立Block Design。

Step3: 加入ZYNQ7 Processing System和其他所需要的外设IP。

点击“Add IP”,加入ZYNQ7 Processing System和AXI GPIO,双击IP可以对其进行配置。该实验中ZYNQ7配置使能UART,引脚为MIO48和49,其ZYBO相关电路图如图 5所示。(注:如果需要在Step11中选择Hello World工程,则需要使能UART)。AXI GPIO的位宽设置为4,其余为默认配置。


注意:这里有个地方非常容易出错。在Vivado建立工程选择器件的过程中没有选择ZYBO开发板的配置,而是直接选择的XC7Z010-1CLG400C器件的配置。系统默认的ZYNQ7 Processing System配置中Input Clock Frequency是33.3333MHz,而ZYBO板上为50MHz。此处必须修改过来,否则后面的系统时钟会完全错乱,导致软件工程无法运行。

Step4: 点击“Run Block Automation”,其作用是完成ZYNQ7 Processing System专用引脚的连接,包括FIXED_IO和DDR引脚的连接。

Step5: 点击“Run Connection Automation”,其作用是自动完成ZYNQ与外设的连接,连接是按照工具对于用户所设计系统的理解,如果需要进行修改,可以手动更改Block中的连线。该操作工具会默认增加:

1. AXI interconnect
2. Processor System Reset
3. 自动完成了外设IP的AXI-Lite端口与ZYNQ7 Processing System的连接,默认接法是ZYNQ的FCLK_CLK0作为外设AXI时钟,Processor System Reset产生外设复位信号连接到所有外设的复位端口。
4. 将AXI GPIO的引脚引出。

可以使用“Regenerate Layout”,重新布局Block Design。

Step6: 在“Address Editor”中查看、修改外设在总线上的地址。

Step7: 首先在Block design界面右击弹出的菜单中点击Validate Design,以验证Block Design的设计和连接是否有错误。至此Block Design完成了,但是还需要根据Block Design的配置生成相应的源代码。右击.bd设计,并选择“Create HDL Wrapper”。随后即生成了相应的HDL代码。

Step8: 对于PL端的外接引脚,需要设置相应的Constraints。

Step9: 与普通FPGA设计一样,完成Synthesis、Implementation和Generate Bitstream。

Step10: 将Step9中完成的硬件设计导入到SDK开发平台下。

Step11: 从这一步开始,开发平台转移到SDK平台。此时硬件平台已经确定,接下来是软件的开发。首先在SDK中建立软件工程。


Step12: 在新建工程中完成C代码的设计。

#include
#include
#include "xparameters.h"
#include "sleep.h"
#include "platform.h"

int main()
{
XGpio output;
int Status;
/*
* Initialize the GPIO driver so that it's ready to use,
* specify the device ID that is generated in xparameters.h
*/
Status = XGpio_Initialize(&output, XPAR_GPIO_0_DEVICE_ID);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
/* Set the direction for all signals to be outputs */
XGpio_SetDataDirection(&output, 1, 0x0);
init_platform();
while(1){
usleep(200000); //delay
XGpio_DiscreteWrite(&output, 1, 0x0);
usleep(200000); //delay
XGpio_DiscreteWrite(&output, 1, 0xF);
};
cleanup_platform();
return 0;
}

Step13: 首先点击“Program FPGA”,将硬件平台下载到ZYNQ中。

Step14: 运行软件工程进行调试。

在ZYBO板上也能看到LED灯闪烁,至此完成了ZYNQ的一个基本设计的所有开发流程。

DK中进行ZYNQ软件部分设计

首先对“Vivado中进行ZYNQ硬件部分设计”中让LED闪烁的C代码做详细的注释。

int main()

{

/*定义外设对于的类型指针,用于绑定外设,便于后面程序调用时选择

* 外设

*/

XGpio output;

int Status;

/* XGpio_Initialize()函数是xgpio.c中的函数,在BSP Documentation可以

* 查到该函数的描述。

* int XGpio_Initialize(XGpio * InstancePtr, u16 DeviceId)

* InstancePtr为GPIO类型的指针

* DeviceId是在板级配置中已经定义好的外设的ID,该定义包含在BSP的xparameters.h中

* 即在xparameters.h已经为该硬件设计中的每一种类型的多个外设设置了唯一的ID

* 例如设计中如果有2个GPIO外设,则ID分别为0和1.

* 该语句完成之后将ID对应的外设对象与该指针进行了绑定,后面可以通过调用该指针指

* 定到该外设

*/

Status = XGpio_Initialize(&output, XPAR_GPIO_0_DEVICE_ID);

if (Status != XST_SUCCESS) {

return XST_FAILURE;

}

/* void XGpio_SetDataDirection (XGpio * InstancePtr,

* unsigned Channel,u32 DirectionMask )

* InstancePtr:外设指针,用于指定到对应的外设设备,已经与外设绑定

* Channel: 每个AXI_GPIO中可以有两个32bit的GPIO端口,该参数用来

* 选择是该外设中的哪一个端口

* DirectionMask:选择GPIO的方向,0为output,1为input

* 该函数的作用是设置GPIO的方向,如前所述,可以通过output指定到

* 该GPIO外设,

*/

XGpio_SetDataDirection(&output, 1, 0x0);

//初始化ARM内核

init_platform();

while(1){

usleep(200000); //delay

XGpio_DiscreteWrite(&output, 1, 0x0);

usleep(200000); //delay

XGpio_DiscreteWrite(&output, 1, 0xF);

};

cleanup_platform();

return 0;

}

以上调用的这些函数,其定义及使用方法全部可以在BSP(Board Support Package)板级支持包中找到。当在Vivado平台中设计完成硬件,将其导入到SDK平台时,工具会根据硬件设计中使用到的外设,自动生成相应的板级支持包。在SDK的“Project Explorer”界面中可以查看,并且可以在其中打开相应的BSP说明文档,如图 18所示。

但是虽然BSP中提供了所有相关的API函数,但是对于初学者来说,想搭建一个可以实现基本功能的平台还是有些困难。于是另一个方法是利用SDK生成新的Application时提供的Peripheral Test模板。

该模板生成的代码中,在主函数中找到相应外设的测试函数,例如本例中GPIO的测试函数“GpioOutputExample()”,再通过追述该函数的具体实现,可以一定程度上作为最基本的范例代码。

如果再进一步深入到ARM编程的本质,其实与硬件的所有控制和通信都是依靠读写底层的寄存器来完成的。例如如果查看一下“XGpio_SetDataDirection()”函数的底层实现,可以发现逐级调用的分别是“XGpio_WriteReg()”函数和“XGpio_Out32()”函数,而“XGpio_Out32()”调用的是“Xil_Out32()”。 其实“Xil_Out32()”和“Xil_In32()”这两个函数分别是写读底层硬件寄存器的两个函数,所有的上层与底层的寄存器级别的通信,也就是绝大多数的外设控制,都是依靠这两个函数完成的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1630

    文章

    21762

    浏览量

    604478
  • 寄存器
    +关注

    关注

    31

    文章

    5357

    浏览量

    120733
  • Zynq
    +关注

    关注

    10

    文章

    610

    浏览量

    47219
  • Vivado
    +关注

    关注

    19

    文章

    813

    浏览量

    66689
收藏 人收藏

    评论

    相关推荐

    ZYNQ基础---AXI DMA使用

    前言 在ZYNQ中进行PL-PS数据交互的时候,经常会使用到DMA,其实在前面的ZYNQ学习当中,也有学习过DMA的使用,那就是通过使用自定义的IP,完成HP接口向内存写入和读取数据的方式。同样
    的头像 发表于 01-06 11:13 160次阅读
    <b class='flag-5'>ZYNQ</b>基础---AXI DMA使用

    LM4890采用差分设计方案,为什么没有声音?怎么解决?

    1、LM4890采用差分设计方案(如下图),为什么没有声音?怎么解决? 2、采用差分方案设计的功放能用非差分输出或普通音频输出?
    发表于 11-05 06:33

    Vivado使用小技巧

    有时我们对时序约束进行了一些调整,希望能够快速看到对应的时序报告,而又不希望重新布局布线。这时,我们可以打开布线后的dcp,直接在Vivado Tcl Console里输入更新后的时序约束。如果调整
    的头像 发表于 10-24 15:08 380次阅读
    <b class='flag-5'>Vivado</b>使用小技巧

    AMD Vivado Design Suite 2024.1全新推出

    eXchange ( DFX ) 进行了全面增强。Power Design Manager 新增了对 AMD Zynq RFSoC 系列的支持。
    的头像 发表于 09-18 09:41 521次阅读

    使用霍尔效应传感器在电子智能锁中进行位置感应应用说明

    电子发烧友网站提供《使用霍尔效应传感器在电子智能锁中进行位置感应应用说明.pdf》资料免费下载
    发表于 09-12 14:03 0次下载
    使用霍尔效应传感器在电子智能锁<b class='flag-5'>中进行</b>位置感应应用说明

    电磁频谱管理系统设计方案

    智慧华盛恒辉电磁频谱管理系统设计方案是一个综合性的项目,旨在有效地管理和利用电磁频谱资源,确保各种无线通信服务的顺畅进行,并避免频谱资源的冲突和浪费。以下是一个基于当前技术和应用需求的电磁频谱管理
    的头像 发表于 07-15 16:40 505次阅读

    UPS系统设计方案解读

    UPS的应用场景日趋多样化,每个场景都有其独特的需求,对应不同的方案。UPS系统方案指南继续上新,本文将聚焦UPS设计方案展开讲述。
    的头像 发表于 06-26 10:06 851次阅读
    UPS系统<b class='flag-5'>设计方案</b>解读

    一个更适合工程师和研究僧的FPGA提升课程

    设计; ● UltraFast 设计方法; ● 使用UltraScale和UltraScale+架构进行设计; ● FPGA 功耗最优化; ● 使用 Vivado Design Suite 4
    发表于 06-05 10:09

    简谈Xilinx Zynq-7000嵌入式系统设计与实现

    设计。 最大优点可实现硬件加速: 设计者可以根据需求在硬件实现和软件实现之间进行权衡,使所设计的嵌入式系统满足最好的性价比要求,例如,在实现一个嵌入式系统设计时,当使用软件实现算法成为整个
    发表于 05-08 16:23

    Xilinx ZYNQ 动手实操演练

    Vivado 2017.2安装教程,说了这么多,下面介绍一下开发硬件环境Zynq 7000 XC7Z100,Zynq 7000系列中顶配型号,Zy
    发表于 05-03 19:28

    简谈Xilinx Zynq-7000嵌入式系统设计与实现

    需求在硬件实现和软件实现之间进行权衡,使所设计的嵌入式系统满足最好的性价比要求,例如,在实现一个嵌入式系统设计时,当使用软件实现算法成为整个系统性能的瓶颈时,设计人员可以选全可编程SoC内使用硬件逻辑
    发表于 04-10 16:00

    AR眼镜_AR智能眼镜芯片|主板|光机硬件设计方案

    AR智能眼镜芯片|主板|光机硬件设计方案。我们建议选用联发科MT6765芯片,这款芯片搭载了先进的8核CPU和IMG GE8320 GPU,支持高性能计算和图形处理,能够满足AR眼镜的各种应用需求
    的头像 发表于 03-22 20:16 1089次阅读
    AR眼镜_AR智能眼镜芯片|主板|光机<b class='flag-5'>硬件</b><b class='flag-5'>设计方案</b>

    STM32WLE5 LORA硬件设计的几个问题求解

    芯片射频滤波电路有两种设计方案,一种用分立的电阻电容器件设计,另一种用巴伦设计方案。针对巴伦设计方案,我看到有些视频中说用在射频接收功能部分,但我看巴伦的介绍文档,它既有针对射频芯片发
    发表于 03-12 07:18

    请问FX3的UART口和Xilinx ZYNQ7000的PS端的UART进行硬件连接需要TTL电平转换吗?

    想让FX3的UART口和Xilinx ZYNQ7000的PS(Processor system)端的内置UART相互通信,两个芯片使用的是同一个电源(同在一块板子上或分别在两块相互连接的板子上),请教一下它们之间的硬件连接需要TTL电平转换(使用2块MAX3232ESE芯
    发表于 02-28 08:32

    TC234在boot中进行Deinit CANFD失败了的原因?

    大家好: 问题描述:项目已从启动切换到应用程序。 如果在应用程序中使用不同的 MO 并以相同的 ID 启动,则无法接收应用程序中的消息。 我本来希望在 boot 中进行 Deinit CANFD,但我失败了。 预期的解决方案
    发表于 01-31 06:31