基于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; }
搞定,流水灯跑起来了。
6、ChipScope观测内部信号
本来想在这一篇学一下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