电子说
SDRAM 是一种 RAM 类型的易失性存储器件,因其具有较大的容量和相对较低的价格在嵌入式系统中应用广泛。然而应用 SDRAM 需要实现刷新操作、行列管理、不同延迟和命令序列等逻辑,控制复杂,而 Qsys 提供的SDRAM 控制器 IP 核接口极大的方便了 SDRAM 的使用,本文我们实现使用 SDRAM 控制器 IP 核对 SDRAM 进行读写操作。
理论部分简介
SDRAM 控制器 IP 核能够处理所有的 SDRAM 协议要求,包括上电初始化、地址复用、刷 新、读写时序等,极大的方便了 SDRAM 的使用。下面我们先来看看 SDRAM 控制器 IP 核和SDRAM 芯片的连接框图,如下所示:
从上面的这个结构框图中,我们可以看到 SDRAM 控制器 IP 核产生于 FPGA 内部,它带有接口引脚、控制逻辑、以及 Avalon 从机接口。接口引脚用来连接外部 SDRAM 芯片管脚,这些接口引脚通过 Altera FPGA 上的 I/O 引脚连接到 SDRAM 芯片管脚上。控制逻辑用来实现 SDRAM的操作,比如,SDRAM 初始化,自刷新,突发读写等,这些全都是控制逻辑来完成的,控制逻辑不需要我们编写,当我们生成 SDRAM 控制器 IP 核之后,它会自动生成。
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,如下图所示。
为了使用方便,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 手册来设置。通过 Memory Profile 选项卡上的设置后,消息框以兆字节、兆bit 位以及可寻址的字长显示 SDRAM 预期的内存容量。将这些预期值与选择的 SDRAM 的实际大小相比较可以检验设置是否正确。说完了 Memory Profile 选项卡,接下来我们看看 Timing 选项卡。
(2) Timing 选项卡
Timing 选项卡允许设计者设置 SDRAM 芯片的时序规范。正确值在 SDRAM 芯片数据手册中提供。Timing 选项卡上可用的设置如下表所示。
我们需要注意的是无论我们输入的精确时序值如何,每个参数实现的实际时序将为 Avalon时钟的整数倍。对于每隔一段时间执行一个刷新命令的参数,实际时序将不超出目标值,而其他所有参数,实际时序将大于或等于目标值。
操作任务
利用官方 SDRAM ControllerIP 核实现对 SDRAM 的读写操作。
硬件设计
实验的硬件框架如下图所示:
图中,我们要把 clk IP 核的时钟频率设置为 100MHz。
另外需要注意的是,Nios II IP 核需要将复位向量 Reset Vector 和异常向量 Exception Vector 都设置为 SDRAM,如下图所示:
现在我们主要来介绍一下新添加的 SDRAM IP 核,按照使用的 SDRAM 型号为
W9825G6KH 的 datasheet,配置如下图所示。
为了方便大家以后的使用,下面我们就简单为大家讲解一下如何将自己的 SDRAM 配置添加至 Library 中。当我们配置好 SDRAM 以后,我们可以在窗口的右下方找到【New】按钮并点击,弹出如下图所示页面。
在该页面中,我们将 Preset name 和 Preset description 填写好以后,我们就可以点击【Save】 按钮,弹出如下图所示提示窗口。
在该提示窗口中我们选择是,这时我们就可以在 Library 中看到我们添加的 SDRAM 配置了。然后我们重新打开Qsys 软件,这时,我们就可以在 SDRAM 的 Library 中看到我们添加的 W9825G6KH。最后我们再补充说明一点,SDRAM 为动态存储器对时序要求比较高,由于 FPGA内部有延迟,所以 PLL 输出 100Mhz 时钟频率给SDRAM_SCLK 时,PLL 时钟需要设置相位偏移,
相位偏移我们设置为-75deg。
顶层代码如下:
从顶层代码可以看到,我们主要例化 PLL 和 SDRAM 控制器,PLL 生成两个 100MHz 的时钟,其中一个偏移-75 度用于驱动 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,与我们写入的数据一致,说明本次实验下载验证成功。
如果大家在下载elf文件的过程中工具提示错误,如下图所示:
我们留意到在下载过程中,Console 会提示如下图所示的信息,说地址“0x2000020”到 “0x200D757”之间验证错误。
错误的这段地址并不固定,但它们在 Qsys 系统中刚好处于 SDRAM 的地址范围内。此时,我们可以通过以下方式解决下载报错的问题。
在 Eclipse 中右击应用工程“qsys_sdram_rw”,在弹出的菜单中选择“Run As”
—>“Run Configurations”,会弹出“Run Configurations”配置页面,如下图所示:
在上图所示页面中的“Target Connection”标签页最下方,勾选“Reset the selected
target system”。在上图中,我们同时勾选了“Ignore mismatched system ID”以及 “Ignore mismatched system timestamp”。设置完成后,点击“Apply”,最后点击“Run”来重新下载elf文件,这样在下载的过程中就不会报错了。
全部0条评论
快来发表一下你的评论吧 !