DDR3的学习笔记(一)

写在前面——

        DDR3的英文全称是Double-Data-Rate Three Synchronous Dynamic Random Access Memory——第三代双倍数据率同步动态随机存取存储器。外观看上去就是内存条,属于SDRAM。简单介绍他的原理和功能就是:通过预读取和CQS的产生以及DLL的延时功能传输2倍于芯片位宽的数据。

一、工作流程的介绍【下面图片来源于网络】

①工作时首先进行芯片的初始化,这一点和SDRAM的MRS一样。

​​​

②如上图(左),进行Bank的选择和行地址的选择【同时进行】。

③tRCD(RAS和CAS之间的延迟),DDR3的tRCD可选1.5、2、2.5、3。就是延迟几个时钟周期。

④如上图(右),进行列地址和操作命令(是读还是写)发出【同时进行】。行地址和列地址共用一根地址线,但是可以通过行地址选通信号(RAS)以及列地址选通信号(CAS)区分,都是低电平有效。

读取数据时

⑤‘CL【CAS Latency】列寻址到数据发送之间的潜伏期【CAS到生成DQS之间的间隔】DQS下文提到。

        CL存在的意义在于  寻址完成以后获取到了芯片内部的数据,要实现预读取。在这一阶段要预读取完成同时完成 DQS的导入

【重点介绍】DQS——数据选取脉冲  

如上图可以看出来,在读取内存时,数据和DQS在差分信号交叉点处同时产生。

⑥’tAC【数据真正传到I/O接口与触发DQS之间的时间间隔】

        tAC的存在在于  数据传到I/O接口的时间有快有慢,但是要同步向外发出数据,这个间隔就是保证所有数据都到达I/O口

写入数据

⑤‘’tDQSS(DQS相对于写命令的延迟时间)

        tDQSS的存在意义在于 同步 在写入状态时DQS不是芯片内部产生的,是按发送方的DQS来。

        数据和DQS要等一段时间才能全部送达

在写入数据的时候,为了获取稳定的数据,我们都是在数据的电平处将数据取出来,所以CQS的边沿对着的是数据的电平处而不是边沿处

 ⑥‘’读后写操作

如上图读 取内存的时候要同步发送出去的数据而延迟CL

               以及写入数据时候要同步接收的数据而延迟tCQS

               以及如果CL=2.5时两者之间还要延迟半个周期(原因是写入命令的发送必须在时钟上升                 沿,而CL是2.5恰好让最后一个数据的发出是在CQS的上升沿)

 二,重点概念的介绍

1、CQS

        通过从L-Bank中一次性取出来内部的数据给到锁存器(8bit),锁存器将他们分成两部分(两个4bit)给复用器,复用器先后将他们发给发送器,每当CQS发生器产生CQS的边沿(上下边沿都算)的时候就发出去这两部分。

        由此可知在DDR中

        内部存储单元容量(芯片内部总线位宽)=2*芯片位宽(芯片I/O总线位宽)

2、突发长度和写入掩码

        突发长度指的是连续传输的周期数【有2、4、8】

        用DM信号屏蔽(外部输入),在CQS的边沿看DM的信号,高电平就屏蔽数据。

3、延迟锁定回路DLL

        DDR有两个时钟,一个是内部一个是外部。个人理解是内部时钟控制读,外部负责写,但是要求内外部时钟是同步的。但是绝对的同步时无法做到的(因此会有tAC),唯一能做到的就是两个时钟上升沿和下降沿的状态同步——方法就是延迟内部时钟使两时钟边沿同步——用到的就是DLL。

        有两种方法,分别时CC和CMS。

三、硬件实现

1、用vivado IP core中自带的功能实现MIG。

2、如果设置的输入时钟频率和开发板上的不一样记得加锁相环。

        clk period 是指期望多大的频率传输数据

        input clk period是输入频率,与开发板一样,如果不一样加锁相环。

        system clock选择No Buffer表示差分

        Reference clock表示DLL延迟时钟

3、驱动代码见下一篇笔记

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的Xilinx AXI读写DDR3的Verilog代码示例,假设使用AXI4接口和DDR3 SDRAM: ```verilog // AXI4 Master接口和DDR3 SDRAM连接 module axi_ddr3 ( input wire clk, // 时钟信号 input wire reset, // 复位信号 input wire [31:0] write_addr, // 写地址 input wire [31:0] write_data, // 写数据 input wire write_en, // 写使能 input wire [31:0] read_addr, // 读地址 output reg [31:0] read_data, // 读数据 input wire read_en // 读使能 ); // AXI4 Master接口声明 axi4_master #(.AW(32), .DW(32), .ID_WIDTH(4), .ADDR_WIDTH(32)) axi_master ( .aresetn(reset), // 复位信号 .aclk(clk), // 时钟信号 .araddr(read_addr), // 读地址 .arprot(2'b00), // 读保护 .arvalid(read_en), // 读使能 .arready(), // 读准备好 .rdata(read_data), // 读数据 .rresp(), // 读响应 .rvalid(), // 读有效 .rready(), // 读准备好 .awaddr(write_addr), // 写地址 .awprot(2'b00), // 写保护 .awvalid(write_en), // 写使能 .awready(), // 写准备好 .wdata(write_data), // 写数据 .wstrb(4'hf), // 写使能位宽 .wvalid(write_en), // 写有效 .wready(), // 写准备好 .bresp(), // 写响应 .bvalid(), // 写有效 .bready() // 写准备好 ); // DDR3 SDRAM接口声明 ddr3_sdr #(.SDR_TYPE("MOBILE"), .MEMORY_WIDTH(32), .ROW_WIDTH(13), .COL_WIDTH(10)) ddr3 ( .clk(clk), // 时钟信号 .cke(), // 时钟使能 .csn(), // 芯片择 .ras_n(), // 行地址通 .cas_n(), // 列地址通 .we_n(), // 写使能 .addr(), // 地址 .dq(), // 数据 .dm_n() // 数据掩码 ); // AXI4 Master接口和DDR3 SDRAM连接 assign ddr3.addr = axi_master.awaddr[31:0]; assign ddr3.dq = axi_master.wdata[31:0]; assign axi_master.rdata = ddr3.dq; assign ddr3.we_n = ~axi_master.awvalid & axi_master.wvalid & ~axi_master.wstrb[0]; assign ddr3.ras_n = ~axi_master.arvalid; assign ddr3.cas_n = ~axi_master.arvalid; assign ddr3.cs_n = ~axi_master.arvalid & ~axi_master.awvalid; assign axi_master.arready = 1; assign axi_master.rready = 1; assign axi_master.awready = 1; assign axi_master.bresp = 2'b00; assign axi_master.bvalid = axi_master.awvalid & axi_master.awready; endmodule ``` 这个代码示例中,使用了一个AXI4 Master接口和一个DDR3 SDRAM,通过互联实现了对DDR3 SDRAM的读写操作。需要注意的是,这只是一个简单的示例,实际的DDR3 SDRAM控制器需要更复杂的逻辑和状态机实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值