FPGA DDR3简介及时序

一,DDR3基础知识

1、DDR3全称第三代双倍速率同步动态随机存储器。

特点:①掉电无法保存数据,需要周期性的刷新。

        ②时钟上升沿和下降沿都会传输数据。

        ③突发传输,突发长度Burst Length一般为8

2、DDR3的存储: bank、行地址和列地址

数据怎么存入到DDR3:先指定一个Bank地址,再指定行地址,最后指定列地址。

DDR3容量计算: bank数量×行数量×列数量×存储单元容量。

比如bank address位宽为3, Row address位宽为14, Column address为10,

则容量为: 243 × 2^14 × 2^12 × 16bit

3,DDR3命名

以MT41K256M16 为例,其命名规则如下:

从DDR3的命名,我们可以得出几点有用的信息:

① DDR3 传输数据端口的位宽

② DDR3支持的最大的时钟频率

③ DDR3 传输数据的带宽

二,时钟

1、时钟类别(不要弄混淆哦)

系统时钟: MIG IP核工作时钟,一般命名为sys_clk。

参考时钟: MIG IP的参考时钟,必须为 200M,命名为ref_clk

DDR3芯片工作的时钟:由FPGA输入到DDR3芯片,为差分时钟

用户端时钟: MIGIP核输出给用户端的时钟,命名为ui_clk

三,MIG IP核

XILLNX FPGA芯片分为2种:

1,A7,X7系列(纯FPGA)

2,ZYNQ系列(带有ARM芯片)

这两种芯片往DDR3中写数据是不一样的

第一种直接用 MIG IP核 往里面写就可以了

第二种是不一样的 一般是挂载在PL端,往HP里面写数据(详情可参考FPGA-AXI4接口协议概述

这里使用的是纯FPGA往DDR3写数据

创建工程(参考FPGA_Vivado开发流程(PL端)3-8译码器为例

关于AXI4接口可查看这里

No Buffer 是什么意思?No Buffer 就是 MIG IP 核内部没有例化(IBUF 原语)

MIG IP 核配置结束

写数据时序图

读数据时序图

对打开的IP核例程 直接运行仿真

波形如下

### 关于DDR3读写信号时序DDR3的读写操作依赖复杂的时序控制,其核心在于理解各个关键信号的作用以及它们之间的关系。以下是关于DDR3读写信号时序的关键点: #### 1. **DDR3读写时序的核心信号** DDR3接口涉及多个重要信号,这些信号共同定义了读写操作的行为[^1]: - `CK`: 时钟信号,用于同步所有其他信号的操作。 - `CS#`: 芯片选择信号,低电平有效,表示当前芯片被选中。 - `RAS#`, `CAS#`, `WE#`: 行地址选通信号、列地址选通信号和写使能信号,这三个信号组合决定了具体的操作类型(如激活行、预充电或数据传输)。 - `ADDR`: 地址总线,指定要访问的具体存储单元位置。 - `DQ`: 数据输入/输出引脚,负责实际的数据交换。 #### 2. **DDR3读取时序分析** 在DDR3的读取过程中,主要关注以下几个阶段: - **行激活**: 使用`ACTIVATE`命令打开所需的行,此过程由`RAS#`触发。 - **列寻址**: 发送`READ`命令并提供具体的列地址,通过`CAS#`完成。 - **延迟等待 (`tRCD`)**: 在发送`READ`命令之前,需要等待一定的时间以确保行已完全激活。 - **数据返回时间 (`CL`)**: CAS Latency (CL) 定义了从发出`READ`命令到第一个数据位到达所需的时间步数。 #### 3. **DDR3写入时序分析** 对于写入操作,流程类似于读取,但有一些不同之处: - 同样先执行行激活(`ACTIVATE`) 和 列寻址(`WRITE`) 命令。 - 需要注意的是,在写入前也需要满足一定的延迟条件,比如`tWR`(Write Recovery Time),即写恢复时间。 - 写入期间,目标数据会通过`DQ`引脚传送到DRAM内部缓冲区,并最终保存至相应的存储单元。 #### 4. **连续读写的注意事项** 当涉及到连续读写时,需特别注意避免重复发送相同地址指令的情况。例如,在Xilinx MIG IP核的应用场景下,如果持续保持`ddr3_app_en=1`而未改变`ddr3_app_addr`值,则可能导致一系列针对同一地址的冗余请求,从而引发性能下降或其他异常行为[^2]。 #### 示例代码片段展示如何配置基本参数来实现简单的DDR3读写功能 ```verilog always @(posedge clk or negedge reset_n) begin : ddr_ctrl_logic if (!reset_n) begin app_cmd <= CMD_IDLE; app_addr <= &#39;b0; app_en <= 1&#39;b0; end else case(app_state) IDLE_STATE: begin // 设置初始状态为闲置 app_cmd <= CMD_READ; // 或者CMD_WRITE取决于需求 app_addr <= target_address; app_en <= 1&#39;b1; next_state <= WAIT_FOR_DATA; end WAIT_FOR_DATA: begin app_en <= 1&#39;b0; // 取消使能直到下一个周期再启动新事务 if(data_ready_signal) next_state <= PROCESS_DATA; end default: ; endcase end ``` 以上代码仅为示意性质,展示了设置基础读写命令的大致逻辑结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值