目录

前言

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、仿真测试

5.1仿真模型

5.2仿真项目

5.2testbench


前言

工作中使用过SDRAM芯片,型号:IS42/45R86400D/16320D/32160D

对SDRAM使用中需要注意的一些事项进行整理。

在SDRAM设计中,需要注意三点:(1)若状态机使用clk时钟,则采用多少相位的时钟给SDRAM芯片管脚/采用多少相位的时钟采样SDRAM芯片返回的回读数据?(2)关于刷新的处理方式。(3)状态转移的设计,如何响应读写和刷新请求,冲裁机制是怎样的?

若仔细思考过上面三个问题,剩下的就按SDRAM芯片手册时序图写代码即可实现该控制器。

再进一步提高,就是思考如何对代码、对时序优化、提高速度的问题。

1、关于刷新

关于SDR SDRAM的刷新机制,有一点值得说明一下:64ms刷新8K次;或类似的刷新要求吧

这一点,是指64ms内,需要进行8K次自刷新,但是它并没有要求这8K次平均分布在64ms的时间区域内

也就是说,你可以在64ms里的第一个ms内,直接做完8K次刷新;在省下的63ms内,你可以不进行刷新操作。

读者会疑问,这样的刷新操作 与 8K次刷新均匀分布在64ms区间的差别在哪????

若你第1ms就执行完8K次刷新,则你省下的63ms就可以上SDRAM去做读写操作!

换个意思就是说,在不需要进行SDRAM读写访问的时候,就让它多做一些刷新;这样就能为读写操作提供大量完整的时间,而不被刷新操作打断!

2、关于数据中心对齐

需要注意信号的跨时钟域处理,信号从一个时钟域出来,如何在另一个时钟域进行准确的采样接收。

若sys_clk用于状态机发送命令cmd[3:0]、地址address[12:0],可以采用sys_clk_180相移180度的时钟来驱动SDRAM芯片的时钟管脚。

在数据写入SDRAM时,SDRAM芯片用sys_clk_180时钟来对cmd、address、DQ进行数据采样;

在读访问SDRAM数据时,状态机在sys_clk时钟驱动下发送读命令cmd[3:0]、读地址address[12:0],然后使用sys_clk_180时钟采样SDRAM返回的读数据。

上述红色字体格外需要注意,因为若采用sys_clk时钟采样SDRAM返回的读数据的话,可能就采样不到数据,modelsim仿真也会显示无法采样三态门IO端口回读到的数据。比如,下图仿真遇到的问题。

I端口向IO端口写数据:在EN_SEL_N_DLY=0时,三态门将I端口数据送到IO端口。

EN_SEL_N_DLY=1时,O端口从IO端口回读数据:但O端口的数值在仿真中显示无法赋值给寄存器r_APP_RD_DATA??

实际调试中,可能会遇到的问题:

举个栗子,提个问题:如果SDRAM在上电初始化的时候,没有进行load MODE register,请问其CAS潜伏期会是多少?

举个栗子,提个问题:如何保证送到SDRAM芯片管脚的CMD、addr、DQ与采样时钟是中心对齐的?如何采样SDRAM送出的DQ数据,保证采样的准确性?如何提高SDRAM控制器的工作频率?

3、SDRAM芯片手册介绍

SDR SDRAM芯片型号:IS42/45R86400D/16320D/32160D

3.1SDRAM芯片的管脚

3.2 SDRAM指令集

3.3 模式寄存器

通过配置模式寄存器,可以配置SDRAM芯片工作的状态。

通过配置模式寄存器,来配置SDRAM的:突发长度(burst length,BL)、突发类型、潜伏期(CAS Latency, CL)、操作模式、写突发模式。

3.4 关于SDRAM上电初始化和装载模式寄存器

按照芯片手册里的时序图配置即可,如下图所示。

需要注意的是,在SDRAM上电开始时刻,需要等待至少100us的时间,之后才开始给SDRAM配置下面的控制时序。

等待100us的时间,是为了等待PLL输出的时钟稳定;待PLL时钟稳定后,才开始初始化SDRAM、以及配置模式寄存器。

下图是手绘的上电和加载模式寄存器时序图。

初始化流程如下:

  1. 在复位结束、有时钟clk信号开始后,计时T1、即经历100us后,发送nop命令码;
  2. 所有bank预充电。在T1的下一个clk上升沿来临时、即在T2时刻,发送Precharge命令码,Sdr_a[10]=1拉高。。
  3. 第一次自动预充电。在T2之后,计时TRP的时间长度。在T3=T2+TRP到来时,发送REF命令码,执行第一次自动预充电。TRP最小是15ns,如果是100M时钟的话,TRP取两个clk周期即可。
  4. 第二次自动预充电。在T3之后,计时TRC,也即TRFC的时间长度。在T4=T3+TRFC到来时,发送REF命令码,执行第二次自动预充电。TRFC取个最大的下限是66ns,如果是100M时钟的话,TRFC取7个clk周期即可。
  5. 模式寄存器装入命令。在T5=T4+TRFC到来时,发送LMR命令码,即load mode register指令码,同时发送Sdr_a[12:0]=13'b0_0010_0010_0000(突发长度为1,潜伏期为2)和Sdr_ba=0,即选择bank0。TRFC取个最大的下限是66ns,如果是100M时钟的话,TRFC取7个clk周期即可。
  6. 输出初始化完成标志。 在T5之后,计时TRMD的时间长度。在T6=T5+TRMD到来时,发送初始化完成标志init_done。TRMD取个最大的下限是14ns,如果是100M时钟的话,TRMD取2个clk周期即可。

3.5 SDRAM刷新时序

下图中第一个指令Precharge,其作用是关闭当前行/所有行,即是在当前行/所有行关闭的情况下,才能执行刷新AutoRefresh操作。

如果在当前行/所有行没有关闭的情况下,进行刷新操作,会导致SDRAM中存储的数据丢失、或数据错误。

若每次读写结束就执行Precharge操作,则在进行刷新AutoRefresh操作时,是不需要在开始的时候发Precharge指令。

下图是执行了两次连续刷新操作,只进行一次刷新也是可以的。

3.6 关于写访问

在BL突发模式设置为1的情况下,可以按下面的时序,实现连续的写访问(必须是在SDRAM的同一行(同一页)访问)。

读访问,在BL=1的情况下,也可以实现类似的灵活访问。

3.7 关于突发访问

突发(Burst)是指在同一行中相邻的存储单元连续进行数据传输的方式,不能在一次突发访问中、出现SDRAM跨行的情况。举例,如BL=8,若起始地址=1023,当发下写命令后,SDRAM实际是对地址空间1023/0/1/2/3/4/5/6进行burst 写访问,而不是对地址空间1023/1024/1025..../1030进行burst写访问。

连续传输的周期数就是突发长度(Burst Lengths,简称BL)。

SDRAM芯片支持突发长度为1/2/4/8/全页。需要注意,突发访问,不能跨行(又称为跨页)访问。

当BL=2,一次写突发访问控制时序示例如下:

4、FPGA工程设计

(1)设计SDDRAM_CTRL控制器的输入输出端口,并绘制模块框图。

(2)确定SDDRAM_CTRL控制器的潜伏期CL、突发长度BL、模式寄存器配置。

(3)分析设计SDDRAM_CTRL控制器的时钟域,并绘制数据流图,注意数据的跨时钟域处理

这点格外重要!比如,状态机的驱动时钟是clk,则SDRAM芯片管脚的驱动时钟相位是多少?用多少相位的时钟采样SDRAM信号范围的读数据?

(4)设计SDRAM_CTRL控制器的状态转移图。

(5)设计SDRAM_CTRL控制器的测试文件。

(6)按照设计好的文档进行Verilog代码编写。

(7)对SDRAM_CTRL控制器进行时序仿真。

(8)下板测试。

(9)多块板卡测试。

4.1状态机设计

SDRAM芯片手册里的状态转移

由上图可知,关键状态有:

  • INIT状态            :系统上电后、等待CLK稳定后(100us),在该状态配置模式寄存器等相关信息。该状态仅在系统上电且CLK稳定后执行一次。以后状态机复位也仅进入IDLE状态,不再进入INIT状态。
  • IDLE状态           :即空闲状态,在该状态对读请求/写请求/刷新请求进行仲裁判断。
  • ACT_ROW状态  :激活行,之后跳转下一状态(WR_RD)。
  • WR_RD状态       :在该状态,根据读写请求标志,发读写命令、读写地址、写数据等相关信息。
  • CLOS_ROW状态:在该状态,关闭行。之后,跳转对应状态。

上述几个状态的灵活应用,即可实现SDRAM的灵活访问。

5、仿真测试

5.1仿真模型

下面是仿真过程中遇到的仿真模型报告的问题,提升一个时间违规。

补充概念:

下文来自文献1:SDRAM 控制器的解析

1.Precharge与Refresh的区别?

两者都是对存储单元的电容进行充电、回写。但差异在于:

Precharge是对(一个或所有Bank)的所有工作行(active row)操作,并且是随机的,被操作工作行的地址在各Bank中不一相同。

Refresh是对所有行依次操作,且是有固定周期的,被操作行在各Bank中均相同。

2.AutoRefresh与SelfRefresh的区别?

AutoRefresh是user依照指定周期发给芯片的刷新命令

SelfRefresh是芯片内部逻辑发给自己的刷新命令

无论何种Refresh均不需要提供地址,它是芯片内部的自动操作。

3.R/W带与不带Auto Precharge的区别?

带AutoPrecharge时:在R时,芯片自动在(最后一个有效输出数据)前(CL-1)个时钟时产生Precharge命令。在W时,芯片自动在(最后一个有效输出数据)后(Twr)时间产生Precharge命令。

不带AutoPrecharge时,需要user在上述时刻自己产生Precharge命令。

4.CL参数只有效于Read操作。

5. 每个Bank中只能有一个Row处于active状态,且可以进行R/W。

如果想操作同Bank中的另外一个Row,必须使用Precharge关闭当前工作Row,然后再active目的Row,这样才能R/W

6. 每个Bank均active一个Row,依次在各个Bank间操作Row,这样避免R/W时消耗的多余时钟周期,可以提高数据传输带宽

7.正常Read时的Precharge

Auto_Precharge和手动Precharge都在最后一个有效数据(LVD)前CL-1个时钟上升沿发出
8. 手动Precharge终结Read

手动Precharge在最后一个有效数据(LVD)前CL-1个时钟上升沿发出
9.手动Burst Terminate终结Read

Burst Terminate在最后一个有效数据(LVD)前CL-1个时钟上升沿发出
10.正常Write时的Precharge
    Auto_Precharge和手动Precharge都在最后一个有效数据(LVD)后tWR/tDPL时间的时钟上升沿发出
11. 手动Precharge终结Write

手动Precharge在最后一个有效数据(LVD)后tWR/tDP时间的时钟上升沿发出,或者在Precharge同时使能DQM屏蔽掉同时刻写入的数据。
12.手动Burst Terminate终结Write

Burst Terminate在最后一个有效数据(LVD)后1个时钟上升沿发出
13.Burst Terminate与手动Precharge在终结Read/Write中的区别?

带AutoPrecharge的R/W过程中,禁止使用BT和手动Precharge命令。

Burst Terminate适用于 全页R/W、不带AutoPrecharge的突发R/W

>>点击这里返回导航页<<

参考

作者 博文
1、 清霜一梦 SDRAM 控制器的解析
   
   

SDR SDRAM控制器设计相关推荐

  1. 【五一特刊】FPGA零基础学习:SDR SDRAM 驱动设计

    本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的"傻瓜式"讲解,让电子.信息.通信类专业学生.初入职场小白及打算进阶提升的职 ...

  2. SDRAM控制器设计

    SDRAM控制器设计 SDRAM 器件引脚示意图和功能框图如下: SDRAM 器件有如下的特性 通常情况下, SDRAM 存储器工作在 3.3V 的电压下(需要注意的是 DDR DRAM工作电压是 2 ...

  3. FPGA之SDRAM控制器设计(三)

    FPGA之SDRAM控制器设计(三):写 由于已经涉及了上电刷新,写三个大的状态转移,先把状态转移图给出.主控状态转移图是基于手册上描述来的.在代码注释中会给出每个状态的意义解释. 写时序图 写状态转 ...

  4. 基于FPGA的SDRAM控制器设计(二)

    基于FPGA的SDRAM控制器设计(二) 1. SDRAM理论基础 2. SDRAM初始化模块以及仿真 3.TOP模块的仲裁机制 4. SDRAM刷新模块代码以及仿真 5.代码 6.参考资料 1. S ...

  5. 基于FPGA的SDRAM控制器设计(1)

    基于FPGA的SDRAM初始化配置 SDRAM简述 SDRAM的引脚及作用 SDRAM初始化时序控制 SDRAM上电时序代码 SDRAM测试模块的代码 仿真测试结果 参考文献 总结 SDRAM简述 S ...

  6. 基于FPGA的SDRAM控制器设计(一)----------SDRAM初始化

    本文设计思路与讲解于参考邓堪文老师的视频,感谢-(不太适合一点基础都没有的小白) SDRAM简介 SDRAM(synchronous Dynamic Random ),同步动态随机存储器,同步指内存工 ...

  7. 基于FPGA的SDRAM控制器设计(2)

    基于FPGA的SDRAM的自刷新操作 SDRAM自刷新简述 SDRAM自刷新时序图 SDRAM自刷新代码 仿真模块的代码 仿真结果测试 参考文献 总结 SDRAM自刷新简述 SDRAM作为一个RAM并 ...

  8. 学习FPGA有必要写SDRAM控制器吗?

    在学习FPGA的过程中,注意是在学习过程中,联系FPGA的使用技巧,强烈建议尝试设计一个SDRAM控制器,不要使用IP核. 学习SDRAM控制器设计,能让你掌握很多知识. 更好的使用状态机去精准控制时 ...

  9. FPGA SDRAM接口设计(三)设计实现

    目录 一.设计要求 二.设计思路 三.设计实现 四.仿真测试 五.总结 一.设计要求 本设计是在做ov7670摄像头采集数据流时,以SDRAM作为缓存使用,因此这里才使用SDRAM对其进行介绍和设计. ...

  10. 内存信号测试软件,基于AVIA9700的SDRAM控制器实现内存时序测试软件工具的设计...

    图2 AVIA9700访问SDRAM时序示意图 要正确访问SDRAM,建立时间和保持时间很关键.建立时间在触发器采样之前,在这段时间,数据必须保持有效的时间,否则会产生setup violation; ...

最新文章

  1. 【深度学习】深入理解Batch Normalization批标准化
  2. Deep Learning for Chatbots, Part 2 – Implementing a Retrieval-Based Model in Tensorflow
  3. 序列化的作用_Java 序列化的高级认识
  4. 腾讯从百度挖来的AI Lab负责人张潼离职,要去阿里?...
  5. Underscore.js 的模板功能
  6. 远程工具:MobaXterm使用图文教程
  7. linux查看队列 msg,linux第10天 msg消息队列
  8. 腾讯视频app下载2019_腾讯视频主设备如何设置
  9. Dataguard学习笔记
  10. 30 个惊艳的Python开源项目
  11. 第2小节,深入剖析gym环境构建
  12. java 补丁差异_差异和补丁简介
  13. 市场调研策划书_市场调查计划书模板
  14. 测试过程中用shell的地方_软件测试之学习shell流程控制结构
  15. Php依赖其他模块,3. 强制模块依赖
  16. ubuntu安装transmission下载BT
  17. spring动态代理的实现方式
  18. 如何快速学习一门技术?十步学习法
  19. 小学计算机的一些课题,小学计算机课题研究价值主要体现在什么方面
  20. 水果店从哪里进货便宜,水果店都有哪些进货渠道

热门文章

  1. 小工具-悬浮窗LogViewer在android手机上查看数据日志
  2. mysql 索引间隙锁_mysql innodb间隙锁示例
  3. fbx文件批量格式转换(glb/gltf)与压缩
  4. python编程考试题目大全
  5. 小京东V5.X短信宝插件开发
  6. IntelliJ IDEA 添加对 Extjs6 支持
  7. 老师我做完母带后混音更脏了。混音界四大邪术 | MZD Studios混音10问第2期
  8. 扎堆出海的抖音、今日头条、UC 头条们后来怎么样了?
  9. 循环输出100以内的素数
  10. 微信表情商店视频动态暂停使用 6日恢复