DDR3学习总结(一)

2023-11-17

简介
DDR3 SDRAM常 简称 DDR3 是当今较为常见的一种储存器,在计算机及嵌入式产品中得到广泛应用,特别是应用在涉及到大量数据交互的场合,比如电脑的内存条。对DDR3的读写操作大都借助IP核来完成,本次实验将采用 Xilinx公司 MIG IP核来实现DDR3读写测试。 DDR3相对于SDRAM是双沿触发,读写速度快一倍。相对于DDR2有更高的运行性能和更低的电压。本次实验使用的 DDR3芯片是MT41J256M16HA-125 ,bank位宽为 3,行位宽为 15,列位宽为10,所以它的地址大小等于即 2^28=256M,数据位宽为 16bit,所以容量大小为 256M*16bit,也就是 512MByte。

具体介绍可以看datasheet

在这里插入图片描述
在这里插入图片描述

DDR 存储

可以把ddr理解为一个方格本,bank就是代表这个本子有多少页,行列地址,可以理解为一页中一行有多少个格子col,一页有多少行row。ddr写数据和地址就是将数据填到相应的格子里。

在这里插入图片描述

硬件部分

根据不同的功能引脚有,可将DDR3引脚划分为4类:地址总线引脚、数据总线引脚、控制引脚、电源与参考电压引脚。在原理图上根据分类连接好引脚,可以参考黑金A7的核心板。

在这里插入图片描述

布局布线的话,会有硬件工程师和PCB layout工程师进行设计,电源完整性,布局布线,差分,等长,阻抗匹配,EMI问题等。

软件部分

MIG IP核是硬核,左侧是用户接口,右侧是芯片接口。如下图

如果只是单纯想要简洁快速实现DDR读写功能的话,需要着重了解的是用到的用户接口的相关信号,例化配置好 Xilinx公司 MIG IP核 ,然控制各信号进行读写即可。

在这里插入图片描述

用户接口信号在后面会详细介绍,下面我们先配置MIG IP。

MIG IP设置
新建MIG IP如下所示,在这里我们不使用AXI接口,下一步;

在这里插入图片描述

选择兼容其他相同封装不同型号的FPGA,我们这里不选择。

在这里插入图片描述

选择DDR3;

在这里插入图片描述

时钟配置Clock Period,即DDR芯片物理侧的IO时钟频率,称之为核心频率;(选择FPGA性能好的片子,DDR频率也可以到更高,手头上的xc7a100tfgg484-2 DDR3能到400M)

物理侧到控制器时钟的比例,可选4:1或2:1;决定了ui_clk的频率;如图配置的话,ui_clk = 400M /4 =100Mhz

选择DDR3的类型,Components指的是DDR3的型号是元件类,服务器用的是RDIMMs和UDIMMs,笔记本那种的插条类是SODIMMs。

数据位宽,由DDR型号决定,但是当FPGA挂了多片DDR时,位宽相应增加,我们这里用了两片,所以位宽为32;

在这里插入图片描述

系统时钟输入,建议200M,后面参考时钟可以直接使用系统时钟。

在这里插入图片描述

系统时钟是使用200M的差分时钟,低电平复位

在这里插入图片描述

50欧电阻,根据硬件而定,不用管,直接NEXT;

在这里插入图片描述

新设计 or 管脚已固定

在这里插入图片描述

如果硬件已经定了,那么就选下面管脚已固定,然后读取约束文件,设置管脚就好。

引脚约束

DDR3用到的约束引脚较多,建议导入。 用到3种电平: LVCMOS、 SSTL和 DIFF_SSTL。 LVCMOS:全称 Low Voltage Complementary Metal Oxide Semiconductor,低压互补金属氧化物半导体。 SSTL:全称 Stub Series Terminated Logic 短截线串联端接逻辑。 DIFF_SSTL:全称Difference Stub Series Terminated Logic,差分短截线串联端接逻辑。 LVCMOS 的特点是噪声容限大,速度较SSTL 慢;SSTL 速度快,通常要匹配合适的端接电阻,常用于高速内存接口如DDR3;DIFF_SSTL 则是带有差分功能的SSTL。

在这里插入图片描述

后面依次NEXT就好了,最后生成。

在这里插入图片描述

下面是设置完成后的总结页面;

在这里插入图片描述

IP核生成完毕,打开veo文件查看例化文件,就可以添加到自己的工程里使用了。

 ddr3_top ddr3_top_inst(
        // Inputs
        // Differential system clocks and rst
        .sys_clk_p                      (sys_clk_p                     ),  // input         sys_clk_p
        .sys_clk_n                      (sys_clk_n                     ),  // input         sys_clk_n
        .sys_rst                        (1'b1                          ),  // input             sys_rst
        // Inouts
        .ddr3_dq                        (ddr3_dq                       ),  // inout  [31:0] ddr3_dq
        .ddr3_dqs_n                     (ddr3_dqs_n                    ),  // inout  [3:0]      ddr3_dqs_n
        .ddr3_dqs_p                     (ddr3_dqs_p                    ),  // inout  [3:0]      ddr3_dqs_p
        // Outputs
        .ddr3_addr                      (ddr3_addr                     ),  // output [14:0] ddr3_addr
        .ddr3_ba                        (ddr3_ba                       ),  // output [2:0]      ddr3_ba
        .ddr3_ras_n                     (ddr3_ras_n                    ),  // output [0:0]      ddr3_ras_n
        .ddr3_cas_n                     (ddr3_cas_n                    ),  // output            ddr3_cas_n
        .ddr3_we_n                      (ddr3_we_n                     ),  // output            ddr3_we_n
        .ddr3_reset_n                   (ddr3_reset_n                  ),  // output            ddr3_reset_n
        .ddr3_ck_p                      (ddr3_ck_p                     ),  // output [0:0]      ddr3_ck_p
        .ddr3_ck_n                      (ddr3_ck_n                     ),  // output [0:0]      ddr3_ck_n
        .ddr3_cke                       (ddr3_cke                      ),  // output [0:0]      ddr3_cke
        .ddr3_cs_n                      (ddr3_cs_n                     ),  // output [0:0]      ddr3_cs_n
        .ddr3_dm                        (ddr3_dm                       ),  // output [3:0]      ddr3_dm
        .ddr3_odt                       (ddr3_odt                      ),  // output [0:0]      ddr3_odt  
        // user interface signals
        .app_addr                       (app_addr                      ),  // input  [27:0] app_addr
        .app_cmd                        (app_cmd                       ),  // input  [2:0]      app_cmd
        .app_en                         (app_en                        ),  // input         app_en
        .app_wdf_data                   (app_wdf_data                  ),  // input  [255:0]    app_wdf_data
        .app_wdf_end                    (app_wdf_end                   ),  // input         app_wdf_end
        .app_wdf_mask                   (32'd0                         ),  // input  [31:0] app_wdf_mask
        .app_wdf_wren                   (app_wdf_wren                  ),  // input         app_wdf_wren
        .app_rd_data                    (app_rd_data                   ),  // output [255:0]    app_rd_data 
        .app_rd_data_end                (app_rd_data_end               ),  // output            app_rd_data_end 
        .app_rd_data_valid              (app_rd_data_valid             ),  // output            app_rd_data_vali
        .app_rdy                        (app_rdy                       ),  // output            app_rdy         
        .app_wdf_rdy                    (app_wdf_rdy                   ),  // output            app_wdf_rdy     
        .app_sr_req                     (1'b0                          ),  // input         app_sr_req
        .app_ref_req                    (app_ref_req                   ),  // input         app_ref_req
        .app_zq_req                     (1'b0                          ),  // input         app_zq_req
        .app_sr_active                  (app_sr_active                 ),  // output            app_sr_active    
        .app_ref_ack                    (app_ref_ack                   ),  // output            app_ref_ack      
        .app_zq_ack                     (app_zq_ack                    ),  // output            app_zq_ack       
        .ui_clk                         (ui_clk                        ),  // output            ui_clk           
        .ui_clk_sync_rst                (ddr_rst                       ),  // output            ui_clk_sync_rst  
        .init_calib_complete            (init_calib_complete           ),
        .device_temp                    (device_temp                   )
    );

对于mig与DDR3的读写原理我们不需要了解太多,交给mig就可以了。我们需要做的是控制好用户接口,写出正确的用户逻辑,控制好读写时序。想要写好User logic,我们就必须清楚各个用户控制接口的含义:

在这里插入图片描述

在这里插入图片描述

读写时序

读写时序如下所示:

在这里插入图片描述

基本时序如上。app_rdy表示UI已经准备好接收命令了,意思就是说必须要等app_rdy信号拉高了之后,app_en有效,app_cmd命令才能被接收。而且app_rdy信号,不受控制,不管是读还是写,都必须在app_rdy为高的时候进行操作。

写DDR的前提条件是(app_rdy & app_wdf_rdy)全部为高时,给出地址和命令(app_cmd = 3’b000),然后给出写数据的信号(使能与数据),就可以成功写入数据到DDR了。

在这里插入图片描述

地址和命令必须时序严格对齐!写数据信号相对来说有三种情况:①完全同步;②可以提前1拍;③最多延迟2拍;但是最好全部时序对齐,不容易出错。

读操作就简单了,在前提条件app_rdy为高时,给出命令(app_cmd = 3’b001)与地址(app_addr),读出的数据往往要晚若干个周期,以valid信号表示数据有效。

在这里插入图片描述

连读连写的时序如下图所示

在这里插入图片描述

在这里插入图片描述

总结:

结合上图分析

(1)写数据时需要先满足app_rdy,app_wdf_rdy,app_en有效,然后发送写命令和地址app_cmd,app_addr,最后写数据app_wdf_wren,app_wdf_data,app_wdf_end

(2)读数据时满足app_rdy,app_en有效,然后发送读命令和读地址app_cmd,app_addr,等待有效信号和数据app_rd_data,app_rd_data_valid

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DDR3学习总结(一) 的相关文章

  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • 平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真

    在过去的几年里 阿里集团平头哥陆续推出了几款RISCV处理器 有些处理器已经在产业界得到了应用 比如在某志的D1处理器中 就嵌入了平头哥的玄铁C906内核为 芯 RISCV虽然是一个开放标准 并且网络上也不乏一些开源核的RTL实现 但是商用
  • DDR的VTT有源端接和无源端接(slua886a笔记)

    DDR的VTT有源端接和无源端接 slua886a笔记 背景 对于DDR的VTT端接 一直有说法是有源端接可降低功耗 之前一直没仔细理解其中原因 现在找了些相关的资料来介绍和对比有源和无源端接 理解有源端接的优点和降低功耗的原理 主要基于读
  • PLL时钟约束

    方法 1 自动创建基时钟和 PLL 输出时钟 例 derive pll clocks 这一方法使您能够自动地约束 PLL 的输入和输出时钟 ALTPLL megafunction 中指定的 所有 PLL 参数都用于约束 PLL 的输入和输出
  • 紫光同创 FPGA 开发跳坑指南(三)—— 联合 Modelsim 仿真

    Modelsim 是 FPGA 开发中重要的 EDA 设计仿真工具 主要用于验证数字电路设计是否正确 紫光 Pango Design Suite 开发套件支持联合 Modelsim 仿真 这里作简要的介绍 添加仿真库 方法一 打开 Pang
  • Matlab 高斯信道下QPSK通带通信系统的简单仿真

    1 原理 2 仿真 3 总结反思 4 参考资料 1 原理 QPSK的具体内容请参考百度 QPSK的调制jie框图大致如下 QPSK信号可以采用正交调制的方式产生 如第一张图片的左半部分 I路信号与cos 信号相乘 Q 路信号与sin信号相乘
  • DEBUG:Generate Bitstream失败

    问题 约束失败 解决 确保IO初始化引脚正确 和选择合适的电平
  • 用Vscode编辑verilog代码配置

    这篇教程感觉很详细了 我这里分享一下vscode和插件的安装包链接 都是官网下载的 放心食用 用VSCode编辑verilog代码 iverilog编译 自动例化 自动补全 自动格式化等常用插件 链接 https pan baidu com
  • FPGA的基本设计流程

    FPGA开发主要包括系统设计 设计输入 功能仿真 综合优化 综合后仿真 实现与布局布线 时序方针与验证 板级方针与验证 芯片编程与调试等9个部分 如下图所示 1 电路设计 在系统设计之前 首先要进行的是方案论证 系统设计和FPGA芯片选择等
  • 数码管电子时钟

    文章目录 前言 一 回顾数码管 二 任务描述 三 系统框图 四 模块调用 五 模块原理图 六 工程源码 6 2 时钟计数模块代码 6 2 数码管驱动模块代码 6 3 顶层模块代码 七 仿真测试 7 1 测试代码 7 2 仿真结果 八 管脚信
  • 实验1-FPGA编程入门

    文章目录 一 认识全加器 二 输入原理图实现1位加法器 一 半加器原理图输入 二 全加器原理图输入 三 Verilog语言实现全加器 四 总结 五 资料参考 一 认识全加器 一 半加器 1 逻辑分析 如下图所示 半加器只有两个输入和两个输出
  • Verilog实现两路组相联cache

    cache代码 timescale 1ns 1ps cache共32块 分为16组 每组2块 即两路组相联 1块 4字 1字 4字节 主存共1024块 4096个字 主存地址共12位 1 0 为块内偏移 5 2 为组地址 11 6 为Tag
  • FPGA硬件工程师Verilog面试题(基础篇二)

    作者简介 大家好我是 嵌入式基地 是一名嵌入式工程师 希望一起努力 一起进步 个人主页 嵌入式基地 系列专栏 FPGA Verilog 习题专栏 微信公众号 嵌入式基地 FPGA硬件工程师Verilog面试题 二 习题一 多功能数据处理器
  • 八段数码管动态显示(输入数据为BCD编码)

    八段数码管动态显示 输入数据为BCD编码 一 数码管概述 图1 八段共阴数码管内部等效原理图 图2 八段共阳数码管内部等效原理图 上面两图分别是对应八段共阴 共阳的数码管内部等效图 共阴是将八个LED数码管的阴极连接在一起接低 阳极segm
  • IC数字后端

    在 innovus 里面 有时候我们需要控制 tie cell 的 fanout 和 net length 来避免 tie cell 可能出现 max transition 或者 max fanout 的违例 一般来说 只要 fanout
  • 【FPGA】通俗理解从VGA显示到HDMI显示

    注 大部分参考内容来自 征途Pro FPGA Verilog开发实战指南 基于Altera EP4CE10 2021 7 10 上 贴个下载地址 野火FPGA Altera EP4CE10征途开发板 核心板 野火产品资料下载中心 文档 hd
  • 硬核 | 从零制作一个激光雷达需要多久?

    编辑 ADS智库 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 硬件交流 技术交流群 本文只做学术分享 如有侵权 联系删文 激光雷达 LiDAR 是激光探测及测距系统的简称 目前广泛应用在无
  • 串口通信知识点总结

    串口是串行接口 serial port 的简称 也称为串行通信接口或COM接口 串口通信是指采用串行通信协议 serial communication 在一条信号线上将数据一个比特一个比特地逐位进行传输的通信模式 串口按电气标准及协议来划分
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二
  • Vivado ILA的debug信息保存与读取

    保存 write hw ila data D Project FPGA ILA Debug Data 202401041115 ila upload hw ila data hw ila 1 读取 display hw ila data r

随机推荐

  • java插入gif_Java swing(纯代码和含部分个人解析)插入png或gif图片的方法,切换界面功能的实现...

    package swing public class mains public static void main String args new swing package swing import java awt Color impor
  • 听说,你想做大模型时代的应用层创业!

    亲爱的科技探险家们和代码魔法师们 未来的钟声已经敲响 预示着一场极度炫酷的虚拟现实游戏即将展开 从初期简单的智能识别 到设计师级别的图纸设计 生成式AI技术 Generative AI 以其独特理念和创新模式重塑了传统内容生产效率和交互模式
  • Unity手机端3档震动

    using System Collections using System Collections Generic using UnityEngine public class VibrateHelper MonoBehaviour sta
  • elementui dialog组件固定高度

    弹窗高度过大 想设置个自适应的高度 固定头尾 deep el dialog margin 5vh auto important deep el dialog body height 70vh overflow auto margin hei
  • ChatGPT救命!4岁男孩3年求医17位专家无果,大模型精准揪出病因

    克雷西 萧箫 发自 凹非寺量子位 公众号 QbitAI 怪病 缠身3年求医无果 最终竟然被ChatGPT成功诊断 这是发生在一名4岁男孩身上的真实经历 某次运动后 他身体开始剧痛 母亲前后带她看了17名医生 从儿科 骨科到各种专家 先后进行
  • DeferredResult的使用场景及用法

    场景 假设我们现在要实现这样一个功能 浏览器要实时展示服务端计算出来的数据 一种可能的实现是 浏览器频繁 例如定时1秒 向服务端发起请求以获得服务端数据 但定时请求并不能 实时 反应服务端的数据变化情况 若定时周期为S 则数据延迟周期最大即
  • 小程序支付完整过程。足够详细!

    1 注册小程序 拿到App id 和 AppSecret 小程序密钥 取得商户的微信支付商户号 MCHID 和 微信支付密钥 APIKEY 2 流程 微信用户在微信端选商品下单 后台响应下单生成单号 产生第一次签名数据 提交微信统一支付接口
  • IDA工具介绍

    往期推荐 IDA工具安装 分享 ARM处理器寻址方式 ARM指令集 ARM汇编语言程序结构 昨天给大家概括性的了解了IDA工具 今天分享IDA工具的实际应用 一 IDA打开so文件 1 首先打开IDA工具 进入选项界面 直接选中Go选项 如
  • 初识 libcurl multi:实现一个 http 请求处理客户端,一个线程玩命发一个线程吐血收

    一 引言 最近在工作中 遇到了这么一个需求 我们希望拥有一个高性能的 http 请求处理客户端程序 这个客户端要求有这样的架构 它拥有两个线程 一个线程接收业务程序通过消息队列发来的批量的 http 请求信息 进行批量的 http 请求 另
  • 深入了解scratch中的“移动10步”和(你真的了解scratch吗?scratch初学者值得一看)

    scratch中的 移动10步 是scratch运动类积木中的第一个积木 也是大多数初学者使用scratch的时候用到的第一个积木命令 当我们运行 移动10步 积木时 小猫会向右移动10步 目测其实也就一点点距离 那么 移动10步 究竟在s
  • 正交多项式-勒让德多项式,两类切比雪夫多项式及零点,拉盖尔多项式,埃尔米特多项式

    1 正交多项式 设 n x 是 a
  • Linux 云服务器运维(操作及命令)

    1 什么是linux服务器load average Load是用来度量服务器工作量的大小 即计算机cpu任务执行队列的长度 值越大 表明包括正在运行和待运行的进程数越多 2 如何查看linux服务器负载 可以通过w top uptime p
  • Tomcat多实例部署

    文章目录 一 Tomcat多实例的操作步骤 1 关闭防火墙 将安装 Tomcat 所需软件包传到 opt目录下 2 安装JDK 3 安装 tomcat 4 配置 tomcat 环境变量 5 修改 tomcat2 中的 server xml
  • Qt设计模式与运行界面有偏差 Qt自适应高清屏

    原因Qt对高分辨率屏幕支持的问题 设置下属性 注意在应用程序实例之前设置 int main int argc char argv if QT VERSION gt QT VERSION CHECK 5 9 0 QApplication se
  • 安装NVIDIA CUDA失败最简单详细解决方法

    针对于这样的情况直接下载显卡驱动卸载工具 进入网站 点击下载 网页下拉 会出现如下图所示的内容 点击官方下载 下载软件 运行程序 下载完之后是一个压缩包的形式 解压缩 之后点击运行 如果不是最新版本会跳出如下弹出框 程序是否为最新版本没有影
  • 服务器怎么修改mac,服务器如何修改MAC地址

    服务器如何修改MAC地址 内容精选 换一换 如果要自定义裸金属服务器的DNS服务器信息 需要将裸金属服务器网络设置为静态IP 若将动态DHCP改为静态IP设置 IP和网关等网络信息必须和裸金属服务器下发时保持一致 否则可能会引起网络不通 以
  • Flask框架学习整理——从零开始入门Flask

    文章目录 Flask框架 一 简介 二 概要 三 知识点 附代码 1 Flask基础入门 1 路由route的创建 2 endpoint的作用 3 request对象的使用 4 请求钩子before after request 5 redi
  • Day6:浅谈useState

    目标 持续输出 每日分享关于web前端常见知识 面试题 性能优化 新技术等方面的内容 Day6 今日话题 谈谈react hooks中的useState 将从以下七个角度介绍 用法 参数 返回值 作用 工作原理 优缺点 注意点 用法 use
  • Map BSTMap映射代码(java)

    public interface Map
  • DDR3学习总结(一)

    简介 DDR3 SDRAM常 简称 DDR3 是当今较为常见的一种储存器 在计算机及嵌入式产品中得到广泛应用 特别是应用在涉及到大量数据交互的场合 比如电脑的内存条 对DDR3的读写操作大都借助IP核来完成 本次实验将采用 Xilinx公司