VIVADO+ZYNQ7000入门三,PS与PL的联合开发

一、目标

熟悉PS的底层硬件控制、熟悉PS与PL联合开发。

二、预备知识

我们从Xilinx的官方文档UG585的第二章可以了解到,PS与PL数据交换主要就是通过AXI总线,此外还有时钟/中断、DMA等控制信号接口。详细的各部分功能框图如下。
在这里插入图片描述
UG585的第四章可以看到ZYNQ上ARM核的地址空间分配情况。
在这里插入图片描述
第14章可以了解到如何配置、读写EMIO。
在这里插入图片描述

三、工程实例

空白工程的创建请参照VIVADO+ZYNQ7000入门一博文。

工程建立好以后,首先添加一个IP block,点击1处,在2处输入名称,点击OK,
在这里插入图片描述
在新窗口中,点击1处添加IP,在2处搜索zynq,双击3处。
在这里插入图片描述
双击下图1处可以自动布线,双击2可以配置CPU的功能引脚,这部分可以参照VIVADO+ZYNQ7000入门二
设置一下flash的引脚、内存型号选择、延迟补偿等。
在这里插入图片描述
在本工程中,我们设置一组8位宽度的MIO从PS输出给PL。
在这里插入图片描述
在新建立的系统模块里,默认会有有个复位信号从PS端输出给PL端,同时会默认有一个时钟源提供给PL。
在这里插入图片描述
在这里插入图片描述
初步效果是这样。
在这里插入图片描述
在下图1的位置点击一下会展开GPIO,鼠标放置在2处标识输出端口处,然后右键,弹出窗口中选择3的位置,创建端口。
在这里插入图片描述
弹出窗口可以默认直接点击OK即可。
在这里插入图片描述
输出的IO数据,我们可以连接到内置的一个叫VIO的IP核上,它的作用类似于逻辑分析仪。
空白窗口处点击鼠标右键,然后选择add ip。
在这里插入图片描述

在这里插入图片描述

双击配置新的IP,只需要输入填1、输出填0,然后设置输入位宽为8.
在这里插入图片描述

验证提示问题,有一个时钟源需要去掉。
把下面的勾选项去掉。
在这里插入图片描述
各IP连线很方便,只需要把鼠标放到端口的位置,拖动鼠标到另一端即可实现连线。
模块添加完后,生成一个工程的配置文件。
Sources 栏,design system上点击鼠标右键,选择Create HDL Wrapper。在弹出窗口中默认,点OK。
在这里插入图片描述
配置完成后,执行编译,因为添加了新的IP核,注意IP模块除了CPU以外,其它的IP都是运行在PL上的。弹出窗口中,默认选项,然后点击OK。
在这里插入图片描述
后面需要生成一个可以下载到开发板的bit文件。弹出窗口默认配置,点OK,yes。
编译过程有点漫长!编译完成后弹出一个窗口,可以选择cancel,如果选Ok的话,会打开综合布局布线效果。这里暂时不做介绍。
在这里插入图片描述
下一步像入门二一样的操作,把生成的硬件信息导出,然后链接到SDK里面。File–export–export hardware ,这里需要选择include bitstream。然后执行File – launch SDK。
在这里插入图片描述

四、SDK开发

File - new - Application Project,输入工程名字,点击next,然后选择empty Application,点击Finish。

src上右键,新建一个C文件。弹出窗口中输入文件名,注意需要加.c 后缀。
在这里插入图片描述
拷贝下面代码。

/*
 * emio.c
 *
 */

#include "xparameters.h"
#include "xil_io.h"

#define DIRM 0x00000284 //方向控制寄存器地址
#define OEN 0x00000288  //是能控制寄存器地址

#define DATA  0x00000048 // BANK2 数据寄存器地址


int main( )
{
    
    
	u8 data;
	u32 receive;
	volatile int Delay;

	data = 0xAA;

	Xil_Out32(XPAR_XGPIOPS_0_BASEADDR + DIRM,0xFF);
	Xil_Out32(XPAR_XGPIOPS_0_BASEADDR + OEN,0xFF);

	receive = Xil_In32(XPAR_XGPIOPS_0_BASEADDR + DATA);  //读出当前输入输出配置

	receive = receive & 0xFFFFFF00; //只改变需要的通道,设置为输出

	receive = receive | data; // 把设置值写入到控制寄存器

	Xil_Out32(XPAR_XGPIOPS_0_BASEADDR + DATA,receive);

	while(1)
	{
    
    
		data = ~data;  //数据隔一段时间取反一次

		receive = Xil_In32(XPAR_XGPIOPS_0_BASEADDR + DATA);

		receive = receive & 0xFFFFFF00;

		receive = receive | data;

		Xil_Out32(XPAR_XGPIOPS_0_BASEADDR + DATA,receive);

		for (Delay = 0; Delay < 100000000; Delay++);
	}

	return 1;
}

然后点击Project 下的Build all,或者直接Ctrl + B。编译过程中如果提示头文件错误,可以查看最右侧看一下包含的文件有没有错误提示,一般会提示解决方法,比如按F5刷新。

五、下载运行

依次点击下图中的1、2,把vivado编译好的bit文件下载到目标板卡上,记得下载前,连接好JTAG、板卡上电。
在这里插入图片描述
下一步需要把应用程序下载到板卡上,右键点击GPIO。
在这里插入图片描述
弹出串口中,选择 Run As – Launch on Hardwre
在这里插入图片描述
现在回到Vivado的主界面,找到左侧Program and Debug 项,点击 Generate Bitstream。过程完成后会弹出一个小窗口,如下图右侧所示,选择 Open Hardware Manage。
在这里插入图片描述
点击Open target,然后选择 Auto Connect。
在这里插入图片描述
这时会看到hw_vios 窗口,点击“+”,双击下图中蓝色背景处。
在这里插入图片描述
这样IO上的数据就通过vio监测到了,我们可以看到Value列依次从55变到AA。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/malcolm_110/article/details/108339193