zedboard如何从PL端控制DDR读写(三)——AXI-FULL总线调试
之前的项目和培训中,都只用到了AXI-Lite或者AXI-Stream,对于AXI-FULL知之甚少,主要是每次一看到那么多接口信号就望而却步了。
现在为了调试DDR,痛下决心要把AXI-FULL弄懂。
前面已经介绍了基本的接口信号,本文主要是总结一下使用AXI-FULL调试的过程。
首先想到的是用RAM IP核来测试,方法是通过AXI接口向RAM写入一组数据并读出,看起来很简单,然而试了好久都没能出结果。如下图所示,其实AXI RAM就是在本地RAM接口的基础上套了一个AXI的壳

在使用modelsim仿真的时候总是会抛出一个警告,具体的警告类型忘了,下次有机会再尝试。试了好多次都这样,无解
于是转用FIFO来测试,结果一下子就跑通了。
FIFO的自定义如下图:


一直没搞懂这个ID是用来干嘛的,按理说应该是当系统中存在多个master或者slave的时候,用来标识不同的设备号的,但是也没找到在哪里可以配置这个ID号啊,求解。
然后就是写状态机了,最初打算是用三段式状态机来实现下图的时序,结果发现三段式好像不太适合这种太紧凑的时序

具体的表现如图中箭头所示,当写时序从AW(写地址通道)切换到W(写数据通道)的时候,我是通过判断valid和ready同时拉高(1)则进入下一个状态即W状态(2)的,但是从(1)到(2)的跳变必须经历一个时钟,紧接着在第三段状态机中检测到(2)并且产生实际的输出(3)这个过程中,又会经历一个时钟,这就会导致图中的T1和T2之间多出来了一个周期,时序不满足了。无奈,又换成一段式状态机继续。
由于是对FIFO进行操作,burst类型自然选择是固定长度突发,写地址直接给0不变。这里说一下个人对wstrb的理解,前面也说了,这个信号是表示写阀门,也就是规定WDATA的哪些字节有效。实际上无论把wstrb写成全0还是全1,读出来的数据都是一样的,那么FIFO内部自然没有判断某些字节有效的逻辑,所以在后续读出的时候,需要由我们自行掩码。
除此之外,个人感觉看着这一大堆的接口,首先不要怕,把所有的接口信号按不同的通道分成5组,一次只操作其中的一组,慢慢的就能完成整个时序的编写了。
最后附上读写的仿真结果:

数据用$random产生,再加上状态机,整个时序如行云流水般的运作起来了,想想还有点小兴奋呢
既然已经看了RAM的xilinx文档,那么FIFO的也得看,这样才能显得雨露均沾。
先来一张正常本地端口FIFO结构图

所有的信号都还蛮熟悉,结构也还算了解,无非就是同一个FIFO的两个时钟域。
接着再看AXI接口的FIFO:

这都什么鬼啊,红线蓝线,那么多独立的模块,这是要干嘛?
自习阅读官方文档,有这么一段话:
For AXI memory mapped interfaces, AXI specifies Write Channels and Read Channels. Write Channels include a Write Address Channel, Write Data Channel and Write Response Channel. Read Channels include a Read Address Channel and Read Data Channel. The FIFO Generator core provides the ability to generate either Write Channels or Read Channels, or both Write Channels and Read Channels for AXI memory mapped. Three FIFOs are integrated for Write Channels and two FIFOs are integrated for Read Channels. When both Write and Read Channels are selected, the FIFO Generator core integrates five independent FIFOs.
For AXI memory mapped interfaces, the FIFO Generator core provides the ability to implement independent FIFOs for each channel, as shown in Figure 1-6. For each channel, the core can be independently configured to generate a block RAM or distributed memory or built-in based FIFO. The depth of each FIFO can also be independently configured.
也就是说,每一个AXI通道最后都会生成成一个独立的跨时钟域FIFO,我们一开始将FIFO的类型配置成了读写,也就是五个通道全开,那么自然就是五个独立的FIFO了。
这得占用多少资源啊,还好只是测试,不用考虑那么多。
zedboard如何从PL端控制DDR读写(三)——AXI-FULL总线调试的更多相关文章
- zedboard如何从PL端控制DDR读写(二)——AXI总线
虽然Xilinx已经将和AXI时序有关的细节都封装起来,给出了官方IP和向导生成自定义IP,用户只需要关注自己的逻辑实现,但是还是有必要简单了解一下AXI的时序,毕竟咱是做硬件设计的. AXI(Ad ...
- zedboard如何从PL端控制DDR读写(七)
前面已经详细介绍了从PL端如何用AXI总线去控制DDR的读写,并且从AXI_BRESP的返回值来看,我们也是成功写入了的.但是没有通过别的方式来验证写入的数据的话,总是感觉差了点什么. 今天试了一把从 ...
- zedboard如何从PL端控制DDR读写(五)
有了前面的一堆铺垫.现在终于开始正式准备读写DDR了,开发环境:VIVADO2014.2 + SDK. 一.首先要想在PL端通过AXI去控制DDR,我们必须要有一个AXI master,由于是测试,就 ...
- zedboard如何从PL端控制DDR读写(六)
上一节说到了DDR寻址的问题,如下图: 从官方文档上我们看到了DDR的地址是从0008_0000开始的,那么我们开始修改Xilinx给我们提供的IP核代码.其实很简单,上一节已经分析了地址停留在000 ...
- zedboard如何从PL端控制DDR读写(四)
PS-PL之间的AXI 接口分为三种:• 通用 AXI(General Purpose AXI) — 一条 32 位数据总线,适合 PL 和 PS 之间的中低速通信.接口是透传的不带缓冲.总共有四个通 ...
- zedboard如何从PL端控制DDR读写(一)
看了一段时间的DDR手册,感觉大体有一点了解了,想要实际上板调试,然而实验室可用的开发板不多,拿了一块zynq板看了看,DDR确实有,但是已经集成了控制器,而且控制器还放到了PS端,PL只能通过AXI ...
- 第十二章 ZYNQ-MIZ702 PS读写PL端BRAM
本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享,通过zynq PS端的Master GP0端口向BRAM写数据,然后再通过PS端的Mater GP1把数据读出来,将 ...
- 第十一章 ZYNQ-MIZ701 PS读写PL端BRAM
本篇文章目的是使用Block Memory进行PS和PL的数据交互或者数据共享,通过zynq PS端的Master GP0端口向BRAM写数据,然后再通过PS端的Mater GP1把数据读出来,将 ...
- MIG IP控制DDR3读写测试
本文设计思想采用明德扬至简设计法.在高速信号处理场合下,很短时间内就要缓存大量的数据,这时片内存储资源已经远远不够了.DDR SDRAM因其极高的性价比几乎是每一款中高档FPGA开发板的首选外部存储芯 ...
随机推荐
- PLSQL_性能优化系列08_Oracle Insert / Direct Insert性能优化
2014-09-25 Created By BaoXinjian
- PLSQL_PLSQL中DML/DDL/DCL的概念和区分(概念)
2014-06-20 Created By BaoXinjian
- POJ 2318 TOYS(计算几何)
题目大意:有一个矩形盒子,盒子里会有一些木块线段,并且这些线段是按照顺序给出的,有n条线段,把盒子分层了n+1个区域,然后有m个玩具,这m个玩具的坐标是已知的,问最后每个区域有多少个玩具 解题思路:因 ...
- Home键状态保存运用场景
当我们在一个Activity中有接收Intent过来的值,或者当前Activity有保存数据时候,如果此时不小心按到了Home键,然后没有及时回来而是运行了其它应用程序,当你想起来的时候,恐怕已经是几 ...
- shell+Jenkins+jmeter集成
参考http://www.cnblogs.com/ceshi2016/p/6025641.html 中除ant相关内容,shell替代ant循环执行jmeter脚本和将jtl转换为html job n ...
- VMware虚拟机的CentOS无法上网的解决方法
前言:由于Linux下很多软件安装必须网络环境下进行,因此,对于如何在VMware下进行上网,我折腾了至少三天,今天上午,也即五一劳动节,终于搜到一遍技术文章,经过自己实践,VMware下Linux的 ...
- 织梦DEDECMS文章、栏目页获取当前页面顶级栏目名称的方法
在用织梦做一些项目时,时常会碰到需要在当前页面调用顶级栏目名称的时候,织梦默认{dede:field name='typename' /} 可以获取当前栏目页上一级栏目的名称,而不是当前栏目顶级栏目名 ...
- C++学习18 派生类的析构函数
和构造函数类似,析构函数也是不能被继承的. 创建派生类对象时,构造函数的调用顺序和继承顺序相同,先执行基类构造函数,然后再执行派生类的构造函数.但是对于析构函数,调用顺序恰好相反,即先执行派生类的析构 ...
- apache下php无法解析直接显示源代码解
在http.conf中加入php的设置 #php5_start phpIniDir "d:/Program Files/php" LoadModule php5_module &q ...
- 一些代码 I (斐波那契、for...else...、try和return、classmethod、统计个数)
1. 斐波那契 from itertools import islice def fib(): a, b = 0, 1 while True: yield a a, b = b, a+b print ...