用ModelSim仿真SDRAM操作

之前写了两篇关于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模块的仿真):

下载Modelsim仿真SDRAM工程源码

使用时可以把需要的文件加入工程,同时修改system.do文件中的源文件路径,然后执行即可。

(所有.do文件放在modelsim文件夹下)

我使用的Modelsim版本为SE10.0C。

本工程所需仿真文件如下所示:

来源:http://blog.csdn.net/ruby97/article/details/7356110

时间: 2024-08-04 13:34:09

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

ModelSim仿真入门 精讲

ModelSim仿真入门之一:软件介绍 编写这个教程之前,为了让不同水平阶段的人都能阅读,我尽量做到了零基础入门这个目标,所有的操作步骤都经过缜密的思考,做到了详细再详细的程度. 如果您是FPGA开发方面的初学者,那么这个教程一定能够帮助你在仿真技术上越过新人的台阶:如果您是FPGA开发的老手,这篇文档也并非对您没有帮助,您可以把教程发给其他刚入门的同事,免去您亲自上阵指导的麻烦,把主要的精力放在更有价值的地方. 一.FPGA设计仿真验证简介 严格来讲,FPGA设计验证包括功能仿真.时序仿真和电

modelsim仿真脚本化环境

刚开始学习modelsim仿真的时候,基本上都是按照图形界面的流程,建立工程-->添加设计代码-->编译-->打开仿真波形界面.但是,每次重复这些操作会感到很繁琐,而且,对于大的工程,动辄几十上百个设计文件,一个一个添加,费时费力又容易遗漏,所以想提高效率,脚本化环境是最佳的选择. 以下是自己在参考了网上一些资料和教程之后,整理的modelsim仿真脚本,供大家参考,也希望能有高人多多指教. 脚本的功能: 自动搜索源代码并生产filelist文件 自动编译并根据需要是否打开图形界面,并自

关于xilinx ise10.1与modelsim仿真库编译

关于xilinx ise10.1与modelsim仿真库编译(2011-08-21 01:00:39)转载▼标签:杂谈 分类: FPGA 首先介绍一下Xilinx几个主要的仿真库(路径:D:\Xilinx\11.1\ISE\verilog\src\) 1. Unsim文件夹:Library of Unified component simulation models.仅用来做功能仿真,包括了Xilinx公司全部的标准元件.每个元件使用一个独立的文件,这样是为了方便一些特殊的编译向导指令,如`us

Quartus和Modelsim仿真ROM模块

新建一个工程 选择工程保存路径,为工程取一个名字 Page 2 of 5 直接点击next ? ? Page 4 of 5 直接点击next ? 下面为工程添加文件 ? 需要注意模块名和模块所在文件的文件名要一致,下面的代码保存在Wave.v这个文件中 module Wave( input i_clk, input i_rst_n, output reg[7:0] led ); ? parameter Delay500MS = 10; ? reg clk_led; reg[24:0] cnt;

modelsim仿真rom.mif文件配置需要绝对路径

昨晚用modelsim仿真ROM,居然输出的数据全部都是000.这个在以前是没有过的.难道modelsim坏了?我试了一个以前的rom测试文件,居然显示正常.这就怪了.难道2个月没碰就这么生疏了? 然后开始找原因.最后看到一个帖子说,如果rom无输出,可能是IP核配置文件的,初始化文件需要使用绝对路径.然后我就把配置文件的初始化mif改成了绝对路径.居然就好了. 但是我查看了下以前的测试.也没有是绝对路径啊.唉~~~只能说modelsim还有待加强啊! modelsim仿真rom.mif文件配置

Matlab对Modelsim仿真生成的数据进行分析

Matlab对Modelsim仿真生成数据的处理也是通过文件读写实现的.即通过Verilog语句,将仿真过程中的某个信号写入文件,然后在Matlab中在把这个文件的数据读出来,就可以在Matlab中进行分析了. 下图也通过一个简单的例子,说明一下整个过程. 以下的Verilog语句实现将信号data_out的数据写入data_out.txt文件 integer w_file; initial w_file = $fopen("data_out.txt"); always @(i) be

ModelSim 仿真流程简要

1.    ModelSim简介 ModelSim分几种不同的版本:SE.PE和OEM,其中集成在 Actel(爱特公司).Altera (阿尔特拉).Xilinx(赛灵思)以及Lattice(莱迪思)等FPGA厂商设计工具中的均是其OEM版本,SE版本为最高级版本.ModelSim仿真分为功能仿真,门级仿真,时序仿真 ◆  功能仿真(前仿真,代码仿真) 主旨在于验证电路的功能是否符合设计要求,其特点是不考虑电路门延迟与线延迟,主要是验证电路与理想情况是否一致.可综合FPGA代码是用RTL级代码

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

在使用Verilog编写有限状态机等逻辑的时候,状态机的各个状态通常以参数表示(如IDLE等).当使用ModelSim仿真的时候,状态机变量在wave窗口中以二进制编码的形式显示,如下面所示,这种显示形式不是很直观,但我们可以使用ModelSim提供的命令将状态机变量以“文本”形式的参数名显示,从而有利于调试. 下面以一个实例来说明. 代码来源:http://www.cnblogs.com/oomusou/archive/2011/06/05/fsm_coding_style.html 源文件:

modelSIM仿真时objects空白无显示问题

http://blog.csdn.net/yyywxk/article/details/68947172 笔者在做modelsIM实验时,在编译好相关文件后,准备进行相关仿真实验,此时意外发生了. 无论笔者怎么点击仿真界面,object页面下始终没有是空白没有任何东西.同时,下方的transcript页面底部一直显示loading.....在等待足够长的时间后,最终显示"failed to start simulation kernel". 对于这种状况,目前网络上的给出了两种方法.