基于FPGA的DDR3读写实验学习
基于FPGA的DDR3读写实验学习
- 前言
- 一、DDR3含义
- 1.地址换算容量规则
- 2.实现方法
- 3.IP核介绍
- 4.命令写入时序
- 5.写数据时序
- 6.读数据时序
- 7.硬件原理图
- 二、实验流程
- 1.实验目标
- 2.总体框图
- 3.DDR3控制器
- 4.小疑问
- 总结
前言
FPGA这端可能要进行大量的数据采集,如果在数据采样速率较快时数据缓存以及处理难度就会增加,因此学习一下数据存储相关的一些技术,因为正点原子有关于DDR3的一些教程,这篇文章就基于该教程进行学习吧,记录一下个人的一些理解和学习过程。所以资料大部分参考正点原子官网,侵权删。
一、DDR3含义
DDR3 SDRAM 常简称 DDR3,是当今较为常见的一种储存器,在计算机及嵌入式产品中得到广泛应用,特别是应用在涉及到大量数据交互的场合,比如电脑的内存条。对 DDR3 的读写操作大都借助 IP 核来完成,本次实验将采用 Xilinx 公司 MIG IP 核来实现 DDR3 读写测试。
在解释一下SDRAM:
同步动态随机存取内存(synchronous dynamic random-access memory,简称SDRAM)是有一个同步接口的动态随机存取内存(DRAM)。通常DRAM是有一个异步接口的,这样它可以随时响应控制输入的变化。而SDRAM有一个同步接口,在响应控制输入前会等待一个时钟信号,这样就能和计算机的系统总线同步。时钟被用来驱动一个有限状态机,对进入的指令进行管线(Pipeline)操作。这使得SDRAM与没有同步接口的异步DRAM(asynchronous DRAM)相比,可以有一个更复杂的操作模式。
管线意味着芯片可以在处理完之前的指令前,接受一个新的指令。在一个写入的管线中,写入命令在另一个指令执行完之后可以立刻执行,而不需要等待数据写入存储队列的时间。在一个读取的流水线中,需要的数据在读取指令发出之后固定数量的时钟频率后到达,而这个等待的过程可以发出其它附加指令。这种延迟被称为等待时间(Latency),在为计算机购买内存时是一个很重要的参数。
DDR SDRAM 的最大特点是双沿触发,即在时钟的上升沿和下降沿都能进行数据采集和发送,同样的工作时钟,DDR SDRAM 的读写速度可以比传统的SDRAM 快一倍。
本次实验使用的 DDR3 芯片是南亚的 NT5CC128M16IP-DI,NT5CC128M16IP-DI 的 bank位宽为 3,行位宽为 14,列位宽为 10,所以它的地址大小等于 23*2142^10(即 2^27=128M),数据位宽为 16bit,所以容量大小为 128M16bit,也就是 256MByte。
结合PPT呢,对这个行地址、列地址以及BANK地址进行一点详细的说明,我们知道SDRAM本身肯定是有容量的,但是他的写入数据和读取数据之前都需要进行行列激活,如果不分bank,就要激活全部的行和列,这样不仅仅会增加时间,还会增加 成本。所以bank地址就是为了选中哪一块bank,进而再去激活对应的行跟列。
还有一点,掉电消息丢失。
1.地址换算容量规则
地址的本质是 “指向字节的编号”
计算机中,地址总线的每一位(bit)决定一个地址的 “可选状态”(0 或 1),而每个地址唯一对应 1 个 “最小存储单元”——字节(Byte,1 Byte = 8 bit)。
例如:
1 位地址(2¹):能表示 2 个地址,对应 2 个字节(存储容量 = 2 Byte);
2 位地址(2²):能表示 4 个地址,对应 4 个字节(存储容量 = 4 Byte);
以此类推:n 位地址的存储容量 = 2ⁿ 字节。
核心计算:2²⁷ 字节如何换算为 128M?
需要先明确 “二进制存储单位” 的换算规则(注意:二进制单位的 “K/M/G” 与十进制不同,是 2 的幂次关系):
二进制单位 与字节的换算关系 对应幂次(2^x)
千字节(KB) 1 KB = 1024 Byte 2¹⁰ Byte
兆字节(MB) 1 MB = 1024 KB 2²⁰ Byte
吉字节(GB) 1 GB = 1024 MB 2³⁰ Byte
基于此,对 2²⁷ 字节进行单位换算:
先将 2²⁷ 字节拆分为 “系数 × 标准二进制单位”:
2²⁷ Byte = 2⁷ × 2²⁰ Byte
代入单位定义:
2²⁰ Byte = 1 MB(根据上表);
2⁷ = 128(计算:2⁷ = 2×2×2×2×2×2×2 = 128)。
合并结果:
2²⁷ Byte = 128 × 1 MB = 128 MB(通常简写为 128M)。
2.实现方法
调用IP核,掌握用户接口和信号含义,了解读写过程与信号控制之间的配合关系,进而掌握MIG IP核的使用。
3.IP核介绍
MIG IP 核是 Xilinx 公司针对 DDR 存储器开发的 IP,里面集成存储器控制模块,实现 DDR 读写操作的控制流程,下图是 7 系列的 MIG IP 核结构框图。MIG IP 核对外分出了两组接口。左侧是用户接口,就是用户(FPGA)同 MIG 交互的接口,用户只有充分掌握了这些接口才能操作 MIG。右侧为 DDR 物理芯片接口,负责产生具体的操作时序,并直接操作芯片管脚。这一侧用户只负责分配正确的管脚,其他不用关心。
了解红框内的用户接口即可,不过这只是在你只是要学会IP核的使用,如果要自己纯verilog实现,则远远不够。
这是正点原子整理的用户端一些比较重要的信号,还可以看起来数量不多,基本上从信号的名称也能知道他的作用。端口方向是相对于IP核来说的,对于用户来说正好是相反的方向。
clk ip核的工作时钟,跟你需要的读写速度有关系。
rst 复位,高电平复位
init DDR3初始化,完成后标志高
addr 地址输入
en 命令写入使能
cmd 读命令或者写命令
rdy 高电平的时候才可以写入命令
wren 数据写入使能
wrdy 高电平的时候配合wren才能写入数据
end 最后一个写入时钟时刻
data 写入数据
rd_data 读取数据
valid 读取数据有效标志
4.命令写入时序
不管你是要读还是要写,都需要写命令,命令的内容决定了你是读还是写。写命令就是0.读命令就是1;
前面提到了,写命令需要rdy和en同时为高电平。因此红框内其实一直都是没有意义的,箭头处是真正的进行了写入命令。
5.写数据时序
写数据要跟着写命令是同时存在的,同时两种操作不一定非得同步进行,不需要对齐,可以超前一个时钟周期,可以同步进行,也可以延迟两个时钟周期再写入。无论那种情况,都要检查好使能控制信号的配合。
写多个数据的时序。背靠背没延迟
6.读数据时序
读数据不一定同步输出,可能存在一定的延迟,不论多少延迟限制,数据出来后会有对应的valid标志为准。
7.硬件原理图
DDR芯片与主控FPGA连接原理图,其中主要就是行地址、列地址以及BANK地址,同时还有双向的数据位。其他就是一些时钟复位还有控制信号之类的。
黄色框是整个系统的输入和输出,输出就是跟DDR芯片的硬件连接线。
红色框是DDR写数据和读数据的位宽切换模块和缓存模块。
蓝色框是DDR写命令的控制模块,负责时序的实现。
二、实验流程
1.实验目标
本节的实验任务是先向 DDR3 的存储器中写入 1024 个数据,写完之后再从存储器中读取相同地址的数据,若初始化成功,则 LED0 常亮,否则 LED0 闪烁;读取的值全部正确则 LED1 灯常亮,否则 LED1灯闪烁。
2.总体框图
根根据实验任务,可以大致规划出系统的控制流程:首先等待 DDR3 初始化完成后,FPGA 调用 ddr3测试数据模块向 ddr3 控制模块写入数据,数据写入到控制模块下的 fifo 控制模块,fifo 控制模块将写入数据的数据进行位宽转换后,然后写入到写 fifo 中,当写 fifo 中的数据超过一定数量时,ddr 读写模块就将写fifo 中的数据写入到 ddr3。当读 fifo 中的数据少于一定的数据量时,ddr 读写模块就从 ddr3 中读出数据写入 fifo 控制模块下的读 fifo 中,fifo 控制模块对读 fifo 的输出数据进行位宽转化后输出到 ddr3 测试数据模块,ddr3 测试数据模块将读出的数据和写入的数据进行对比,然后将对比的结果输出到 led 显示模块。
3.DDR3控制器
DDR3控制器这个模块包括 命令的控制,写数据的准备,读数据的处理,同时与IP核的交互,主要处理ip核与用户之间的接口,同时完成一定的时序。
这是进行写数据,为什么他写的过程是断断续续的,是因为写数据之前要看对应的状态是不是可写。同时测试模块设置了只写一次1024个数据,所以后面不再出现写数据的操作。
这是测试数据模块准备的写数据和标志,同时后面这部分是读数据,方便进行对比。
整个实验做完了,重点就是时序的了解,知道什么时候能写,什么时候能读。知道ip核的配置以及调用。
4.小疑问
为什么DDR写数据或者读数据会出现一节一节的断断续续,就是感觉好难受,强迫症看着狠抓。这是物理原因导致的是么,写数据或者读数据过程中会偶尔进行bank内的充放电?这个原因?
总结
做这个实验其实还看不太出来DDR本身的优势,比RAM,FIFO强到哪里了?还是因为数据量太少了,这个应用 场景还是更适合更大的数据量的通信场景。嗯嗯反正最起码先跑通么,先知道时序是个怎么事,后面至于应用起来再去实际调整。书到用时方恨少,方恨少呀。