深入解析:FPGA DDR3实战(一):详解Xilinx MIG IP核配置
【致读者】
您好!本文是系列教程的第一篇,将深度解析Xilinx MIG IP核的AXI4接口。为方便同行交流,我创建了一个硬件技术交流群,群内聚焦:
FPGA技术分享
实战问题讨论与答疑
行业动态与职业发展交流
若您对本专题感兴趣,欢迎私信我“FPGA”或直接扫码加入群聊
一:引言 大家为什么需要启用DDR3
在我们追逐更高、更快、更强的FPGA系统时,总会遇到一个无法回避的“内存墙”。
如果你试图使用FPGA内部的Block RAM来应对,你会发现它的容量如同一个小水杯,试图去接住打开的水龙头——瞬间就会满溢而出。而片外传统的SRAM,尽管速度快,但容量小、价格昂贵,性价比极低。
,我们迎来了今天的主角:DDR3 SDRAM。就是于
它并非最新的技术,但无疑是当前在成本、容量、带宽和可靠性上最平衡的选择。你可能把它理解为一个在FPGA片外的、“海量”且“廉价”的“内容中转仓库”。
【海量】:以GB为单位的容量,轻松容纳海量资料,让FPGA得以处理复杂的任务。
【高速】 通过双倍数据速率等技术,供应远超普通SDRAM的传输带宽,满足高速数据吞吐的需求。
【廉价】:技术成熟,产业链完善,单位容量的成本极具竞争力。
然而,驾驭这片“海洋”并非易事。DDR3的复杂性远非便捷的UART或SPI可比:
它需要复杂的初始化序列。
它通过命令、地址总线进行复用访问,时序关系极其严格。
它依赖MIG这样的专用IP核来管理底层物理层接口。
因此,本系列文章的目的,就是作为你的“领航员”,带你穿越DDR3开发的迷雾。我们将从Xilinx MIG IP核的深度解读开始,一步步教你如何搭建测试环境、编写读写控制器,并最终压榨出DDR3的极致性能。
准备好了吗?让大家开始这趟深入DDR3核心的旅程。
二:MIG IP核配备向导逐页精讲
本次我们以xillinx的A7200t作为硬件平台,进行MIG ip核配置
1 打开IP Catalog,搜索MIG
2 MIG ip核,点击下一步,选择Create Design
3 选择FPGA型号
4 选择DDR3
5 选择DDR3的工作频率,Memory的型号,此处需要注意的是,我们内部是没有MT41K512M16这个型号的,需要使用Create Custom Part进行创建,在MT41K256M16XX-107的基础上,将Row address修改为16即可,选择数据位宽为64bit。就是,我这里使用的方法
6 配备AXI接口的数据宽度
7 配置输入时钟频率,这个是输入MIG核的频率,IP核内部会自己调用PLL来产生自己的工作时钟,此处设置200MHz
8 设置环境时钟、参考时钟、复位信号的属性
9 引脚选择固定引脚,点击Read XDC/UDF,导入提前准备好的引脚约束资料,引脚约束按照原理图进行约束,导入之后点击Validate
10 直点击next知道最后完成Generate即可生成本次运用的ddr3 ip。
三 :MIG IP核 核心信号解读(AXI4接口版本)
当你在MIG IP核的配备中选择“AXI4”作为用户接口时,IP核会化身为一个AXI从设备,而你的用户逻辑则成为AXI主设备。这意味着,你将应用行业标准的AXI4协议来与DDR3内存通信,这大大简化了与其它支持AXI4的IP核(如PCIE、DMA控制器等)的集成。
AXI4协议的核心是通道架构和握手机制。我们将信号组按照通道进行划分。
1. 全局信号与初始化状态
ui_clk
(输出)功能:所有AXI4信号都必须与此时钟同步。
ui_clk_sync_rst
(输出)功能:与
ui_clk
同步的复位信号,高有效。用于复位你的AXI主控逻辑。
init_calib_complete
(输出)功能:生命线信号。在DDR3初始化校准完成之前,AXI总线上的任何事务都会被忽略。你的设计必须等待此信号拉高。
2. 写地址通道 - 发起一次写操作的“目的地”
主设备通过此通道告诉从设备“我要往哪里写”。
S_AXI_AWID
(输入)功能:写地址ID,用于区分多个同时进行的事务。在简单应用中可设固定值。
S_AXI_AWADDR
(输入)功能:起始字节地址。这是与原生接口的关键区别之一,AXI利用字节寻址。
S_AXI_AWLEN
(输入)功能:突发传输的长度。
AWLEN = N
表示本次突发传输 N+1个数据周期。
S_AXI_AWSIZE
(输入)功能:每次传输的字节数。例如,3‘b101 表示32字节(256bit),必须与你的数据位宽匹配。
S_AXI_AWBURST
(输入)功能:突发类型。通常使用
2‘b01
(INCR,递增模式)。
S_AXI_AWVALID
(输入)功能:主设备信号,表示地址和控制信息有效。
S_AXI_AWREADY
(输出)功能:从设备信号,表示已准备好接收地址信息。
握手: 一次成功的地址传输发生在 S_AXI_AWVALID
和 S_AXI_AWREADY
同时为高的时钟上升沿。
3. 写数据通道 - 输送要写入的“货物”
S_AXI_WDATA
(输入)功能:写数据。
S_AXI_WSTRB
(输入)功能:字节选通信号,用于指定
WDATA
的哪些字节是有效的。WSTRB[n]
对应WDATA[(8*n)+7 : (8*n)]
。
S_AXI_WLAST
(输入)功能:必须拉高,以指示这是本次突发传输的最后一个数据。
S_AXI_WVALID
(输入)功能:主设备信号,表示写数据和WLAST有效。
S_AXI_WREADY
(输出)功能:从设备信号,表示已准备好接收数据。
握手: 一次成功的数据传输发生在 S_AXI_WVALID
和 S_AXI_WREADY
同时为高的时钟上升沿。
4. 写响应通道 - 确认“货物”已送达
S_AXI_BID
(输出)功能:响应ID,与写地址的AWID对应。
S_AXI_BRESP
(输出)功能:写事务状态。
2‘b00
(OKAY)表示成功。
S_AXI_BVALID
(输出)功能:从设备信号,表示写响应信息有效。
S_AXI_BREADY
(输入)功能:主设备信号,表示已准备好接收响应。
握手: 一次成功的响应接收发生在 S_AXI_BVALID
和 S_AXI_BREADY
同时为高的时钟上升沿。
5. 读地址通道 - 发起一次读操作
S_AXI_ARID
,S_AXI_ARADDR
,S_AXI_ARLEN
,S_AXI_ARSIZE
,S_AXI_ARBURST
功能:与写地址通道类似,用于发起读请求。
S_AXI_ARVALID
(输入)S_AXI_ARREADY
(输出)功能:握手信号,逻辑与写地址通道完全相同。
6. 读数据通道 - 返回请求的“素材”
S_AXI_RID
(输出)功能:读数据ID,与读地址的ARID对应。
S_AXI_RDATA
(输出)功能:读出的数据。
S_AXI_RRESP
(输出)功能:读事务状态。
2’b00
(OKAY)表示成功。
S_AXI_RLAST
(输出)功能:从设备信号,指示这是本次突发传输的最后一个数据。
S_AXI_RVALID
(输出)功能:从设备信号,表示读数据有效。
S_AXI_RREADY
(输入)功能:主设备信号,表示已准备好接收数据。
握手: 一次成功的读数据接收发生在 S_AXI_RVALID
和 S_AXI_RREADY
同时为高的时钟上升沿。
【精髓】:AXI4接口的优势与设计要点
去耦合与高效率:
与原生接口不同,AXI4的五个通道是独立的。这意味着你能够先发送读地址,然后在信息返回之前,立刻发送下一个写地址。这种乱序处理能力极大地提高了总线利用率和体系并行性。简化设计:
你不再需要像处理原生接口那样,亲自管理app_rdy
和app_wdf_rdy
之间复杂的时序关系。AXI4的VALID/READY
握手机制在每个通道内都是统一的,逻辑更清晰。突发传输是核心:
AXI4是为突发传输而设计的。ARLEN
/AWLEN
信号允许你通过一次地址握手,完成大量数据的连续传输。这对于发挥DDR3的带宽性能至关重要。
总结:
本节我们搞定了IP核的创建,“现在内存已经准备好,但我们还不知道如何与它正确通信,更不知道它的实际性能如何。
在下一节中,我们将利用这些知识,编写一个简单的AXI4主控制器,向DDR3写入一个测试Pattern并读出验证。