zoukankan      html  css  js  c++  java
  • 基于Vivado的嵌入式开发 ——PS+PL实践

    基于Vivado的嵌入式开发

    ——PS走起

    硬件平台:ZedBoard

    开发工具:Vivado 2014.2

    1、规划

    废话不多说,依然是流水灯,这次是采用PS+PL实现。

    功能依旧简单,目标是为了学习IP核的添加方式、熟悉嵌入式系统设计界面、熟悉Vivado下ChipScope的使用方法。

    1) 项目功能:流水灯

    2) 编程语言:C

    3) 设计流程:建立工程à添加ARM内核、GPIO IPà综合、实现、烧写à板级测试(此处不再给现象,和上一篇相同)

    2、设计

    整体框图为:

    核心功能由ARM软件实现。添加PL部分的GPIO IP主要目的是熟悉IP添加流程,如何和ARM内核连接,从而组建嵌入式系统。IP功能是从总线上取出数据,送至8个LED。

    3、总结

    这次来个倒叙,先上使用感受

    1) Vivado将所有功能集成到一个框架下,不像原来那样在设计过程中需要在各工具之间不断切换主界面,使整个设计流程更加清晰、流畅。界面也有所美化,赞一个!

    2) 虽然是第一次用Vivado做嵌入式设计,但也不是说和XPS、PlanAhead天差地别,变化主要是在原先由XPS完成的部分,其他和PlanAhead的使用是比较类似的。整个设计过程都是自己摸索出来,总体来说还是挺顺利的,所以,想上手Vivado的朋友不必担心不适应。

    3) 对于嵌入式设计(准确的说是Block Design)而言,去除了一些自动连线,使开发人员手动或者利用工具完成整个连线过程,可以帮助开发人员更好地熟悉一些信号、总线(有可能糊里糊涂也能搞定,保险起见还是了解一下更好)。这貌似也从一个侧面展现了Vivado开发团队“自动化设计方式,不强制设计方式”设计理念。

    4) 嵌入式设计虽然比纯逻辑开发更加复杂,使用了硬核PS7和软核GPIO,但整个design实现的时间并没有大幅度增加,我的主观感觉反而是比纯逻辑开发耗的时间更短。由此可见Vivado在复杂设计上面要优于ISE。

    5) 通过查看Vivado的工程目录发现,Vivado的工程目录相当清晰,不像ISE那样,各种文件的堆在一个文件夹下。但是这种工程文件的组织也有缺点——会导致一些文件路径很长。

    4、添加资源

    工程的建立,可以参考《Vivado实现纯逻辑开发——从最简单的开始》。

    4.1、创建Block

    在左侧的Flow Navigator子窗口找到IP Integrator(默认展开),找到该目录下的Create Block Design命令并单击。

    图2

        命名为system,如图3所示。

    图3

        进度条跑完之后界面发生变化,出现了Diagram子窗口,Sources自选项卡右边多出了3个选项卡,如图4所示

    图4

    4.2、添加cpu

        在Diagram子窗体中找到Add IP按钮,位置如图5所示的红色方框内。

    图5

        点击按钮后,弹出IP搜索对话框,如图6所示。

    图6

        输入system,对IP进行过滤,结果如图7所示。

    图7

        双击ZYNQ7 Processing System,会自动添加该IP,结果如图8所示。

    图8

    除了双击之外,还可以选中后回车;还可以选中后拖拽至Diagram窗口中释放。

    4.3、添加其他IP

    用4.2小节所述的方法添加GPIO IP。添加完成后的情形如图9所示。

    图9

    在XPS中添加AXI IP时,XPS会自动完成总线连接,创建相关端口,Vivado默认不做任何工作。还可以看到总线的时钟和复位信号被单独拿了出来,如果没记错的话,之前是和其他总线信号放在一起的,封装在BUS_INTERFACE中的。

    4.4、端口连接和IP配置

    图9中可以看到Run Block Automation和Run Connection Automation选项,Run Block Automation可以为模块创建端口,Run Connection Automation可以完成端口的自动连线。

    点击Run Block Automation,进入图10所示的界面。

    图10

    看一下注释,该过程是将开发板的预设置导入进来,并且将FIXED_IO(MIO)、DDR接口生成外部连接端口。OK,进度条跑完之后,界面发生变化,如图11所示。

    图11

    DDR,FIXED_IO已经连接到端口,还多出了TTC0_WAVE0_OUT等选项,应该是对PS7进行了参数配置造成的,双击PS7可以对之进行配置,界面如图12所示,和XPS中大同小异,配置过程不多说了,这里没有改动。

    图12

        双击GPIO IP对之进行配置,主要是将位宽改为8bits,如图13所示。

    图13

    点击Run Connection Automation,选择,如图14所示。

    图14

        弹出对话框如图15所示,提示将gpio的AXI接口映射到主端的地址空间。还询问是否自动连接时钟,这里不管它,直接OK。

    图15

    连线结果如图16所示。

    图16

        系统自动添加了互联模块(AXI Interconnect,和XPS相同)和一个时钟、复位控制模块。

        再次Run Connection Automation,将GPIO连接到输出端口,在图17所示对话框中选择开发板端口为leds_8bits。

    图17

        终于完成了,不容易啊,最终结果如图18所示。

    图18

    4.5、为Block Design创建wrapper文件

        点击Sources自选项卡,按照图19的指示为该Block Design创建wrapper文件,bd文件是不可以作为设计顶层的,为了方便顶层调用,需要为之生成一个wrapper文件。

    图19

        选择让Vivado帮助我们管理wrapper文件,如图20所示。

    图20

    4.6、添加约束文件

    这里我也不确定是否需要添加DDR和MIO相关引脚的约束,暂时不管他们。由于所有连接都是自动完成的,有理由相信Vivado为这些引脚做了约束,所以,这里我忐忑的偷个懒,不写约束代码,直接Generate Bitstream。

    果然直接过了,估计没问题了,转战SDK。

    图21 启动sdk

    将硬件导出(1、FileàExport Hardware 2、FileàLaunch SDK,相当于PlanAhead和XPS的Export Hardware & Launch SDK)。进入SDK欢迎界面后,SDK会自动导入硬件信息,如图22所示。

    图22

    5、软件设计

        SDK的使用不多说了,和之前的变化不大,直接上代码。

    #include <stdio.h>
    #include "platform.h"
    #include "xparameters.h"
    #include "xgpio.h"
    #include "sleep.h"
    
    
    /************************** Constant Definitions *****************************/
    
    /*
     * The following constant maps to the name of the hardware instances that
     * were created in the EDK XPS system.
     */
    #define XPAR_LEDS_ID XPAR_AXI_GPIO_0_BASEADDR
    
    
    /*
     * The following constant is used to determine which channel of the GPIO is
     * used for the LED if there are 2 channels supported.
     */
    #define LED_CHANNEL 1
    
    /************************** Variable Definitions *****************************/
    
    /*
     * The following are declared globally so they are zeroed and so they are
     * easily accessible from a debugger
     */
    
    XGpio Gpio; /* The Instance of the GPIO Driver */
    
    int main()
    {
        init_platform();
        u8 i=0;
        int Status;
    
    	/*
    	 Initialize the GPIO driver
    	*/
    	Status = XGpio_Initialize(&Gpio, XPAR_LEDS_ID);
    	if (Status != XST_SUCCESS) {
    		return XST_FAILURE;
    	}
    
    	/*
    	 Set the direction for all signals to be outputs
    	*/
    	XGpio_SetDataDirection(&Gpio, LED_CHANNEL, 0x00);
    
    	/*
    	 Loop forever run the LED
    	*/
        while(1)
        {
        	for(i=0;i<8;i++)
        	{
    			XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, (1<<i));
    			sleep(1);
        	}
        }
    
        return 0;
    }

        搞定,流水灯跑起来了。

    6ChipScope观测内部信号

    本来想在这一篇学一下ChipScope,写着写着发现又变成一篇长文,所以还是放在后面吧。

    版权声明:

    本文由博主“cuter”发布。欢迎转载,但不得擅自更改博文内容,也不得用于任何盈利目的。转载时不得删除作者简介和版权声明。如有盗用而不说明出处引起的版权纠纷,由盗用者自负。

    博客官方地址:

    ChinaAET:http://blog.chinaaet.com/cuter521

    EDN China: http://bbs.ednchina.com/BLOG_cuter521_356737.HTM

    转载:http://blog.chinaaet.com/cuter521/p/35978

  • 相关阅读:
    etcd扩展使用
    etcd注册服务
    net core微服务构建方案
    一个简化的插件框架c#
    NSQ消息队列
    c#一些处理解决方案(组件,库)
    c#网络传输
    c#的传输组件dotnetty
    c#网络加密传输
    C++ Boost在Windows和Linux下的编译安装
  • 原文地址:https://www.cnblogs.com/chengqi521/p/8078863.html
Copyright © 2011-2022 走看看