Vivado中进行ZYNQ硬件部分设计方案

zynq概述
zynq内部包含ps和pl两部分,ps中包含以下4个主要功能模块:
application processor unit (apu) memory interfaces i/o peripherals (iop) interconnect zynq内部的总体框架如所示,ps中包含2个arm cortex-9的内核,一些基本的外设扩展口以及memory接口。ps和pl的相互通信通过两个通路完成,分别是gp(general purpose)ports和hp(high performance)ports。
gp ports包含2个master接口和2个slave接口,符合标准的axi协议数据位宽是32bit。hp ports包含4个接口,全部是pl作为master;有两个专用的连接到ddr controller的接口和一个连接到ocm的接口。hp与gp相比,最大的特点在于有额外的fifo作为buffer,可以提高传输效率和数据吞吐量。
所以从功能角度,gp ports主要用于寄存器的读写以及小数据量的传输;hp ports用于大量数据的传输,主要是memory数据的读写。
zynq中最常用的设计思路是将主程序放在ps中完成,在pl中设计相应的逻辑功能作为ps的外设使用,将逻辑设计封装成ip,且每个ip都包含一个标准的axi-lite接口。ps对于逻辑设计的控制是通过控制逻辑设计的功能寄存器,进而控制逻辑设计进行相应的操作,同时将工作情况通过状态寄存器返回给ps端。如果逻辑设计与ps端需要进行大量数据的交互,则会在逻辑设计中增加axi-full接口,与ps的hp port相连。
综上,zynq设计的基本流程包含以下步骤:
1. vivado中搭建zynq平台,完成基本外设控制。
2. 创建逻辑设计,并封装成ip。
3. zynq设计中调用封装的ip。
4. 对设计的ip进行仿真。
zybo开发板简介
zybo是digilent开发的以xc7z010-1clg400c为核心处理器的开发板,其主要功能包括有:
1片32bit位宽,512mb容量的 ddr3 1个 hdmi port 1个vga source port 1个(1gbit/100mbit/10mbit) ethernet phy 与rj45接口 1个microsd slot 1个otg usb 2.0 phy 1个外部 eeprom 1个耳机输出接口和1个麦克风输入接口 1片128mb qspi flash作为加载flash 1个jtag接口和1个usb-converter下载接口 gpio: 6 pushbuttons, 4 slide switches, 5 leds 6个 pmod ports 其板上器件分布情况如图 2和图 3所示。
vivado中进行zynq硬件部分设计
step1: viavdo中选择xc7z010-1clg400器件,建立工程。
step2: 建立block design。
step3: 加入zynq7 processing system和其他所需要的外设ip。
点击“add ip”,加入zynq7 processing system和axi gpio,双击ip可以对其进行配置。该实验中zynq7配置使能uart,引脚为mio48和49,其zybo相关电路图如图 5所示。(注:如果需要在step11中选择hello world工程,则需要使能uart)。axi gpio的位宽设置为4,其余为默认配置。
注意:这里有个地方非常容易出错。在vivado建立工程选择器件的过程中没有选择zybo开发板的配置,而是直接选择的xc7z010-1clg400c器件的配置。系统默认的zynq7 processing system配置中input clock frequency是33.3333mhz,而zybo板上为50mhz。此处必须修改过来,否则后面的系统时钟会完全错乱,导致软件工程无法运行。
step4: 点击“run block automation”,其作用是完成zynq7 processing system专用引脚的连接,包括fixed_io和ddr引脚的连接。
step5: 点击“run connection automation”,其作用是自动完成zynq与外设的连接,连接是按照工具对于用户所设计系统的理解,如果需要进行修改,可以手动更改block中的连线。该操作工具会默认增加:
1. axi interconnect
2. processor system reset
3. 自动完成了外设ip的axi-lite端口与zynq7 processing system的连接,默认接法是zynq的fclk_clk0作为外设axi时钟,processor system reset产生外设复位信号连接到所有外设的复位端口。
4. 将axi gpio的引脚引出。
可以使用“regenerate layout”,重新布局block design。
step6: 在“address editor”中查看、修改外设在总线上的地址。
step7: 首先在block design界面右击弹出的菜单中点击validate design,以验证block design的设计和连接是否有错误。至此block design完成了,但是还需要根据block design的配置生成相应的源代码。右击.bd设计,并选择“create hdl wrapper”。随后即生成了相应的hdl代码。
step8: 对于pl端的外接引脚,需要设置相应的constraints。
step9: 与普通fpga设计一样,完成synthesis、implementation和generate bitstream。
step10: 将step9中完成的硬件设计导入到sdk开发平台下。
step11: 从这一步开始,开发平台转移到sdk平台。此时硬件平台已经确定,接下来是软件的开发。首先在sdk中建立软件工程。
step12: 在新建工程中完成c代码的设计。
#include
#include
#include xparameters.h
#include sleep.h
#include platform.h
int main()
{
xgpio output;
int status;
/*
* initialize the gpio driver so that it's ready to use,
* specify the device id that is generated in xparameters.h
*/
status = xgpio_initialize(&output, xpar_gpio_0_device_id);
if (status != xst_success) {
return xst_failure;
}
/* set the direction for all signals to be outputs */
xgpio_setdatadirection(&output, 1, 0x0);
init_platform();
while(1){
usleep(200000); //delay
xgpio_discretewrite(&output, 1, 0x0);
usleep(200000); //delay
xgpio_discretewrite(&output, 1, 0xf);
};
cleanup_platform();
return 0;
}
step13: 首先点击“program fpga”,将硬件平台下载到zynq中。
step14: 运行软件工程进行调试。
在zybo板上也能看到led灯闪烁,至此完成了zynq的一个基本设计的所有开发流程。
dk中进行zynq软件部分设计
首先对“vivado中进行zynq硬件部分设计”中让led闪烁的c代码做详细的注释。
int main()
{
/*定义外设对于的类型指针,用于绑定外设,便于后面程序调用时选择
* 外设
*/
xgpio output;
int status;
/* xgpio_initialize()函数是xgpio.c中的函数,在bsp documentation可以
* 查到该函数的描述。
* int xgpio_initialize(xgpio * instanceptr, u16 deviceid)
* instanceptr为gpio类型的指针
* deviceid是在板级配置中已经定义好的外设的id,该定义包含在bsp的xparameters.h中
* 即在xparameters.h已经为该硬件设计中的每一种类型的多个外设设置了唯一的id
* 例如设计中如果有2个gpio外设,则id分别为0和1.
* 该语句完成之后将id对应的外设对象与该指针进行了绑定,后面可以通过调用该指针指
* 定到该外设
*/
status = xgpio_initialize(&output, xpar_gpio_0_device_id);
if (status != xst_success) {
return xst_failure;
}
/* void xgpio_setdatadirection (xgpio * instanceptr,
* unsigned channel,u32 directionmask )
* instanceptr:外设指针,用于指定到对应的外设设备,已经与外设绑定
* channel: 每个axi_gpio中可以有两个32bit的gpio端口,该参数用来
* 选择是该外设中的哪一个端口
* directionmask:选择gpio的方向,0为output,1为input
* 该函数的作用是设置gpio的方向,如前所述,可以通过output指定到
* 该gpio外设,
*/
xgpio_setdatadirection(&output, 1, 0x0);
//初始化arm内核
init_platform();
while(1){
usleep(200000); //delay
xgpio_discretewrite(&output, 1, 0x0);
usleep(200000); //delay
xgpio_discretewrite(&output, 1, 0xf);
};
cleanup_platform();
return 0;
}
以上调用的这些函数,其定义及使用方法全部可以在bsp(board support package)板级支持包中找到。当在vivado平台中设计完成硬件,将其导入到sdk平台时,工具会根据硬件设计中使用到的外设,自动生成相应的板级支持包。在sdk的“project explorer”界面中可以查看,并且可以在其中打开相应的bsp说明文档,如图 18所示。
但是虽然bsp中提供了所有相关的api函数,但是对于初学者来说,想搭建一个可以实现基本功能的平台还是有些困难。于是另一个方法是利用sdk生成新的application时提供的peripheral test模板。
该模板生成的代码中,在主函数中找到相应外设的测试函数,例如本例中gpio的测试函数“gpiooutputexample()”,再通过追述该函数的具体实现,可以一定程度上作为最基本的范例代码。
如果再进一步深入到arm编程的本质,其实与硬件的所有控制和通信都是依靠读写底层的寄存器来完成的。例如如果查看一下“xgpio_setdatadirection()”函数的底层实现,可以发现逐级调用的分别是“xgpio_writereg()”函数和“xgpio_out32()”函数,而“xgpio_out32()”调用的是“xil_out32()”。 其实“xil_out32()”和“xil_in32()”这两个函数分别是写读底层硬件寄存器的两个函数,所有的上层与底层的寄存器级别的通信,也就是绝大多数的外设控制,都是依靠这两个函数完成的。


如何修复遇到延迟和黑屏的游戏android
中国电信 中国联通全力保障mu5735搜救工作通信畅通
ikbc机械键盘怎么样,时光机系列F-RGB详细图赏
中国联通以合作共享的形势拓展物联网,将鸡肋做成蛋糕
电子负载四种功能实现的原理介绍
Vivado中进行ZYNQ硬件部分设计方案
“高颜值、爱自拍”,华为正式发布了首款新一代全面屏手机
光子芯片上实现超低损耗的慢光效应
美国联邦航空局正在对波音737MAX系列飞机进行审查
使用BeagleBone构建物联网环境监测系统
诺基亚最新消息:诺基亚6砸核桃效果怎么样?诺基亚8曝光,在路上!
智能空气检测仪安装注意事项
颜值秒杀苹果7,内置小米CPU,小米5C发布在即
手持式叶绿素检测仪的特点及技术指标
国内10家科技公司与国外大型人工智能企业展开深度合作
石头扫地机器人T6体验 整体的使用体验无疑有了进一步提升
后疫情时代,印刷电路板产业后续如何发展
【节能学院】智能操控及无线测温产品在江苏瑞恒双氧水气体检测项目中的应用
2021年工业发展挑战机遇并存,加快布局推动网络优化升级
LED照明行业在2021年终于迎来了曙光