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设计的基本流程包含以下步骤:
Vivado中搭建ZYNQ平台,完成基本外设控制。
创建逻辑设计,并封装成IP。
ZYNQ设计中调用封装的IP。
对设计的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所示。
图2
图3
Vivado中进行ZYNQ硬件部分设计
Step1: Viavdo中选择XC7Z010-1CLG400器件,建立工程。
Step2: 建立Block Design。
图 4
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,其余为默认配置。
图 5
图 6
注意:这里有个地方非常容易出错。在Vivado建立工程选择器件的过程中没有选择ZYBO开发板的配置,而是直接选择的XC7Z010-1CLG400C器件的配置。系统默认的ZYNQ7 Processing System配置中Input Clock Frequency是33.3333MHz,而ZYBO板上为50MHz。此处必须修改过来,否则后面的系统时钟会完全错乱,导致软件工程无法运行。
图 7
Step4: 点击“Run Block Automation”,其作用是完成ZYNQ7 Processing System专用引脚的连接,包括FIXED_IO和DDR引脚的连接。
图 8
Step5: 点击“Run Connection Automation”,其作用是自动完成ZYNQ与外设的连接,连接是按照工具对于用户所设计系统的理解,如果需要进行修改,可以手动更改Block中的连线。该操作工具会默认增加:
AXI interconnect
Processor System Reset
自动完成了外设IP的AXI-Lite端口与ZYNQ7 Processing System的连接,默认接法是ZYNQ的FCLK_CLK0作为外设AXI时钟,Processor System Reset产生外设复位信号连接到所有外设的复位端口。
将AXI GPIO的引脚引出。
可以使用“Regenerate Layout”,重新布局Block Design。
图 9
Step6: 在“Address Editor”中查看、修改外设在总线上的地址。
图 10
Step7: 首先在Block design界面右击弹出的菜单中点击Validate Design,以验证Block Design的设计和连接是否有错误。至此Block Design完成了,但是还需要根据Block Design的配置生成相应的源代码。右击.bd设计,并选择“Create HDL Wrapper”。随后即生成了相应的HDL代码。
图 11
Step8: 对于PL端的外接引脚,需要设置相应的Constraints。
图 12
Step9: 与普通FPGA设计一样,完成Synthesis、Implementation和Generate Bitstream。
Step10: 将Step9中完成的硬件设计导入到SDK开发平台下。
图 13
Step11: 从这一步开始,开发平台转移到SDK平台。此时硬件平台已经确定,接下来是软件的开发。首先在SDK中建立软件工程。
图 14
图 15
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中。
图 16
Step14: 运行软件工程进行调试。
图 17
在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所示。
图 18
但是虽然BSP中提供了所有相关的API函数,但是对于初学者来说,想搭建一个可以实现基本功能的平台还是有些困难。于是另一个方法是利用SDK生成新的Application时提供的Peripheral Test模板。
图 19
该模板生成的代码中,在主函数中找到相应外设的测试函数,例如本例中GPIO的测试函数“GpioOutputExample()”,再通过追述该函数的具体实现,可以一定程度上作为最基本的范例代码。
图 20
如果再进一步深入到ARM编程的本质,其实与硬件的所有控制和通信都是依靠读写底层的寄存器来完成的。例如如果查看一下“XGpio_SetDataDirection()”函数的底层实现,可以发现逐级调用的分别是“XGpio_WriteReg()”函数和“XGpio_Out32()”函数,而“XGpio_Out32()”调用的是“Xil_Out32()”。其实“Xil_Out32()”和“Xil_In32()”这两个函数分别是写读底层硬件寄存器的两个函数,所有的上层与底层的寄存器级别的通信,也就是绝大多数的外设控制,都是依靠这两个函数完成的。
关注我们
zynq网络时钟控制寄存器_【干货分享】ZYNQ开发基本流程相关推荐
- zynq网络时钟控制寄存器_ZYNQ笔记(6):普通自定义IP封装实现PL精准定时中断...
软件的定时中断很难控制精准触发沿的位置,可以通过 PL-PS 的中断完成精准的定时中断.PL 的中断通过 Verilog 代码产生,这样紧密结合 PS-PL 的处理,发挥各自的优势. 一.PL 侧定时 ...
- 【Linux服务器开发系列】详解多线程网络编程丨百分百干货分享丨学到就是赚到
90分钟搞懂多线程网络编程模型 1. 网络编程关注的问题 2. 网络编程的几种模型reactor,one loop per thread及其变种 3. skynet,redis,nginx,memca ...
- jh锂电保护电路_干货 | 分享几款常用的保护电路
原标题:干货 | 分享几款常用的保护电路 鉴于电源电路存在一些不稳定因素,而设计用来防止此类不稳定因素影响电路效果的回路称作保护电路.在各类电子产品中,保护电路比比皆是,例如:过流保护.过压保护.过热 ...
- lwip协议栈优化_干货分享 | KNI性能优化实践
友情提示:全文5000多文字,预计阅读时间15分钟 文章源自现网实践对支撑及用户态/内核态网络报文交换场景的认识,欢迎有Linux/FreeBSD内核.网络协议栈.DPDK优化实践经验的同学留言探讨- ...
- sysdba 默认密码_干货分享|DM数据库密码策略和登录限制设置
在数据库的用户安全中,口令复杂度策略和资源限制是用户安全重要的一部分.在DM数据库中,口令策略分为系统口令策略和用户口令策略.只有安全版本才支持对每个用户设置口令策略(即用户口令策略),非安全版本,只 ...
- vs code vue插件_干货分享 | Vue框架常见问题浅谈
友情提示:全文7800多文字,预计阅读时间10分钟 Vue是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层,不仅易于上手, ...
- python定期自动运行_干货分享 | 适合 Python 入门的 8 款强大工具,不会就你还不知道吧!...
点击上方"人工智能Corner","星标或置顶公众号" 干货分享,第一时间送达 Python是一种开源的编程语言,可用于Web编程.数据科学.人工智能以及许多科 ...
- 达梦数据库删除用户_干货分享丨DM8用户管理
原标题:干货分享丨DM8用户管理 用户介绍 安装创建达梦企业版数据库后,系统会默认创建四类数据库账号,分别是: SYS:达梦数据库内置管理用户,不能登录,数据库使用的大部分的数据字典和动态性能视图. ...
- 位图排序 大数据_干货分享:大话12种排序算法
干货分享:大话12种排序算法 常见的排序算法: 快速排序.堆排序.归并排序.选择排序 插入排序.二分插入排序 冒泡排序.鸡尾酒排序 桶排序.计数排序.基数排序.位图排序 技能点: 1.归并排序在O(N ...
最新文章
- 编译原理扫描程序,判断当前输入的程序中程序调用的函数是那个函数原型
- 高效的找出两个List中的不同元素
- 机房收费系统=三层+设计模式
- iOS CoreTelephony框架介绍与使用案列
- Java使用Apache CXF开发Web Service
- pace.js – 加载进度条插件
- 如何使用Python开发随机森林集成
- Jupyter Notebook激活conda对应的环境2
- IDEA中将WEB-INF\lib下的Jar包添加到项目中
- 聚合直播源码原生播放器php分享,原生聚合直播搭建源码
- 技术内参 | 神策分析架构演进:“变”与“不变” 中的思索与创新
- 传感器技术(徐科军 第四版)第四章:光电式传感器
- 西门子1200 PLC程序 通讯对象:PLC、CNC、机械手、RFID标签读写器、打标机、分布式远程IO模块、MES中控系统、AGV光通讯
- python对接蚂蚁验证码平台
- 刷题学习—算法思想(双指针、排序、回溯、二分法、滑动窗口、贪心、单调栈)
- MySQL8数据库知识点概述
- 神探夏洛克 | 不再卖腐,第四季的最大的看点变成了……
- crmebpro公众号+H5+小程序+PC+APP+DIY自由设计+多门店
- 网心科技打造全球首个百万量级节点的边缘云计算网络“星域云”
- Excel函数不生效的一种情况
热门文章
- 为什么visual的联机浏览功能不能用_饥荒为什么不出联机手游?看到这3条缺陷,才明白原因...
- 商淘多b2b2c商城系统怎么在个人电脑上安装_b2b2c商城系统免费模板怎么用?
- C++ WMI获取usb deviceID数据不全的问题 Win32_USBHub
- r语言各形状编号_R语言入门第八讲:编码分类变量(factor)
- 拉格朗日c语言实验报告,拉格朗日插值法C语言的实现(实验报告)(9页)-原创力文档...
- 电脑打字学习_VOL.3,NO.2 | 小学一年级,爸爸管学习,完全就是个笑话!
- 在python子程序中、使用关键字_Python 的控制和函数
- linux各种小程序源码,Linux中的小程序—— 进度条
- css div漂浮向下,DIV+CSS固定底部的漂浮广告
- linux内存管理简介,Linux内存管理机制简介