FPGA实现DDR高速读写(2)

4 篇文章 4 订阅

FPGA实现DDR高速读写(2)

在完成IP核申请后需要对IP进行仿真,看看DDR的读写工作的基本原理。在进行代码仿真前需要对DDR SDRAM的基础架构和工作机制进行了解,然后对DDR进行仿真。

一、DDR功能框图
在这里插入图片描述上图就是SDRAM芯片的其中一个型号的功能框图。上面的功能框图里可以知道主要由输入输出IO口控制、模式寄存器、存储阵列、写入/读出控制、写入缓冲FIFO这几部分组成。
对于DDR我们首先需要知道他的存储阵列的大小。SDRAM的地址线是分时复用的,也就是说他的行地址和列地址线是复用的,SDRAM的容量计算方式为:
SDRAM容量= 数据位宽x 存储单元数量(行地址x 列地址x Bank数)
从上面这个图我们可以知道这个芯片有行地址13位,列地址10位,总共有8个bank,数据位宽为16位。因此芯片是64M×16的,也就是有64M的存储深度数据位宽为16位。
输出IO控制,这个部分是对SDRAM的IO口的终端电阻进行配置,对IO口进行上拉或者下拉进行配置。
写入/读出控制是对从存储阵列内的数据读出进行控制。主要是把数据从64位转换乘16位。
写入缓冲FIFO是对输入的数据进行缓存,也有起到跨时钟有处理的一个作用。
模式寄存器这个是对SDRAM功能和模式进行控制,我们进行初始化、读写以及刷新等操作都是通过对模式寄存器配置来实现的。
目前SDRAM的硬件设计已经很成熟了,基本上按照官方推荐的方式进行设计就很少出现问题,这里就不多描述。在进行数据读写时SDRAM主要进行上电初始化、刷新操作、读操作、写操作这几个状态。SDRAM状态转换如图所示(各个厂家控制方式和状态转移基本一致):
在这里插入图片描述首先是上电初始化过程:SDRAM上电后必须要以预定义的方式进行操作,不符合规定时序的操作会导致SDRAM初始化不成功。上电过程相对于读写操作是独立的,因此芯片首先要保证初始化正确,初始化时序如下图:
在这里插入图片描述这个时序需要注意的一点是在Vref电平拉高后需要至少保持200us的空闲。然后进行一次PRE操作和两次REF操作,然后等待至少200个CLK即完成上电初始化。初始化过程再IP核内已经完成,我们了解这个过程对硬件的调试核后续读写控制代码的编写有很大的帮助。
刷新操作:SDRAM需要定时的进行刷新,实质就是对存储阵列电容进行充电,来保证存入的数据的准确,如果超出规定时间未进行刷新,会导致电容放电存储的信息消失。刷新时间间隔与芯片的制造有关,数据手册中有着明确的刷新时间要求,如每行刷新时间最大间隔是64ms,每个bank有8192行,则每一行刷新时间是7.8125us(64ms, 8192-cycle refresh)。
在整个状态转换控制过程中刷新状态的优先级是较高的,优先于读写操作,若在读写过程中需要刷新,则应结束当前的读写操作,进行刷新,刷新完成后再继续进行读写操作。刷新操作时序如下图:
在这里插入图片描述
在进行读合写操作前需要进行ACTIVATE操作。这个操作是激活读或者写对应bank的行。这个操作比较简单,就是几个时序的操作。
在这里插入图片描述
读操作的实现:

IDLE状态到WRITE状态:

  1. 在IDLE状态需要先给ACT命令激活某一行,此时处于Active状态;

  2. 在Active状态之后,会自动进入Bank active状态;

  3. 在Bank active状态后,给一次Read命令,就可以进入读状态了,这时就可以实现数据的读出。

4)再次给出Read命令,就可以实现数据的连续读出。
在这里插入图片描述
上图是数据的突发连续读出模式,数据是4突发传输,其中RL是从读命令写入的数据读出的延时周期数,这个是在模式寄存器中进行设置。在两个读命令之间的时间间隔Tccd,这个时间间隔需要满足。实质上读操作实现并不复杂,只需要按照时序要求即可。
写操作和读操作状态的转移是类似的,连续写入时序如下图:
在这里插入图片描述在上面的时序图中各个状态的命令command是由状态寄存器来进行配置的,状态寄存器的配置是进行读写的关键步骤,状态寄存器如下图:
在这里插入图片描述
通过上面的描述,可以对SDRAM的工作有一个大致的了解,这对SDRAM的控制有着很大的帮助。

二、SDRAM的仿真

上个文章完成了IP的申请和例化,根据前面说的SDRAM基本的知识,对DDR进行仿真。Xilinx官方提供的仿真代码需要去仔细的看,这样才能更加充分的理解SDRAM的底层控制逻辑。代码工程架构如下图:
在这里插入图片描述
仿真代码如图
在这里插入图片描述
运行simulate,得到仿真波形如下图:
在这里插入图片描述
通过上面完成了SDRAM模块IP核的仿真。

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DDR3的突发读取时序是这样的:首先,输入的命令和数据都有自己的FIFO用于存储,并且它们之间是同步的。数据可以比读写命令早或晚写入,因为它们在不同FIFO的同一层,同步时钟保证读写命令可以对应它们需要操作的数据。例如,数据FIFO中只有一个3,对应着命令FIFO中的读命令。即使写命令已经存进去了,但是数据FIFO与这些命令对应的操作数还没有写进去,但是即便是命令先写进去,数据后写进去也会写在响应命令对应的位置。\[2\] 此外,DDR3的实际读写的Burst是8。举例来说,如果DDR3的数据宽度为16位,Burst为8,那么每次对DDR3进行读写操作,必须是连续的8*16位数据。如果用户接口端的逻辑时钟为DDR3时钟的4分频,且数据位宽为128位,那么单个时钟周期就应该对应Burst=8的一次读写操作。如果数据位宽为64位,那么必须执行2次数据操作才能完成一次Burst=8的读写。对于前者,app_wdf_end始终为1即可,对于后者,app_wdf_end每2个写时钟周期内前一次拉低,后一次拉高。\[3\] #### 引用[.reference_title] - *1* [Xilinx FPGA平台DDR3设计保姆式教程(3)MIG IP核使用教程及DDR读写时序](https://blog.csdn.net/m0_52840978/article/details/121237044)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [FPGA DDR读写时序分析](https://blog.csdn.net/neufeifatonju/article/details/108198400)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值