Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)

1.建立工程

首先和Vivado设计一中一样,先建立工程(这部分就忽略了)

2.create block design

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第1张图片

同样,Add IP

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第2张图片

同样,也添加配置文件,这些都和设计一是一样的,没什么区别。

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第3张图片

双击,ZYNQ7 Processing System

下面的就和设计一中有一些不一样了:

选择PS-PL Configuration,Enable M_AXI_GP0 interface

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第4张图片

选择General , Enable Clock Resets 并且选择 FCLK_RESET0_N ,如下:

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第5张图片

选择Clock Configuration,在PL Fabric Clocks 中 选择 FCLK_CLK0

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第6张图片

在MIO Configuration中只留下UART1,其他的如ENET0等都不选(这里和设计一一样)

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第7张图片

点击ok:

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第8张图片

好,现在到我们比较重要的地方了,添加GPIO的IP。点击添加IP按钮

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第9张图片

双击添加AXI GPIO后:

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第10张图片

右键 AXI GPIO,选择Block Properties,修改名称

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第11张图片

然后双击AXI GPIO,勾上 All Input ,width选择为4

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第12张图片

点击ok后,点击Run Connection Automation,选择第一个/sw_4bit/S_AXI

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第13张图片

出现

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第14张图片

点击ok,自动连接好了:

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第15张图片

在添加一个AXI GPIO,过程是一样的,命名为button_4bit

然后设置为all input ,width为4位

再自动连接Run Connection Automation,当然是可以手动拉线的,这里我自动连接了。

当然,为了能清楚的看到整个系统,我拖动了连接好的几个模块,如下:很清晰:

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第16张图片

在Address Editor可以看到:

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第17张图片

接下来我们需要把PL中的AXI GPIO的GPIO连接到PL的外部IO引脚(zynq的PL的IO口)

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第18张图片

选择Make External,并修改名称

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第19张图片

整体就是:

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第20张图片

选择Tools -> Validate Design,使设计生效,没有error

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第21张图片

右键system.bd, 选择Create HDL Wrapper

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第22张图片

下面添加约束文件,vivado的约束文件的是xdc文件而不是ucf文件

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第23张图片

Next,我们create file

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第24张图片

接下来肯定是要编写xdc文件了,如下:

 

set_property PACKAGE_PIN G15 [get_ports {sw_4bit_tri_i[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw_4bit_tri_i[0]}]
set_property PACKAGE_PIN P15 [get_ports {sw_4bit_tri_i[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw_4bit_tri_i[1]}]
set_property PACKAGE_PIN W13 [get_ports {sw_4bit_tri_i[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw_4bit_tri_i[2]}]
set_property PACKAGE_PIN T16 [get_ports {sw_4bit_tri_i[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {sw_4bit_tri_i[3]}]

set_property IOSTANDARD LVCMOS33 [get_ports {button_4bit_tri_i[3]}]
set_property PACKAGE_PIN Y16 [get_ports {button_4bit_tri_i[3]}]
set_property PACKAGE_PIN V16 [get_ports {button_4bit_tri_i[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {button_4bit_tri_i[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {button_4bit_tri_i[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {button_4bit_tri_i[0]}]
set_property PACKAGE_PIN P16 [get_ports {button_4bit_tri_i[1]}]
set_property PACKAGE_PIN R18 [get_ports {button_4bit_tri_i[0]}]

 

综合

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第25张图片

综合完毕,下面几步是可以不做的,但是检查一下也无妨,可以直接跳到产生output products

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第26张图片

然后选择I/O Planning

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第27张图片

如果不是如下的需要修改成如下的:我的没有做任何的修改

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第28张图片

关闭,回到主界面:产生output products

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第29张图片

点击Generate

然后就是产生bit流文件了。Open Implemented Design

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第30张图片

接下来就是熟悉的导入到SDK了

突然出现错误:

Failed to run "export_hardware" for "system". This diagram is not currently open. "export_hardware" works only for active block diagrams.

提示是没有打开block diagrams.,那就打开呗,双击

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第31张图片

这样继续导入到SDK,这样就很欢快的可以了。Go on

然后和设计不一样的是这里我们新建的不是mem_test(之前是利用模板),我们这里使用的空工程,然后我们自己写一个应用程序。

应用程序如下:

 

#include "xparameters.h"
#include "xgpio.h"
#include "xutil.h"
  

//====================================================

int main (void) 
{

    XGpio dip, push;
	int i, psb_check, dip_check;
	
    xil_printf("-- Start of the Program --\r\n");
 
    XGpio_Initialize(&dip, XPAR_SW_4BIT_DEVICE_ID);
	XGpio_SetDataDirection(&dip, 1, 0xffffffff);
	
	XGpio_Initialize(&push, XPAR_BUTTON_4BIT_DEVICE_ID);
	XGpio_SetDataDirection(&push, 1, 0xffffffff);
	

	while (1)
	{
	  psb_check = XGpio_DiscreteRead(&push, 1);
	  xil_printf("Push Buttons Status %x\r\n", psb_check);
	  dip_check = XGpio_DiscreteRead(&dip, 1);
	  xil_printf("DIP Switch Status %x\r\n", dip_check);
	  
	  for (i=0; i<9999999; i++); 
	}
 
}
 
至于应用程序中的怎么理解我在之前博客说过了,见:

 

 

zynq正确的使用GPIO:http://blog.chinaaet.com/detail/34965

 

zedboard的GPIO实验:http://blog.chinaaet.com/detail/34982

这里就不啰嗦了。

 

 

编译生成elf文件

先下载bit流,在下载elf文件,看到下面的结果!!

Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第32张图片

这篇博客和之前基于zedboard的ISE的内容是类似

zedboard--zynq使用自带外设IP让ARM PS访问FPGA

http://blog.chinaaet.com/detail/34609

感觉这个用vivado来开发zybo和ISE开发zedboard有点类似,上手还挺快的,不过感觉vivado貌似确实比ISE要快些。下一次肯定就是要添加自定义的IP核了,这个用ISE也实现过的,跑完了再与网友一起分享吧。

» 下一篇:STM32 Printf函数实现方法(转载)
« 上一篇:vivado设计一:建立第一个入门工程(基于zybo)
 
 
   
    1. ZhognwangZhang 
      @xzy610030    您好!能不能给我发一下

      xutil.h文件,谢谢!

       

      回复
    2. ***此内容已被管理员屏蔽***

       
    3. pantheryu 
      请问你还有没有xutil.h这个文件。能麻烦发个我吗?[email protected]谢谢了
      @xzy610030   @uniquewan
      我现在没有这个环境了,留个邮箱,我给你发个文档。

       

      回复
    4. Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)_第33张图片 匿名用户
      @uniquewan
      我也出现了这种情况,想问下你是怎么解决的?"xutil.h是包含在哪个库里面的啊?
      回复
    5. xzy610030 
      @uniquewan
      我现在没有这个环境了,留个邮箱,我给你发个文档。
      回复
    6. uniquewan 

      你好,我在用zybo板做这个gpio实验室时候,为什么在Include "xutil.h"文件就报错,报错说

      no such file or directory。想请你帮忙解答下。

      注释掉这个include就可以编译通过,但是上板只是打印Start of the Program ,没有后面的dip的状态显示

       

       

      转载:http://blog.chinaaet.com/xzy610030/p/35795

你可能感兴趣的:(Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo))