使用SDRAM控制器IP核对SDRAM进行读写操作

SDRAM 是一种 RAM 类型的易失性存储器件,因其具有较大的容量和相对较低的价格在嵌入式系统中应用广泛 。然而应用 SDRAM 需要实现刷新操作、行列管理、不同延迟和命令序列等逻辑,控制复杂,而 Qsys 提供的SDRAM 控制器 IP 核接口极大的方便了 SDRAM 的使用,本文我们实现使用 SDRAM 控制器 IP 核对 SDRAM 进行读写操作 。
理论部分简介
SDRAM 控制器 IP 核能够处理所有的 SDRAM 协议要求,包括上电初始化、地址复用、刷 新、读写时序等,极大的方便了 SDRAM 的使用 。下面我们先来看看 SDRAM 控制器 IP 核和SDRAM 芯片的连接框图,如下所示:

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图

Avalon 从机接口用来连接我们的 CPU,Avalon 从机接口是 SDRAM 控制器 IP 核中仅为用户可见的部分 。从控制器端口提供一个如 SDRAM 芯片一样大的平滑、线性存储器空间 。当访问从控制器端口时,SDRAM协议的细节完全透明 。Avalon 接口作为一个简单的存储器接口操作,没有存储器映射的配置寄存器 。这里我们需要注意的是:SDRAM 芯片必须和 Avalone 接口一样以相同的时钟来驱动 。
我们可以看到图中的片内锁相环(PLL),它就是用来调整 SDRAM 控制器与 SDRAM 芯片之间的时钟相位差 。在较低的时钟频率下,可能不需要 PLL 。在较高的时钟频率下,当信号在引脚上有效时,需要 PLL 来调整SDRAM 时钟 。PLL 并没有包括在 SDRAM 控制器内 。如果需要 PLL,设计者必须在生成 Qsys 系统模块以外手动添加 PLL 。Altera FPGA 和 SDRAM 芯片的不同组合将要求不同 PLL 的设置 。
还有一点我们需要说明的是 fmax 性能取决于整个硬件设计 。Qsys 系统模块的主控制器时钟驱动 SDRAM 控制器和 SDRAM 芯片 。因此,整个系统模块的性能决定 SDRAM 控制器的性能 。例如,为了实现 100MHz 的 fmax 性能,系统模块必须设计为 100MHz 时钟率,且 QuartusII 软件的时序分析必须检验硬件设计是否能够进行100MHz 的操作 。说完了 SDRAM 的综述之后下面我们就总结给出 SDRAM 控制器 IP 核的功能特性:
(1) SDRAM 控制器 IP 核具有不同数据宽度(8、16、32 或 64 位)、不同内存容量和多片选择等设置 。
(2) SDRAM 控制器 IP 核可以全面支持符合 PC100 标准的 SDRAM 芯片 。(PC100,表明时钟信号为 100,数据读写速率也为 100)
(3) SDRAM 控制器 IP 核可选择与其他的片外 Avalon 三态器件共用地址和数据总线,该特性在 I/O 引脚资源紧张的系统中很有用 。我们可以在 Qsys 中使用 SDRAM IP 核的配置向导来指定硬件特性和仿真特性 。SDRAMIP 核配置向导有两个选项卡:Memory Profile 和 Timing,如下图所示 。

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
为了使用方便,Presets 列表提供几个预定义的 SDRAM 配置 。如果实际使用的 SDRAM 芯片型号与列表中的一致,可直接选用而不用设置其他选项 。选择不同的预配置,SDRAM IP 核将自动改变 Memory Profile 和 Timing 选项卡上的值来匹配指定的配置 。如果实际使用的 SDRAM芯片与列表中的不相同,则需要设计者根据 SDRAM 芯片数据手册的参数来设置 Memory Profile和 Timing 标签上的值,改变任何选项卡上的配置设置转变 Preset 值为custom 。
当然我们也可以将我们配置好的 SDRAM 参数添加到预定义的 SDRAM 配置,在今后的使用过程中我们就直接选择我们添加的预定义的 SDRAM 配置 。接下来我们就来简单的介绍一下Memory Profile 和 Timing 。
(1) Memory Profile 选项卡
Memory Profile 选项卡允许设计者指定 SDRAM 的结构,例如地址和数据总线宽度、片选信号的数目和区的数目等 。Memory Profile 选项卡设置项如下表所示 。

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
这些参数值可参照使用的 SDRAM 手册来设置 。通过 Memory Profile 选项卡上的设置后,消息框以兆字节、兆bit 位以及可寻址的字长显示 SDRAM 预期的内存容量 。将这些预期值与选择的 SDRAM 的实际大小相比较可以检验设置是否正确 。说完了 Memory Profile 选项卡,接下来我们看看 Timing 选项卡 。
(2) Timing 选项卡
Timing 选项卡允许设计者设置 SDRAM 芯片的时序规范 。正确值在 SDRAM 芯片数据手册中提供 。Timing 选项卡上可用的设置如下表所示 。

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
我们需要注意的是无论我们输入的精确时序值如何,每个参数实现的实际时序将为 Avalon时钟的整数倍 。对于每隔一段时间执行一个刷新命令的参数,实际时序将不超出目标值,而其他所有参数,实际时序将大于或等于目标值 。
操作任务
利用官方 SDRAM ControllerIP 核实现对 SDRAM 的读写操作 。
硬件设计
实验的硬件框架如下图所示:

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
图中,我们要把 clk IP 核的时钟频率设置为 100MHz 。
另外需要注意的是,Nios II IP 核需要将复位向量 Reset Vector 和异常向量 Exception Vector 都设置为 SDRAM,如下图所示:

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
现在我们主要来介绍一下新添加的 SDRAM IP 核,按照使用的 SDRAM 型号为
W9825G6KH 的 datasheet,配置如下图所示 。

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
为了方便大家以后的使用,下面我们就简单为大家讲解一下如何将自己的 SDRAM 配置添加至 Library 中 。当我们配置好 SDRAM 以后,我们可以在窗口的右下方找到【New】按钮并点击,弹出如下图所示页面 。

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
在该页面中,我们将 Preset name 和 Preset description 填写好以后,我们就可以点击【Save】 按钮,弹出如下图所示提示窗口 。

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
在该提示窗口中我们选择是,这时我们就可以在 Library 中看到我们添加的 SDRAM 配置了 。然后我们重新打开Qsys 软件,这时,我们就可以在 SDRAM 的 Library 中看到我们添加的 W9825G6KH 。最后我们再补充说明一点,SDRAM 为动态存储器对时序要求比较高,由于 FPGA内部有延迟,所以 PLL 输出 100Mhz 时钟频率给SDRAM_SCLK 时,PLL 时钟需要设置相位偏移,
相位偏移我们设置为-75deg 。
顶层代码如下:

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
从顶层代码可以看到,我们主要例化 PLL 和 SDRAM 控制器,PLL 生成两个 100MHz 的时钟,其中一个偏移-75 度用于驱动 SDRAM 芯片 。
【使用SDRAM控制器IP核对SDRAM进行读写操作】 软件设计
本实验的软件工程代码如下:

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
在代码中,首先定义了一个 aut_u8 型的指针 ram 指向 SDRAM 的基地址+0x10000,之后我们改变或读取指针指向的地址(SDRAM 基地址+偏移地址)的值,就改变了 SDRAM 相应地址(偏移地址/2)的值 。在主函数中,我们通过 memset 函数将从 ram 指向地址开始的 100 个地址的值全部清 0,再通过一个 for 循环向从 ram 指向地址开始的 100 个地址的赋相应的值,最后再将这 100 个值逆向读取打印出来,这样就完成了 SDRAM 的读写操作 。可以看出,通过SDRAM 控制器的使用,对 SDRAM 的读写操作变得非常简单 。
之所以对 SDRAM 的读写要偏移 0x10000,是因为 CPU 程序的运行占用了从 SDRAM 基地址开始的部分内存,如果我们不做偏移直接从基地址开始读写,则很有可能破坏程序正常运行,0x10000 这个值并不固定,只要别占用程序运行的内存就可以了 。
下载验证
首先我们需要在 Quartus II 软件中将 qsys_sdram.sof 文件下载 到 开发板 中 ;然后 在 Eclipse 软件中将qsys_sdram_rw.elf 文件下载进去 。
qsys_sdram_rw.elf 下载完成以后,我们的 C 程序会自动运行,同时在 Nios II Console 界面会显示程序的打印信息 。图中可以看到从 SDRAM 中读出的数据为 99 到 0,与我们写入的数据一致,说明本次实验下载验证成功 。

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
如果大家在下载elf文件的过程中工具提示错误,如下图所示:

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
我们留意到在下载过程中,Console 会提示如下图所示的信息,说地址“0x2000020”到 “0x200D757”之间验证错误 。

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
错误的这段地址并不固定,但它们在 Qsys 系统中刚好处于 SDRAM 的地址范围内 。此时,我们可以通过以下方式解决下载报错的问题 。
在 Eclipse 中右击应用工程“qsys_sdram_rw”,在弹出的菜单中选择“Run As”
—>“Run Configurations”,会弹出“Run Configurations”配置页面,如下图所示:

使用SDRAM控制器IP核对SDRAM进行读写操作
文章插图
在上图所示页面中的“Target Connection”标签页最下方,勾选“Reset the selected
target system” 。在上图中,我们同时勾选了“Ignore mismatched system ID”以及 “Ignore mismatched system timestamp” 。设置完成后,点击“Apply”,最后点击“Run”来重新下载elf文件,这样在下载的过程中就不会报错了 。

    推荐阅读