SDRAM控制器操作时序

article/2025/10/26 11:58:45

此为学习http://dengkanwen.com/137.html整理的笔记,侵删!

SDRAM工作原理

内部的状态跳转图

img

我们所需关注的几个地方:

1)粗黑线表示在该状态下会自动跳转到另一个状态,细黑线表示需要给命令才会跳转。

2)我们重点关注的几个地方:

IDLE 状态到WRITE 状态:
​ 1) 在IDLE 状态需要先给ACT 命令激活某一行,此时处于Row Active 状态;
​ 2) 在Row Active 状态之后,给Write 命令则会进入WRITE 状态;
​ 3) 在WRITE 状态后,再给一次Write 命令,就可以继续写入数据。
WRITE 状态到IDLE 状态:
​ 1) 在WRITE 状态给PRE 命令,则SDRAM 将跳出WRITE 状态进入Precharge状态;
​ 2) 在Precharge 状态后,就会自动进入IDLE 状态了。

​ 要从WRITE 状态跳到IDLE 状态的一个原因是,我们需要进行刷新操作,进
入刷新操作,必须从IDLE 状态进入。
​ 另外一点,可能有些朋友看到了WRITE 状态下边还有一个WRITEA 状态,的
确,但是细心的你有没有发现当处于WRITEA 状态时,它会自动的进入Precharge 状态。也就是说WRITEA 比在WRITE 状态的工作效率要低很多,所以在某些对数据交互速度较快的场景中,我们使用WRITE 状态。在本套教程中,我们也只讲WRITE 状态。速度快的都能搞定,那速度慢的操作也是不在话下的。

SDRAM 初始化模块

首先看一下官方数据手册给出的初始化时序图

这里写图片描述

初始化过程

1)首先需要有200us 的一个延时(对应图中左下方的T),

2)在延时满足之后,给一次Precharge 命令,同时需要指定A10及Bank地址;(如果A10为高(All Banks),就意味着是给所有的Bank进行预充电,此时不需要给Bank地址,如果A10为低(SINGLE BANK),就需要指定某一个bank的地址。一般为高)

3)然后再过“tRP”的时间,给“AutoRefresh”命令,然后再过“tRC”的时间,再给“Auto Refresh”命令,(不需要指定bank地址的(大家注意看右下角有说明,灰色部分的数据我们是不需要关心的)。

4)然后再经过“tRP”的时间进行模式寄存器设置。进行模式寄存器设置的时候,需要给的指令会稍微复杂一点,手册上显示A0~A11及BA0,BA1都用到了,下面我们来看下模式寄存器应该怎么进行设置,如图:

这里写图片描述

​ 这里解释一下突发读写:突发长度(A2~A0)设置为4,在我们进行写操作的时候,数据是每4个数据写一次的,就是说我们给一次写指令,就会向SDRAM写进去4个数据,而且四个地址是连续的(如果突发类型设置的是非连续,则地址不会连续,需要我们写一个数据给一次地址,比较耗内存)

初始化时序图中的几个问题

1)tRC、tRP、tMRD的时间是多少,几个时钟周期?

参照官方数据手册ML0006 0012-2中的AC ELECTRICAL CHARACTERISTICS部分给出

tRC:63ns

tRP:20ns

tMRD:2cycle

若fpga内部频率为50MHZ,正好是20ns。(4clk、1clk)

2)时序图中几个command命令的参数怎样设置

这里写图片描述

上述就是整个初始化过程,我们最后以kevin画的时序图作为一个总结

这里写图片描述

具体代码为sdram_init;

SDRAM 刷新模块

我们还是先看一下官方数据手册给出的刷新时序图

img

刷新操作的时序图分析与前面类似。

刷新时序图中的几个问题

1)两次刷新时间间隔有多久呢?

​ SDRAM内部电容保存数据的最长时间是64ms,而我们一个BANK有4096行,64ms/4096~=15us,也就是说为了保证SDRAM内部的数据不被丢失,两次刷新之间的最大时间间隔为15us,所以为了能让SDRAM有更多的时间进行读或者写,我们就设定SDRAM刷新的周期为15us.(若按系统时钟50MHZ,就是计750个数)

​ SDRAM每进行一次刷新,是对每一行进行操作的,并不是单独针对每一个电容进行充电,所以每进行一次刷新,该行中的电容进行充电我们可以理解为是同步发生的

2)在每次自动刷新时,我们需要给一个“Precharge”命令,这个命令有什么作用呢?

大家可以看下开头的那张状态图,如果此时SDRAM正处于“WRITE”或“READ”状态时,这个“Precharge”命令可以使SDRAM跳出“WRITE”或“READ”状态从而入“IDLE”状态。接下来,过“tRP”的时间,给一个“Auto-Refresh”命令可以进入刷新状态。

但此时的Precharge命令我们在写状态模块中给出。在刷新模块中不需要Precharge命令。

SDRAM仲裁模块

在介绍仲裁模块前我们先考虑一个问题:

​ 如果我正在让SDRAM写数据,是不是SDRAM刷新的时间到了,我就必须是让SDRAM马上执行刷新操作吗?这样的话肯定不是现实的,那必然会把还没写的剩下的数据丢失。不能让我们的数据丢失,又要保证SDRAM进行刷新来保证我们整个SDRAM相应BANK中的数据不被丢失,我们应该怎么来写代码呢?

我们可以考虑这样来做:如果刷新的时间到了,先让写操作把正在写的4个数据(突发长度为4)写完,然后再去进行刷新操作。而如果在执行读操作也遇到需要刷新的情况,我们也可以这样来做,先让数据读完,再去执行刷新操作。

为了解决各个模块之间不方便控制的情况,我们引入一个新的机制 ——“仲裁”机制。“仲裁”用来干什么呢?在这里边,“仲裁”相当于我们这个SDRAM控制器的老大,对SDRAM的各个操作统一协调:读、写及自动刷新都由“仲裁”来控制。

仲裁模块状态机示意图:

这里写图片描述

仲裁模块和其他各模块之间的连线:

这里写图片描述

注:一定要搞清楚说的是模块之间连线的关系还是状态机之间跳转的关系哦。

仲裁模块分析

1)初始化操作完成之后便进入到了“ARBIT”仲裁状态,只有处于仲裁状态的时候,“仲裁老大”才能进行下命令。

2)当状态机处于“WRITE”写状态时,如果SDRAM刷新的时间到了,刷新模块同时向写模块和仲裁模块发送刷新请求ref_req信号。

3)当写模块接受到ref_req之后,写模块在写完当前4个数据(突发长度为4)之后,写模块的写结束标志flag_wr_end拉高,然后状态机进入“ARBIT”仲裁状态。

4)处于仲裁状态之后,此时有刷新请求ref_req,然后状态机跳转到“AREF”状态并且仲裁模块发送ref_en刷新使能,刷新模块将刷新请求信号ref_req拉低并给sdram发送刷新的命令。

5)等刷新完毕之后,刷新模块给仲裁模块发送flag_ref_end刷新结束标志,状态机跳转到“ARBIT”仲裁状态。

注意了,当刷新完跳转到“ARBIT”仲裁状态之后,如果之前我们的全部数据仍然没有写完(Kevin指的是全部数据,并不是一个突发长度的4个数据哦),那么此时我们仍然要给仲裁模块写请求“wr_req”,然后仲裁模块经过一系列判断之后,如果符合写操作的时机,那就给写模块一个写使能信号“wr_en”,然后跳转到“WRITE”写状态并且写模块开始工作。

SDRAM写模块

官方数据手册给出的写操作时序图

这里写图片描述

该时序图的分析可以参照前面初始化过程的分析。

现在我们考虑另一个问题:假设我们现在需要往SDRAM 中写入两行数据,那什么时候可以退出仲裁状态机的写状态:
1) 数据已经写完;若我们还想要再写,就需要外部的Wr_trig触发
2) SDRAM 需要进行刷新操作;外部有一个刷新请求信号,并且本次数据已经写完;转到外部仲裁模块去执行刷新操作,如果刷新完毕需要继续写,写模块请求,仲裁模块使能。
3) 数据未写完,需要激活下一行继续写。本行写完标志,重新输入act命令去写下一行

我们将这三个状态化成一个状态机。如图所示:

这里写图片描述

注意上图中的IDLE状态和前面的初始化中的IDLE状态不要搞混。这个IDLE就是写模块中状态机的初始化部分。

S_WR:if(wr_data_end == 1'b1)                       state   <=      S_PRE;                 else if(ref_req == 1'b1 && burst_cnt_t == 'd2 && flag_wr == 1'b1)       state   <=      S_PRE;                 else if(sd_row_end == 1'b1 && flag_wr == 1'b1)state   <=      S_PRE;
S_PRE:if(ref_req == 1'b1 && flag_wr == 1'b1)         state   <=      S_REQ;else if(flag_pre_end == 1'b1 && flag_wr == 1'b1) state   <=      S_ACT;else if(flag_wr == 1'b0)                       state   <=      S_IDLE;  

我们由以上所述画出写模块时序图:

这里写图片描述

这里写图片描述

分析写模块中五个状态机:

1)IDLE:外部Wr_trig触发写信号,进入S_REQ状态。写模块将Flag_wr拉高直到数据完全写完结束。

2)S_REQ:Flag_wr信号拉高,S_REQ状态向外部仲裁发出请求写信号wr_req,外部仲裁模块判断可以进行写操作了并向写模块发出wr_en 使能信号,告诉写模块可以开始写了。进入S_ACT状态。

3)S_ACT:写模块在S_ACT状态,发出ACT命令(command),并且指定bank的行地址。ACT命令结束发出Flag_act_end结束标志。进入S_WR状态。

4)S_WR:发出写命令开始写数据,此时需要指定列地址

一行数据写完发出Sd_row_end标志信号。刷新请求出现时,该组数据写完发出Flag_wr_end标志信号。所有数据写完返回Wr_data_end信号标志。

5)S_PRE:预充电命令 ,进入预充电状态,充电完毕返回Flag_pre_end标志信号。

SDRAM读模块

SDRAM读模块与写模块一样在此不再详述。

读模块时序图:

这里写图片描述

有一个问题需要注意:

我们再给出读命令后,数据延时了两个周期给出,这个时间段叫潜伏期CAS。

写代码技巧:

1)先写主状态机

2)把时序图中用到的时序信号标志定义出来;

reg                             flag_wr       ;
reg     [ 4:0]                  state         ;
//-----------------------------------------------
reg                             flag_act_end  ;
reg                             flag_pre_end  ;
reg                             sd_row_end    ;
reg     [ 1:0]                  burst_cnt     ; 
reg     [ 1:0]                  burst_cnt_t   ; 
reg                             wr_data_end   ;
//-----------------------------------------------
reg     [ 3:0]                  act_cnt       ;
reg     [ 3:0]                  break_cnt     ;
reg     [ 6:0]                  col_cnt       ;
//-----------------------------------------------
reg     [11:0]                  row_addr      ;
wire    [ 8:0]                  col_addr      ;

3)然后按照这个表写出每个标志信号产生的代码


http://chatgpt.dhexx.cn/article/8T6KI8hP.shtml

相关文章

SDR SDRAM控制器设计

目录 前言 1、关于刷新 2、关于数据中心对齐 3、SDRAM芯片手册介绍 3.1SDRAM芯片的管脚 3.2 SDRAM指令集 3.3 模式寄存器 3.4 关于SDRAM上电初始化和装载模式寄存器 3.5 SDRAM刷新时序 3.6 关于写访问 3.7 关于突发访问 4、FPGA工程设计 4.1状态机设计 5、仿真测试…

【GD32】从零开始学GD32单片机高级篇——外部存储器控制器EXMC详解+SDRAM读写例程

目录 简介外部设备地址映射NOR和PSRAM的地址映射NAND/PC Card地址映射SDRAM地址映射 NOR/PSRAM控制器接口描述控制时序模式1模式2 NAND Flash或PC Card控制器接口描述控制时序 SDRAM控制器接口描述控制时序突发读操作突发写操作读写FIFO跨边界读写操作低功耗模式自刷新模式掉电…

初识内存控制器和SDRAM【一文了解】

原文链接&#xff1a;https://blog.csdn.net/qq_36243942/article/details/85596249 目录 1.引入内存控制器 2.不同位宽内存设备之间的连接 3.如何确定芯片的访问地址 4.分析读写NOR FLASH的读写时序 5.SDRAM初识 6.编程读/写 SDRAM 附录&#xff1a;源代码 1.引入内存控制器 我…

存储控制器(SDRAM操作)

什么是存储控制器 2440是32位单片机&#xff0c;进行数据访问时通过32位地址访问。 CPU发出32位地址信号给存储控制器&#xff0c;存储控制器根据地址信号设置片选信号及地址总线&#xff0c;将相应数据通过数据总线传回存储控制器&#xff0c;存储控制器将收到的数据以字节为…

数字IC实践项目(2)——高速SDRAM控制器的设计与综合(入门级工程项目)

数字IC实践项目&#xff08;2&#xff09;—高速SDRAM控制器的设计与综合&#xff08;入门级工程项目&#xff09; 写在前面的话项目简介和学习目的SDRAM简介SDRAM控制器简介完整项目框图SDRAM控制器项目框图SDRAM初始化模块SDRAM自动刷新模块SDRAM写模块SDRAM读模块SDRAM仲裁机…

SDRAM控制器——仲裁模块的实现

前面一文中&#xff0c;我们已经对SDRAM的上电初始化、自动刷新以及突发读写进行了学习。 本文跟着大佬学习SDRAM中的仲裁模块。 仲裁机制 仲裁&#xff08;arbit&#xff09;&#xff1a;在FPGA中&#xff0c;当多个source源同时发出请求&#xff0c;容易导致操作冲突&#x…

SDRAM读写控制器

第1节 –作者&#xff1a;小黑同学 本文为明德扬原创及录用文章&#xff0c;转载请注明出处&#xff01; 1.1 总体设计 1.1.1 概述 同步动态随机存取内存&#xff08;synchronous dynamic randon-access menory&#xff0c;简称SDRAM&#xff09;是有一个同步接口的动态随…

FPGA综合项目——SDRAM控制器

FPGA综合项目——SDRAM控制器 目录 1.整体框架2.串口接收模块3.接收模块测试仿真4.串口发送模块5.发送模块测试仿真6.SDRAM基础学习7.SDRAM顶层模块8.SDRAM初始化模块设计与仿真测试9.自动刷新模块设计与测试10.写模块设计与测试11.读模块设计与仿真测试12.通信处理模块13.顶层…

细说SDRAM控制器

SDRAM的基本概念 SDRAM凭借其极高的性价比&#xff0c;广泛应用于高速数据存储、实时图像处理等设计当中&#xff0c;但是相对于SRAM、FIFO等其他存储器件&#xff0c;SDRAM的控制相对复杂。虽说是复杂&#xff0c;但也不代表没办法实现&#xff0c;仔细梳理一下&#xff0c;发…

SDRAM控制器

1.SDRAM简介 简介&#xff1a;SDRAM为同步动态随机存储内存&#xff0c;同步指的是时钟与外部输入的时钟保持一致&#xff0c;也就是与外部共用一个时钟&#xff1b;动态指的是每个时间段内&#xff0c;都要进行一次刷新操作&#xff0c;否则里面的数据会丢失&#xff0c;这也…

FPGA学习历程(四):SDRAM 控制器(初始化与刷新)

目录 一、数据手册相关信息1.1 命令真值表1.2 时间参数1.3 模式寄存器配置 二、初始化模块2.1 模块时序图2.2 模块源码2.2.1 sdram_init.v2.2.2 sdram_top.v2.2.3 tb_sdram_top.v 2.3 Modelsim仿真 三、刷新模块3.1 模块时序图3.2 模块源码3.2.1 sdram_aref.v3.2.2 sdram_top.v…

手把手带你实现SDRAM控制器(带Verilog代码)

上篇博客&#xff0c;我们了解了SDRAM的控制命令以及寻址方式&#xff0c;SDRAM芯片需要配合专门的控制电路使用才能发挥功能&#xff0c;这一节我们将一步步分析&#xff0c;使用Verilog搭建一个SDRAM驱动控制器。 目录 学习目标 问题分析 初始化模块 信息收集 模块接口确…

SDRAM 控制器(一)

1、基础知识 SDRAM&#xff08;synchronous Dynamic Random &#xff09;&#xff0c;同步动态随机存储器&#xff0c;同步指内存工作需要同步时钟&#xff0c;内存的命令的发送和数据的接收都以它为标准。动态是指需要不断地刷新来保证数据不丢失&#xff08;电容存储&#xf…

操作系统面试题(二十一):什么是DMA

DMA DMA&#xff08;Direct Memory Access 直接内存访问&#xff09; DMA意味着CPU授予I/O模块权限不涉及在不涉及CPU的情况下依然可以读取/写入内存&#xff0c;即DMA不需要CPUde支持 DMAC&#xff08;DMA 控制器&#xff09; 控制直接内存访问的过程 DMA的优点&#xff1a…

操作系统面试题:虚拟内存是什么,解决了什么问题,如何映射?

虚拟内存是什么&#xff1f; 虚拟内存别称虚拟存储器&#xff08;Virtual Memory&#xff09;。电脑中所运行的程序均需经由内存执行&#xff0c;若执行的程序占用内存很大或很多&#xff0c;则会导致内存消耗殆尽。为解决该问题&#xff0c;Windows中运用了虚拟内存技术&…

Linux面试题(34道)

1、Linux中各个目录的作用 1&#xff09;/ 根目录 2&#xff09;/boot 引导程序&#xff0c;内核等存放的目录 3&#xff09;/sbin 超级用户可以使用的命令的存放目录 4&#xff09;/bin 普通用户可以使用的命令的存放目录 5&#xff09;/lib 根目录下的所程序的共享库目录 6&…

【游戏客户端面试题干货】-- 2021年度最新游戏客户端面试干货(操作系统篇)

【游戏客户端面试题干货】-- 2021年度最新游戏客户端面试干货(操作系统篇&#xff09; 大家好&#xff0c;我是Lampard~~ 经过一番艰苦奋战之后&#xff0c;我终于是进入了心仪的公司。 今天给大家分享一下我在之前精心准备的一套面试知识。 今天和大家分享的是操作系统相关的面…

操作系统和网络(一):计算机网络常见面试题

计算机网络常见面试题总结 1. OSI &#xff0c; TCP/IP &#xff0c;五层协议的体系结构 OSI分层&#xff08;7层&#xff09; &#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP分层&#xff08;4层&#xff09; &#xff1a;网络接…

【Java实习生】每日面试题打卡——操作系统篇

临近秋招&#xff0c;备战暑期实习&#xff0c;祝大家每天进步亿点点&#xff01;Day15本篇总结的是 操作系统 相关的面试题&#xff0c;后续会每日更新~ 1、请分别简单说一说进程和线程以及它们的区别? 根本区别&#xff1a;进程是操作系统资源分配的基本单位&#xff0c;而…

操作系统面试题(一)

请你说一下进程与线程的概念&#xff0c;以及为什么要有进程线程&#xff0c;其中有什么区别&#xff0c;他们各自又是怎么同步的 参考回答&#xff1a; 基本概念&#xff1a; 进程是对运行时程序的封装&#xff0c;是系统进行资源调度和分配的的基本单位&#xff0c;实现了…