十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于FPGA的SDRAM开发-进阶篇

基于FPGA的SDRAM开发-进阶篇 一、SDRAM是什么SDRAM英文全称“Synchronous Dynamic Random Access Memory”中文全称同步动态随机存储器。同步(Synchronous)SDRAM有一个同步接口其工作时钟的时钟频率与对应控制器(CPU/FPGA)的时钟频率相同并且SDRAM内部的命令发送与数据传输都是以此时钟为基准实现指令或数据的同步操作动态(Dynamic)SDRAM需要不断的刷新来给电容进行充放电如果原本电容里所存储的数据为1则需要不断地刷新进行充电如果原本电容里所存储的数据为0则需要不断地刷新进行放电。保证存储阵列内数据不丢失随机(Random)数据在 SDRAM 中可以自由指定地址进行数据的读写。二、SDRAM的发展史随着时代的不断发展、技术的不断更新SDRAM的更新历经五代分别是第一代SDR SDRAM第二代DDR SDRAM第 三代DDR2 SDRAM第四代DDR3 SDRAM第五代DDR4 SDRAM。SDR是single data rate单数据速率只在时钟的上升沿进行数据采样DDR是double data rate双倍数据速率在时钟的上升沿和下降沿都进行数据采样SDR SDRAM到DDR SDRAM的区别DDR SDRAM的读写速度快、功耗低、内核电压越来越低(SDR:3.3V 、DDR:2.5V、DDR2:1.8V、DDR3:1.5V、DDR4:1.2V)。三、应用场景1、电脑内存条2、FPGA开发板用于扩大FPGA芯片的存储容量缓存图像数据和高速接口的数据。FPGA内部的BRAM资源很少也很宝贵四、SDRAM数据存取原理1、数据存储架构及工作原理SDRAM 内部可以理解为一个存储阵列如下图。我们将 SDRAM 内部存储阵列类比成一张表格表格中的每一个单元格可以类比为存储阵列的单个存储单元。 这个存储阵列我们称之为一个Bank一般情况下我们会设计多个bank用来扩展FPGA芯片的存储容量。因为FPGA芯片的BRAM资源是很少的也很宝贵。在对 SDRAM 进行数据存取时要先确定 Bank 地址定位到指定逻辑 Bank再依次确定行地址(Row Address)和列地址 (Column Address)选中存储单元进而进行数据的存取操作而且一次只能对一个Bank的一个存储单元进行操作。SDRAM的一个存储单元的容量有若干个 Bit每个Bit存放于一个单独的存储体中该存储体利用电容能够保持电荷以及可充放电的特性来存储0/1主要由行选通三极管、列选通三极管、存储电容以及刷新放大器构成如下图。电容所存储的电荷会随时间慢慢释放这就需要不断的动态刷新为电容充放电以保证存储数据可靠性。将每个存储单元简化为单 Bit 的存储体再将若干存储体排列为矩阵同一行将行地 址线相连同一列将列地址线相连就构成了一个存储阵列的简化模型。SDRAM 内部存储阵列的简化模型具体见图 53-3。2、SDRAM总存储容量计算如上表我们知道了行地址位宽为15bit列地址位宽为10bit每个存储单元大小为16bit一共有8个bank。那么该芯片的存储容量为2^15 * 2^10 * 16bit * 82^32 bit2^12Mbit2^9 MB 512MB.五、SDR SDRAM和DDR3 SDRAM区别对比1、硬件图纸SDR SDRAM的硬件图纸DDR3 SDRAM的硬件图纸由硬件图纸可以发现SDR SDRAM的供电电压为3.3V而DDR3 SDRAM的供电电压为1.5V。且DDR3 SDRAM多了参考电压VREFCA、VREFDQ。2、信号线SDR SDRAM的信号线DDR3 SDRAM相对于SDR SDRAM多了几根信号线1DQSL、DQSL_N为低字节数据选通信号输出时与读取数据边缘对齐输入时与写入数据中心对齐。2DQSU、DQSU_N为高字节数据选通信号输出时与读取数据边缘对齐输入时与写入数据中心对齐。3CK、CK_NSDR SDRAM的时钟线是单端的DDR3 SDRAM的时钟线是差分的。因为SDR SDRAM的工作时钟的时钟频率相对较低一般为100Mhz而DDR3 SDRAM的工作时钟的时钟频率比较高一般为800/900Mhz。具体时钟频率需要相关的数据手册。4ODT控制芯片内部的终端电阻。当ODT引脚为高电平时启用内部终端电阻为低电平时禁用内部终端电阻。这些终端电阻会应用于数据输出引脚DQ、数据选通DQS、DQS_N和数据掩码DM等引脚以减少信号传输过程中的反射提高信号完整性。不过若通过模式寄存器命令禁用ODT功能此引脚输入将被忽略。六、SDRAM的各种操作命令SDRAM的操作命令激活命令就是选择要操作的是哪一个bank的哪一行突发终止假设我们在模式寄存器中配置了一次突发的长度是10个数据当我们要在哪一个bank的哪一行的哪一列进行读/写操作那么当我们进行读/写操作5个数据之后不希望它继续进行读/写操作了我么可以发送突发终止命令结束当前的读/写操作。预充电命令假设我们要在多个行里进行读/写操作先通过激活命令选择操作的哪一个bank的哪一行然后发送读/写命令选择哪一列并执行相应的操作当我们完成了对该行的操作之后需要换到别的行进行操作就需要发送预充电命令再一次发送激活命令对别的行进行操作。配置模式寄存器命令可以配置突发长度、突发类型顺序/隔行、列选通潜伏期(CAS Latency)、运行模式(Operating Mode)(标准模式/测试模式等)、写模式(控制写操作是否为突发方式)。七、初始化时序图、读写时序图1、SDR SDRAM2、DDR3 SDRAM3、DDR3 SDRAM-Xilinx MIG IP 核1写时序clk系统时钟信号所有其他信号的采样和状态跳变都同步于该时钟的上升沿。注意户千万不能自己用 PLL 去生成这个时钟然后连给它。必须把IP核输出的ui_clk端口直接接到逻辑模块的时钟端口上。1命令与地址通道 (Command/Address Interface)app_cmd写/读命令。输入信号表明当前要执行的操作类型。3b000写入和3b001读出app_addr写/读地址。输入信号表示要写入数据的起始地址。按照结构从高位到低位是rank bank row columnapp_en命令/地址使能信号。输入信号当它为高电平时表示当前的app_cmd和app_addr是有效的。控制器只有检测到app_en为高时才会采样命令和地址。app_rdy控制器命令就绪信号。输出信号。当它为高电平时表示控制器当前可以接收新的命令。用户必须在app_en和app_rdy同时为高的那个时钟周期命令才会被成功接收握手成功。2写数据通道 (Write Data Interface)app_wdf_data写数据。输入信号表示要写入到 DDR 存储器中的数据图中依次为 W a0 到 W g0。app_wdf_mask写数据掩码。输入信号用于屏蔽app_wdf_data中的某些字节Byte Mask。当对应的位为 1 时该字节的数据不会被写入 DDR。app_wdf_wren写数据使能信号。输入信号当它为高电平时表示app_wdf_data总线上的数据是有效的控制器将对其进行采样。app_wdf_end写数据结束信号。输入信号用于指示这是当前突发Burst写操作的最后一个有效数据周期。这对于控制器判断何时将数据真正提交到 DDR 内部至关重要。只要让它跟app_wdf_wren一样就行了一句app_wdf_end app_wdf_wren 搞定。app_wdf_rdy控制器数据就绪信号。输出信号。当它为高电平时表示控制器内部的写数据 FIFO 未满可以接收用户发来的数据。用户必须在app_wdf_wren和app_wdf_rdy同时为高时数据才会被成功写入 FIFO。2读时序读时序和写时序在命令通道app_cmd、app_addr、app_en、app_rdy上的握手机制完全一样但最大区别在于数据通道的方向。读数据通道app_rd_data读数据总线。输出信号。是从 DDR 内存中成功读取并返回的实际有效数据。app_rd_data_valid读数据有效信号。输出信号。用户逻辑必须始终检查这个信号。当它为高电平时表示当前app_rd_data总线上的数据是合法有效的如果是低电平则数据无效用户必须忽略。注意1、读潜伏期Read Latency2、数据突发Burst连续输出。补充这图上显示了123三种情况。1是严格对齐2和3告诉你命令与地址通道和写数据通道之间稍微有点前后偏差也是可以接受的。八、DDR3/4 IP核解决了什么问题DDR3/4 IP 核它主要替我们搞定了下面几层1. 时序与协议合规DDR3/4 的命令时序非常严格tRCD、tRP、tRFC、tFAW等还要管理 bank/row 打开与关闭、读写切换、预充电。手写控制器很容易漏掉某个时序约束而结果不是立即报错而是偶发的数据错误或系统不稳定。IP 把这些全部做成硬件状态机保证任何命令组合都满足时序。2. 上电初始化和刷新DDR 上电后要按固定流程做初始化、配置模式寄存器MR0~MR3之后还要周期性自动刷新否则数据会丢失。刷新又必须和读写请求穿插调度不能卡住正常访问。这些 IP 会自动完成。3. 物理层PHY和训练校准这是纯逻辑最难的部分高频 DQ/DQS 信号有走线延迟、片内延迟和温度漂移需要 write leveling、读/写校准、延迟链自动调节还要处理 ODT 端接和阻抗匹配。IP 会用 FPGA 里专用的延迟资源配合校准逻辑来做普通 RTL 很难可靠复现。4. 时钟域和接口转换内存侧通常是窄位宽、高频率、burst 式的访问用户不想直接面对这种接口。IP 会转成 AXI4、Native 或 Avalon 这类宽位宽、相对低频、带握手的接口把寻址、burst 拆分、跨时钟域都屏蔽掉。5. 性能与可靠性控制器内部会做 bank 交织、预取调度、写合并等优化最大化带宽利用而且 IP 经过厂商验证带仿真模型和上板参考设计比从零写控制器省下数人月到数十人月也大幅降低调试风险。它不解决的部分也很明确应用层的缓存/替换策略、多端口仲裁、ECC部分 IP 可选支持、PCB 布线质量以及颗粒型号和频率配置等仍需要你自己设计或配置。一句话总结DDR3/4 IP 把最容易出错、最难调试、耗时最长的协议和物理层问题变成“配置好参数 用标准接口读写”让你把精力放在自己的业务逻辑上。使用vivado配置DDR3 IP核链接
返回列表