基于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;
}
搞定,流水灯跑起来了。
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
最新文章
- mysql日志 解析
- MVVM 模式下iOS项目目录结构详细说明
- msnodesql的使用
- PHPExcel内存泄漏问题
- LeeCode-Rotate Array
- node.weiChat
- PHP文件夹操作2
- apply函数用法
- 11-Cookie&;Session
- EL表达式、JSTL标签库
- 《Java大学教程》--第1章 步入Java世界
- 关于数据库不适合docker的原因(摘抄)
- win7 没有权限使用网络资源
- day 06 列表去重, 数据类型的补充,编码,深浅copy
- 13.Mysql触发器
- Mysql 常用增删改查命令集合教程
- 平均值(Mean)、方差(Variance)、标准差(Standard Deviation) (转)
- 关于C中函数传参的一点理解
- 从Tomcat无法正常关闭讲讲Java线程关闭问题【转载】
- 在eclipse中,用maven创建web项目