cuter

基于Vivado的嵌入式开发 ——PS+PL实践

0
阅读(20091) 评论(35)

基于Vivado的嵌入式开发

——PS走起

硬件平台:ZedBoard

开发工具:Vivado 2014.2


1、规划

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

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

1) 项目功能:流水灯

2) 编程语言:C

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

2、设计

整体框图为:


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

3、总结

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

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

2) 虽然是第一次用Vivado做嵌入式设计,但也不是说和XPSPlanAhead天差地别,变化主要是在原先由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 AutomationRun Connection Automation选项,Run Block Automation可以为模块创建端口,Run Connection Automation可以完成端口的自动连线。

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


10

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

11

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

12

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


13

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

14

    弹出对话框如图15所示,提示将gpioAXI接口映射到主端的地址空间。还询问是否自动连接时钟,这里不管它,直接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、添加约束文件

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

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


21 启动sdk


将硬件导出(1FileàExport Hardware 2FileàLaunch SDK,相当于PlanAheadXPSExport 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

  1. @xiaoniuxxq   

    你好,我也是遇到了这个问题,请问您是怎么解决的?不胜感激

    在新建工程选择器件的时候,楼主默认选择了zedboard开发板,所以应该vivado自动给配置了相关管脚。如果自己选择了其他开发板或者芯片,应该要自己重新去配置管脚才能继续generate bitstream

  2. @undefined  

    @cuter

    楼主您好!

    刚刚接触这块板子,正在学习。用的是vivado2014.3版本的,按照您的步骤做的,在Run Connection Automation 连接GPIO时,没有出现17所示的对话框,没法选择选择开发板端口为leds_8bits。所以自己加了约束文件,但launch到SDK时,代码复制的您的,但报错找不到 #include "platform.h"。求解答

    你好,我也是遇到了这个问题,请问您是怎么解决的?不胜感激

  3. @Li201509   
    你好,我也遇到了你这个问题,请问你是怎么解决的?                                                                                    

    同问,请问解决了吗??

  4. @pilijie   

    我只是把工程导入到sdk中,在sdk中创建了一个空的工程,创建后是好的,加入c文件后,就不行了,就出现了两个错误,一直消不了 

    同问,那个.elf的问题一直消不掉,请问解决了吗??

  5. @zsw_halo   

    你好 我想问一下 为什么LED_CHANNEL 是1?如果我添加多个AXI_GPIO 核 是不是每个程序内的CHANNEL值都是1 ?谢谢

    AXI_GPIO IP核是支持2个Channel的,所以驱动程序里面的函数有一个参数用来指明要操作哪个通道,操作Channel 2的时候,传入的参数当然就是2而不是1了。可以看一下操作函数的注释,里面有提到。

  6. 你好 我想问一下 为什么LED_CHANNEL 是1?如果我添加多个AXI_GPIO 核 是不是每个程序内的CHANNEL值都是1 ?谢谢

  7. @xiezhicong_whu    你好,cuter!我还是不太清楚ARM和FPGA是如何传输数据的,ARM给FPGA发送数据的时候不需要给一个类似脉冲信号的东西,告诉FPGA有新的数据需要读取吗?希望能够给我解答,感激不尽。

    需要啊,一般来说通信都是有协议的,即便是自定义的通信,也要有个自定义的协议吧?Zynq采用的协议有AXI-Lite,AXI,AXI-Stream等,都属于AXI协议,用来实现PS和PL之间不同类别的通信

  8. @undefined  

    @cuter

    楼主您好!

    刚刚接触这块板子,正在学习。用的是vivado2014.3版本的,按照您的步骤做的,在Run Connection Automation 连接GPIO时,没有出现17所示的对话框,没法选择选择开发板端口为leds_8bits。所以自己加了约束文件,但launch到SDK时,代码复制的您的,但报错找不到 #include "platform.h"。求解答

    这位朋友,我用的2014.4,同样是缺的是"platform.h"文件。不知道已经解决没有


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

  10. @pilijie    
    你好,我也遇到了你这个问题,请问你是怎么解决的?                                                                                    
  11. @pilijie    
    你好,我也遇到了你这个问题,请问你是怎么解决的?                                                                                    
  12. 我只是把工程导入到sdk中,在sdk中创建了一个空的工程,创建后是好的,加入c文件后,就不行了,就出现了两个错误,一直消不了 

  13. 匿名用户匿名用户

    @cuter

    楼主您好!

    刚刚接触这块板子,正在学习。用的是vivado2014.3版本的,按照您的步骤做的,在Run Connection Automation 连接GPIO时,没有出现17所示的对话框,没法选择选择开发板端口为leds_8bits。所以自己加了约束文件,但launch到SDK时,代码复制的您的,但报错找不到 #include "platform.h"。求解答

  14. 你好,cuter!我还是不太清楚ARM和FPGA是如何传输数据的,ARM给FPGA发送数据的时候不需要给一个类似脉冲信号的东西,告诉FPGA有新的数据需要读取吗?希望能够给我解答,感激不尽。
  15. 楼主能帮帮解决这个问题吗?我安装  Vivado很多次了  但是sdk都不能用  添加license后 安装界面一直不能消除   点叉去  又会提示卸载已安装  我已经安装了很多次了  都是同样的问题  我用的win8系统,请问能帮我解决一下吗,我的QQ:508243488  谢谢