zynq中的PS和PL交互

参考视频:        小白FPGA的个人空间-小白FPGA个人主页-哔哩哔哩视频

EMIO

最小系统

ps给pl的时钟和复位

可以在下面修改时钟和复位,这样的话,出去的引脚就没有复位了

关闭GP接口

去掉pl时钟

添加一个串口的管脚和编号

因为管脚是下面这样的

所以这样给串口

串口的波特率默认就行

配置DDR3的型号

 DDR型号和文章

【ZYNQ】ZYNQ器件的DDR3存储器使用相关知识介绍 - ACZ702开发板 - 芯路恒电子技术论坛 - Powered by Discuz!

根据文档配置型号如下

配置时钟

根据CPU的时钟给的,保持默认

配置电压,不知道为什么这么配置,高的是3.3,低的是1.8

保存最小系统

导入引用最小系统

引出端口信号,然后验证

bd生成底层

bd生成顶层

生成比特流文件

导出硬件

 用vitis打开.xsa文件

查看相应的硬件信息

创建一个vitis应用工程(也可以直接lunch vitis如下图)

选择一个hello world工程

这个时候就能看到application创建成功

查看hello world.c的代码

点击run ,下载程序之前需要的配置

可以查看比特流文件的位置

把如下所示的都勾选上

运行之前要编译一次,编译的方法

下边会显示编译完成

调出vitis的串口调试助手,并且连接FPGA

出现很多的串口,CH开头的COM4是FPGA的串口

然后连接

连接成功

用FPGA跑代码

报错MMU有问题,解决方案是jtag启动

然后找到原理图

将fpga板子上的拨码开关拨到对应位置,问题解决

输出正确结果

对代码做出修改

也可以先clear掉串口的输出,然后重新编写代码,然后再build一次,run一次,查看新一轮的结果。

放大字体

读写DDR

设置读写基地址

从.xsa中,看到ddr的起始地址和结束地址,不要读写的太边界,所以改成0200_0000位基地址。

写代码如下,读写DDR

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"

#define DDR_BASE_ADDR 0x02000000
int main()
{
    init_platform();
    // 强制转换为32位无符号整数
    // u32*两边有,只是为了声明是一个指针变量,没有实际意义,目的是给 指针一个初值
    u32* ptr = (u32*) DDR_BASE_ADDR;

    u32 wr_data = 0;
    u32 rd_data = 0;

    // 写1024个数据
    int i=0;
    for(i = 0 ; i < 1024 ; i++)
    {
    	// ++是先用在加,第一轮 ptr=0,data=0,然后自加,第二轮 ptr=1,data=1
    	*ptr ++ = wr_data++;
    }

    // 打印写DDR结束
    print("wr finish\n");

    // 将指针复位
    ptr = (u32*) DDR_BASE_ADDR;
    i=0;
    for(i = 0 ; i < 1024 ; i++)
    {
    	printf("rd_data=%u \n",*(ptr++));
    }

    print("rd finish\n");
    cleanup_platform();
    return 0;
}

???出现了一个问题,如果想要查看内存中的值,好像必须稳稳的停在debug里面

问题在,没有加号+,猜测是没有进入分步调试的原因

使用GPIO和EMIO

需要实现

创建一个新的工程,使用zynq的IP核,然后导入之前做的最小系统

添加需要的GPIO和1位宽的EMIO

添加一个PL的时钟

点击自动连线

引出GPIT,make external

在GPIO上加一个debug,引入ILA,查看线上的数据

点击自动连线了之后,帮我们生成ILA

然后需要验证设计

生成底层和顶层

底层

生成完毕了,进行综合

通过XDC文件,绑定GPIO的管脚

打开综合,规划管脚

我尝试将信号绑定到LED0的管脚

修改之后摁住ctrl+s 保存即可。

产生比特流文件,然后导出硬件出现报错(已解决)

需要重启板子,或者重新插拔jtag线,或者重启vivado

使用vitis打开刚刚导出的硬件(这里可以直接使用)下面的方法,不用新建工程

这次创建一个空白的应用工程,在里面添加新的文件

创建一个源文件

创建main函数

赛灵思的参考例子代码

导入第二个例子,普通例子

从里面粘贴出需要的头文件

选择PS端的MIO

如图可以看到,8和9的MIO能够作为GPIO使用,MIO7连接了一个LED

怎么设置EMIO

如果选中GPIO MIO之后,选择EMIO之后(也就是将其引出到PL端管脚),位宽是从54开始,如果位宽是1,那么

 PS和PL联合调试,查看ila

要使用ila,这里不做勾选

在vivado中拉出ila

这个时候,断点调试,ila抓到的三个值应该都是0。

如图所示

如果是这个时候,令3个管脚的值都为1,打开ila重新trigger一下,也能看到值都为1

设置sdk一直调试的时候一直循环跑代码

抓取ila的上升沿

如图中的三个信号,第一个是输入,第二个是输出,第三个是使能信号,使能信号为0的时候,输出有效。ila是挂在输出的EMIO上面的,连接到了扩展板的管脚上。

将数据拖到trigger setup中,

可以设置触发条件为该信号的上升沿。

同时也可以抓取信号的下降沿

基于AXI GPIO的实验

这个IP核一次能传输32或者64bit,适用于PS和PL有少量数据需要交互的时候。 通过的是AXI-LITE

AXI interconnect的IP核

能实现跨时钟域,位宽转换,能连很多的从机和主机,能实现仲裁。

可以将之前的工程,直接另存为

然后删除里面SDK

应该是为了避免SDK串台

删除ila和debug

打开一个Master接口

没有解决的问题

vitis没有办法重新进行debug,一直无法重新回到第一行开始调试,除非重启电脑

变量没有办法显示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值