zoukankan      html  css  js  c++  java
  • Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)

    1.建立工程

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

    2.create block design

    clip_image002

    同样,Add IP

    clip_image004

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

    clip_image006

    双击,ZYNQ7 Processing System

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

    选择PS-PL Configuration,Enable M_AXI_GP0 interface

    clip_image008

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

    clip_image010

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

    clip_image012

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

    clip_image014

    点击ok:

    clip_image016

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

    clip_image018

    双击添加AXI GPIO后:

    clip_image020

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

    clip_image022

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

    clip_image024

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

    clip_image026

    出现

    clip_image028

    点击ok,自动连接好了:

    clip_image030

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

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

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

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

    clip_image032

    在Address Editor可以看到:

    clip_image034

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

    clip_image036

    选择Make External,并修改名称

    clip_image038

    整体就是:

    clip_image040

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

    clip_image042

    右键system.bd, 选择Create HDL Wrapper

    clip_image044

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

    clip_image046

    Next,我们create file

    clip_image048

    接下来肯定是要编写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]}]
    

    综合

    clip_image050

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

    clip_image052

    然后选择I/O Planning

    clip_image054

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

    clip_image056

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

    clip_image058

    点击Generate

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

    clip_image060

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

    突然出现错误:

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

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

    clip_image062

    这样继续导入到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 --
    ");
     
        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
    ", psb_check);
    	  dip_check = XGpio_DiscreteRead(&dip, 1);
    	  xil_printf("DIP Switch Status %x
    ", 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文件,看到下面的结果!!

    clip_image064

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

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

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

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

     
     
       
      1. @xzy610030    您好!能不能给我发一下

        xutil.h文件,谢谢!

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

         
      3. 请问你还有没有xutil.h这个文件。能麻烦发个我吗?541984342@qq.com谢谢了
        @xzy610030   @uniquewan
        我现在没有这个环境了,留个邮箱,我给你发个文档。
      4. 匿名用户匿名用户
        @uniquewan
        我也出现了这种情况,想问下你是怎么解决的?"xutil.h是包含在哪个库里面的啊?
      5. @uniquewan
        我现在没有这个环境了,留个邮箱,我给你发个文档。
      6. 你好,我在用zybo板做这个gpio实验室时候,为什么在Include "xutil.h"文件就报错,报错说

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

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

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

  • 相关阅读:
    go函数
    Linux 查看磁盘容量、查找大文件、查找大目录
    五分钟理解一致性哈希算法(consistent hashing)
    使用Java实现三个线程交替打印0-74
    Python实现IOC控制反转
    Wannafly挑战赛5 A珂朵莉与宇宙 前缀和+枚举平方数
    Yandex Big Data Essentials Week1 Scaling Distributed File System
    Yandex Big Data Essentials Week1 Unix Command Line Interface Processes managing
    Yandex Big Data Essentials Week1 Unix Command Line Interface File Content exploration
    Yandex Big Data Essentials Week1 Unix Command Line Interface File System exploration
  • 原文地址:https://www.cnblogs.com/chengqi521/p/7987692.html
Copyright © 2011-2022 走看看