LJgibbs · 4月10日 · 黑龙江

DDR 学习时间: DDR 开源实现 高云 GW2A FPGA 的 DDR3 低延迟控制器

image.png

DDR 学习时间 Part I 将关注 DDR IP 实现,包括开源项目以及商业 IP。

本期写的是一个 Github 上的开源项目,基于 Tang Primer 20K 开发板和高云 GW2A FPGA 的 DDR3 控制器 IP。

项目介绍

这个项目是基于高云 FPGA 开发板 Tang Primer 20K 的 DDR3 控制器,使用了高云 OSER_MEM/DQS 等原语,因为实现比较高频的 DDR 速率(DDR3-800)需要借助芯片本身的高速 Pad 原语,所以本身只能用于高云的 FPGA,当然理论上在改动 PAD 相关的原语后也可以移植到别的 FPGA 上。

特点

据笔者了解,芯片厂家高云本身是提供了一个包含控制器和 PHY 的完整 DDR3 Memory Interface IP 的,也提供了只包括 PHY,由用户自行实现控制器的 DDR3 PHY Interface IP。如果开发者想实现特殊需求,可以基于 PHY IP 开发控制器逻辑。具体用法可以参考高云提供的文档和参考设计:

但是,这个项目中开发者连高云的 PHY IP 都没有使用,相当于开发了独立的 MC+PHY IP,只用到和 PAD/DLL 等高云 FPGA 原语。

但是,这个项目中开发者连高云的 PHY IP 都没有使用,相当于开发了独立的 MC+PHY IP,只用到和 PAD/DLL 等高云 FPGA 原语。

开发者的目标是低延迟的 DDR 控制器,以用于一些低延迟的场景,开发者举例道比如 FPGA Gaming(笔者:FPGA 怎么还有 gaming 一说)。控制器实现的最低读延迟是 90ns。

实现

项目的基础代码看起来基于 Tang 的相关例程,如串口打印模块等。

时钟与接口

控制器分别有三个时钟输入,包括一个低速的 100MHz 主时钟,高速的 DRAM ck 时钟,以及一个经过 90 度相移的高速时钟。高速时钟在 DDR3-800 时,频率为 400MHz。主时钟供逻辑使用,高速时钟只提供给 PAD 使用。

控制器 DRAM 侧的接口是基于开发板上的 16bit DRAM,注意这里实现中不支持突发操作,只支持 Signle 操作。

控制器用户逻辑这一侧实现的是一个简单的自定义接口,包括读写命令与地址输入,写数据输入和读数据输出。此外,还包括 writing leveling 和 read calibration 的完成状态和训练结果输出。

此外提供了 refresh 输入控制信号,可以由用户逻辑定时周期性触发控制器对 DRAM 的 refresh 操作。

特性

支持 ZQ calibration 和 dynamic ODT,用于优化 DRAM 信号完整性。

支持 writing leveling 和 read calibration 训练,用于找出最佳的写操作和读操作时的 DQSO 和 DQSI 时延。

资源

  • 1377 logic elements (6% on GW2A-18C)
  • 1 PLL
  • 1 DLL
  • 55 IO

其中控制器本身消耗的资源如下

image.png

仿真

项目使用 iverilog 和 gtkwave 的工具组合进行仿真,并提供了一个简单的仿真说明文档。

因为高云 FPGA 的 IDE 目前没有集成仿真功能,所以提取原语的行为级模型,和 RTL 以及 DDR3 行为级模型一起通过 iverilog 进行仿真,项目开发者提供的步骤如下(Windows 平台):

  • Icarus Verilog 11. This particular version works for me. The latest version has some issues (assertion errors) with the Micron DDR3 model.
  • Micron DDR3 memory model. Get it from Micron's website ("DDR3 SDRAM Verilog Model, version 1.74"). Extract the source files to this dir.
  • Gowin's prim_sim.v. It comes with Gowin IDE: for example Gowin_V1.9.8.07/IDE/simlib/gw2a/prim_sim.v.
  • GNU make: choco install make

运行命令

make run.controller

项目源文件分析

image.png

文档

项目提供了项目简介文档和仿真运行文档,但是缺少功能描述文档和设计描述文档。

RTL 代码

image.png

控制器代码在 ddr3_controller.v 中,ddr3_top.v 例化了 ddr3_controller 与 PLL,另外实现了一些用于测试的用户逻辑。

代码风格还不错,有提供不少注释,但所有控制器的逻辑都写在一个文件中,比较杂乱。

ddr3_controller.v 中的主体代码是 DDR3 控制状态机,控制状态跳转实现 DDR 初始化和读写时序,和在不同状态下控制 DDR Pad 的输入输出使能信号。

另外,ddr3_controller.v 例化了一些原语用于实现 DDR 的 PAD 功能,包括

  • OSER8 原语用于实现输出 pad
  • DQS 原语用于实现双向,延迟可调的 DQS pad
  • OSER8_MEM 和 IDES8_MEM 原语用于实现双向 DQ 和 DM pad,这个原语带有跨时钟域 FIFO

使用 DLL 原语来实现 DQS 的 90/270 度时延,产生相位延迟的 DQS,用于接收和发送 DQ。

Testbench 与仿真

如上文所述,项目了提供了一个与 Micron DDR model 一起仿真的 testbench。

项目中附上的完整流程仿真图如下

image.png

FPGA 实现

开发者实际上板测试时,通过串口打印的信息判断读写成功,

image.png

项目完成度

image.png

结语

这个 DDR 控制器项目只用到 PAD/DLL 相关的高云 FPGA 原语,实现了一个独立的 MC+PHY IP,不依赖于高云 FPGA 自身的 DDR MC 或者 PHY IP。控制器的特点是可以实现 DDR3-800 下低至 90 ns 的读延迟,相当于 400MHz 控制器时钟的 36 个周期。另外从资源使用情况来看,小于官方提供的 MC+PHY Memory Interface IP。

控制器在正常读写操作以外,还支持 ZQ calibration, writing leveling, read calibration and dynamic ODT 等功能。但是,控制器只支持 Single 不支持 Burst 操作,这让实用性方面打了不少折扣。尽管如此,这个项目还是给高云 FPGA 和 Tang 开发板的 DDR 开发提供一些参考。

本期我们讨论了一个基于高云 FPGA 和 Tang 开发板的 DDR3 MC+PHY 控制器方案:

  • 项目介绍
  • 项目源文件分析

后续将继续发掘 DDR IP 相关开源实现,以及整理商业 DDR IP 实现,为计划中的更完善、更具工业界使用价值的 DDR IP 开源项目打基础。

作者:LogicJitterGibbs
原文:知乎

相关文章推荐

更多FPGA干货请关注FPGA的逻辑技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
10515
内容数
513
FPGA Logic 二三事
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息