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学习总结(一) 的相关文章

  • PRBS笔记

    1 概述 PRBS 伪随机二进制序列 也称为伪随机码 通常被用来测试高速信号的信号质量 伪随机 也说明了该码流并不是真正的随机 而是具有特性属性 码流由 多项式 决定 具有重复周期 PRBS具有多种阶数 如PRBS7 PRBS15 PRBS
  • 数字IC手撕代码-兆易创新笔试真题

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代
  • 平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真

    在过去的几年里 阿里集团平头哥陆续推出了几款RISCV处理器 有些处理器已经在产业界得到了应用 比如在某志的D1处理器中 就嵌入了平头哥的玄铁C906内核为 芯 RISCV虽然是一个开放标准 并且网络上也不乏一些开源核的RTL实现 但是商用
  • 【FPGA入门】第八篇、FPGA驱动VGA实现动态图像移动

    目录 第一部分 实现效果 第二部分 动态VGA显示的原理 1 将动态显示的区域提前进行赋值 2 图像块的移动是每张图片叠加后的效果 3 如何实现图像块位置的改变 第三部分 系统结构和驱动波形 1 系统的Top down结构 2 图像块移动的
  • 紫光同创 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信号相乘
  • 硬件基础知识

    SPI是串行外设接口 Serial Peripheral Interface 的缩写 是一种高速的 全双工 同步的通信总线 SCLK SCLK是一种有固定周期并与运行无关的信号量 CLK CLK是一种脉冲信号 TDNN 时延神经网络 它的两
  • DEBUG:Generate Bitstream失败

    问题 约束失败 解决 确保IO初始化引脚正确 和选择合适的电平
  • verilog中wire和reg类型的区别

    module counter parameter CNT MAX 25 d24 999 999 input wire sys clk input wire sys rst n output reg led out reg 24 0 cnt
  • 跨时钟域处理方法(一)——打拍

    一 说明 处理跨时钟域的数据可以分为单bit数据和多bit数据 而打拍的方法主要常见于处理单bit数据的跨时钟域问题 打拍的本质是通过添加寄存器 对输入的数据进行延拍 其主要目标是消除亚稳态的影响 常见的是打2拍 也就是添加2级寄存器 二
  • 小梅哥Xilinx FPGA学习笔记9——语法(阻塞与非阻塞赋值)

    阻塞赋值与非阻塞赋值详解 注意 阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 非阻塞赋值 1 设计文件 2 激励文件 3 原理图 4 仿真图 注意 阻塞赋值与非阻塞赋值 只有在时序逻辑中才有 不是阻塞赋值 也不是非阻塞赋值
  • FPGA提示产生latch的报错

    在fpga的设计中有时会遇到 latch 的报错 1 latch是什么 Latch 就是锁存器 是一种在异步电路系统中 对输入信号电平敏感的单元 用来存储信息 锁存器在数据锁存使能时 数据被锁存 输入信号不起作用 这违背了组合逻辑中输出随输
  • 吃透Chisel语言.18.Chisel模块详解(五)——Chisel中使用Verilog模块

    Chisel模块详解 五 Chisel中使用Verilog模块 上一篇文章讲述了用函数实现轻量级模块的方法 可以大幅度提升编码效率 Chisel中也提供了一些好用的函数 方便我们编写代码 也方便Chisel编译器优化生成的硬件电路 在Chi
  • 八段数码管动态显示(输入数据为BCD编码)

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

    从零开始的Verilog SPI协议设计 一 写在前面 1 1 协议标准 1 2 数字IC组件代码 1 3 设计要求 1 4 其他协议解读 1 4 1 UART协议 1 4 2 SPI协议 1 4 3 I2C协议 1 4 4 AXI协议 二
  • 使用七牛云进行文件上传

    目录 一 七牛云入门测试 1 注册七牛云账号 完成后选择对象存储 2 在里面创建空间 一个空间相当于一个文件夹 就是将对象上传到的地方 3 查看个人秘钥 注册完成账号后 会有一个秘钥 上传文件的时候进行授权和认证 4 文件上传测试 二 封装
  • 【FPGA多周期时序约束详解】- 解读FPGA多周期时序约束的全过程

    FPGA多周期时序约束详解 解读FPGA多周期时序约束的全过程 FPGA作为数字电路设计的常见工具 其设计中必然会遇到时序约束的问题 而多周期时序约束更是FPGA设计中不可避免的难点之一 本文将详细介绍FPGA多周期时序约束的全过程 并结合
  • 时序约束理解

    异步配置信息 跨时钟域 配置信息一般set max delay按照3delay来约束 2 异步回读 rst clear信号 设置set false path 放松时序约束要求 不应分析设计中的逻辑路径 因为不关心点到点时序要求
  • 基于FPGA的简易BPSK和QPSK

    1 框图 2 顶层 3 m generator M序列的生成 输出速率为500Kbps 4 S2P是串并转换模块 将1bit的m序列转换到50M时钟下的2bit M序列数据 就有4个象限 5 my pll是生成256M的时钟作为载波 因为s
  • Matlab图像处理系列——图像复原之噪声模型仿真

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

随机推荐

  • 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公司