之前写了两篇关于Modelsim仿真的blog,其中模块管脚的命名可能让人觉得有些奇怪,其实不然,之前的两篇内容都是为了仿真SDRAM操作做铺垫的。

由于SDRAM的仿真过程相对比较复杂,也比较繁琐。故可能需要不止一篇blog来完成。

在开始仿真之前,如果对SDRAM原理以及时序不是很了解的朋友,推荐看一下如下这篇文章:

SDRAM-高手进阶,终极内存技术指南——完整进阶版

OK,下面正式开始仿真的过程。

通过看内存技术指南,我们大概可以总结出SDRAM的工作过程:

  1. 上电后进入200us的输入稳定期,空操作(NOP)
  2. 向SDRAM发送1次(1个时钟周期)预充电(precharge)命令,然后保持N个时钟周期NOP操作(N值可查芯片具体SDRAM芯片手册,与SDRAM工作的时钟频率有关)
  3. 向SDRAM发送8次刷新(refresh)命令,具体发送过程后面会介绍
  4. 设置SDRAM工作模式寄存器
  5. 初始化完毕,可以开始读写操作
PS:除了上述操作外,还有一个周期性的操作就是自刷新。拿我使用的芯片来说,需要每15us进行一次自刷新操作。(15us*4096=61.44ms < 64ms,为什么这么设置,请参考终极内存技术指南)
 
--------------------------------------------------------------------------------------------------------------------------------------------------------
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
---------------------------------------------------------------------------------------------------------------------------------------------------------
下面贴几张初始化相关的图片:
 
模式寄存器设置!!!
 
我的模式寄存器设置值为: 0x023,对应到上图可以看出,我的选择为:
  • 操作模式:突发读/突发写
  • 潜伏期:两个时钟周期
  • 突发传输方式:顺序
  • 突发长度:8 (SDRAM芯片:4Block,1M*16bit,共64Mbit)故突发长度8代表每次读或写命令传输的数据量为8*位宽=8*16bit=128bit=16字节 (暂不考虑数据掩码DQM)
--------------------------------------------------------------------------------------------------------------------------------------------------------
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
---------------------------------------------------------------------------------------------------------------------------------------------------------
下面开始介绍仿真的过程,其中涉及到PLL模块以及FIFO模块。关于这两个模块的仿真可以参考之前的两篇Blog
整套系统源码来自特权同学的博客,里面可以下载到源码。
首先,为了便于观察仿真波形,先列出SDRAM的命令
SDRAM命令
  CKE CS_n RAS_n CAS_n WE_n
空操作(NOP) 1 0 1 1 1
预充电(PRE) 1 0 0 1 0
刷新 1 0 0 0 1
行有效 1 0 0 1 1
开始读 1 0 1 0 1
开始写 1 0 1 0 0
模式寄存器设置 1 0 0 0 0

(PS: _n结尾的信号代表低电平有效)

 
波形1:PLL完成初始化
红色的波形为和命令有关的信号。我把它们放到一组为了便于观察,可以看到,在400ns处,时钟有效信号CKE变高,片选信号CS_n变低,SDRAM开始动作,参考命令表,SDRAM启动后的命令为:10111,即NOP操作,这一过程要持续近200us,称之为输入稳定期

 
波形2:预充电,对应命令10010以及
8次刷新操作,对应命令10001,注意每个命令之后都有执行一段时间的NOP操作,这使得SDRAM有时间执行命令。
 
 
波形3:模式寄存器设置,可以看到,命令为10000,此时SDRAM_BA[1:0]以及地址线SDRAM_ADDR[11:0]的值分别为0以及0x033(我真实器件使用的是0x023,仿真的时候选择错了,不过不影响看波形),从这幅图中应该可以很清楚的看到,SDRAM时钟频率为100Mhz,同时与FPGA的SDRAM控制器的100MHZ时钟存在相位差,这是必要的。
因为,在SDRAM控制器的时钟上升沿,产生命令,然后在随后的SDRAM时钟上升沿,命令已经稳定了,这样就方便了SDRAM顺利的取得命令。数据传输也是同样的道理。仿真中我选择的相位差为72度
 
波形4:写SDRAM数据,结合上一篇文章中的FIFO操作,这个波形应该很容易理解了,最后两行:
sys_data_in是FIFO传递给SDRAM控制模块的数据,
sdram_data是SDRAM的数据总线,两者之间有1个时钟周期的延时。
从图中可以看出,首先SDRAM控制器发出了行有效命令(10011),选中了第0个逻辑块的第0行,然后在两个时钟周期后,发出了写命令(10100),列地址为0,同时不加延迟的把第一个数据0x0000放在了sdram的数据总线上,该命令执行一次,可以看到写入了8个16bit数据,这也就对应了前面所说的突发长度。
此外,细心的朋友可以看到,在写命令时,地址线的值为 0x400,其中的4对应 A10,给它设置1,表示允许自动预充电。
那么什么是自动预充电呢?
SDRAM在每次读取操作后,逻辑为1的数据被读取后会放电,很有可能会导致其逻辑值变为0,故,需要再写入数据,保证读取后值不丢失。所以,自动预充电还是蛮必要的。
 
波形5:15us一次的自刷新。。对应命令10001。 从图中可以看出,一旦SDRAM开始运行,自刷新将遍布在SDRAM的整个生命周期中,15us一次,不多不少。这是维持SDRAM稳定工作的动力源泉。
 
ok,关于SDRAM的Modelsim仿真就到这里。为什么不介绍SDRAM的读取仿真呢..你说呢?:)
 
--------------------------------------------------------------------------------------------------------------------------------------------------------
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
---------------------------------------------------------------------------------------------------------------------------------------------------------
 
关于整套系统的仿真源码下载(也包括pll,fifo,data_generator模块的仿真):
使用时可以把需要的文件加入工程,同时修改system.do文件中的源文件路径,然后执行即可。
(所有.do文件放在modelsim文件夹下)
我使用的Modelsim版本为SE10.0C。
 
本工程所需仿真文件如下所示:
 
 
来源:http://blog.csdn.net/ruby97/article/details/7356110

用ModelSim仿真SDRAM操作的更多相关文章

  1. ModelSim仿真入门

    ModelSim仿真入门之一:软件介绍 编写这个教程之前,为了让不同水平阶段的人都能阅读,我尽量做到了零基础入门这个目标,所有的操作步骤都经过缜密的思考,做到了详细再详细的程度. 如果您是FPGA开发 ...

  2. cordic算法的verilog实现及modelsim仿真

    1. 算法介绍 CORDIC(Coordinate Rotation Digital Computer)算法即坐标旋转数字计算方法,是J.D.Volder1于1959年首次提出,主要用于三角函数.双曲 ...

  3. 【黑金原创教程】【Modelsim】【第一章】Modelsim仿真的扫盲文

    声明:本文为黑金动力社区(http://www.heijin.org)原创教程,如需转载请注明出处,谢谢! 黑金动力社区2013年原创教程连载计划: http://www.cnblogs.com/al ...

  4. 45.modelsim仿真include文件

    modelsim仿真include文件会出现找不到文件的情况,这是因为include文件路径有两种,一种是相对路径,另一种是绝对路径. 相对路径: 如果 ‘include "primitiv ...

  5. 14.quartus联合modelsim仿真

    在quartus调用modelsim仿真过程中,出现了一个错误,如下所示: Check the NativeLink log file I:/Quartus11.0/Myproject/testi_n ...

  6. 用Modelsim仿真QuartusII综合后网表时库的添加方法(转)

    这两天做综合后仿真,发现FPGA器件库又不会加了,无奈上网找方法.说起来不好意思,很早就接触Modelsim这个仿真软件了,可是没有好好琢磨.把这两天找的方法贴出来,再加上自己的理解,以后忘了可以上博 ...

  7. modelsim 仿真时出现无限迭代(iteration reach limitation)的原因及其解决办法

    modelsim 仿真时出现无限迭代(iteration reach limitation) 出现这种故障的原因:  一般都是代码里出现的组合逻辑无限循环或者组合逻辑A产生signal_A,signa ...

  8. modelsim仿真时让状态机波形显示状态的名字

    在使用Verilog编写有限状态机等逻辑的时候,状态机的各个状态通常以参数表示(如IDLE等).当使用ModelSim仿真的时候,状态机变量在wave窗口中以二进制编码的形式显示,如下面所示,这种显示 ...

  9. ModelSim仿真教程

    本文章详细介绍了怎样用ModelSim仿真Verilog,虽然只是很简单的一个二分频器的例子,但却正式小白入门所需要的. 本教程以ModelSim SE 10.4为例 1. 新建工程 file-> ...

随机推荐

  1. MySQL information_schema表查询导致内存暴涨

    case:下面的一条sql语句,导致mysql实例内存暴涨: select * from tables where table_name not in(select table_name from p ...

  2. .NET程序内,访问私有或者保护成员的技巧

    如果是C++,我们可以计算对象内成员的位置,然后偏移指针以访问类型的所有非公开成员.但是.NET对象完全受GC管理,地址根本无法得到,并且也无法通过指针调用方法. 当然... 这是一种很不值得推荐的技 ...

  3. 教程 打造OS X Mavericks原版 EFI Clover 引导安装

    自从 Mavericks 10.9 发布DP版到现在的GM版以来,以前Clover引导原版InstallESD.dmg方式安装原版的方法已经不能使用,而且已经不能引导安装了,所以从GM版发布以前,终于 ...

  4. 借助 ASR 和 System Center 执行基于 SAN 复制的企业级灾难恢复

    Abhishek A. Hemrajani 云 + Enterprise项目经理 对于Azure Site Recovery,我们的优先级已经提升为每个人都可以在任意地点获取易于使用的灾难恢复 (DR ...

  5. 结合Zen Coding快速编写HTML代码(sublime text2篇)

    首先说下,如何在sublime text2加上zen coding插件 按 Ctrl+`(就是~这个键) 复制下面的代码 确认 重新启动sublime text2 import urllib2,os; ...

  6. 从零开始学习jQuery (九) jQuery工具函数

    一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些许秘籍. 我们经常要使用脚本处理各种业务逻辑, 最常见的就 ...

  7. 基于WebForm+EasyUI的业务管理系统形成之旅 -- 数据统计(Ⅳ)

    上篇<基于WebForm+EasyUI的业务管理系统形成之旅 -- 首页快捷方式>,主要介绍通过添加首页快捷方式,快速进入各个应用菜单功能. 将常用的菜单功能作为快捷方式,避免由于寻找诸多 ...

  8. Asm Shader Reference --- Shader Model 2.x part

    ps部分 概览   Instruction Set                                       Name Description Instruction slots S ...

  9. BZOJ1997 [Hnoi2010]Planar (2-sat)

    题意:给你一个哈密顿图,判断是不是平面图 思路:先找出哈密顿图来.哈密顿回路可以看成一个环,把边集划分成两个集合,一个在环内,一个在外.如果有两条相交边在环内,则一定不是平面图,所以默认两条相交边,转 ...

  10. 【Java基础】增强for循环要注意陷阱

    什么是增强for循环 增强for循环是一种简单模式的for循环,为了方便数组和集合的遍历而存在. int[] arr = new int[]{1, 2, 3, 4, 5, 6}; for (int a ...