ise的时钟ip核_正点原子开拓者 Nios II资料连载第七章SDRAM IP核

1)实验平台:正点原子开拓者FPGA 开发板

2)摘自《开拓者 Nios II开发指南》关注官方微信号公众号,获取更多资料:正点原子

3)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/index.html

193268da1c6d16c5cd1a1d4a44f48d80.png

第七章SDRAM IP

SDRAM 是一种 RAM 类型的易失性存储器件,因其具有较大的容量和相对较低的价格在嵌

入式系统中应用广泛。然而应用 SDRAM 需要实现刷新操作、行列管理、不同延迟和命令序列

等逻辑,控制复杂,而 Qsys 提供的 SDRAM 控制器 IP 核接口极大的方便了 SDRAM 的使用,本

章我们使用 SDRAM 控制器 IP 核对 SDRAM 进行读写实验。

本章包括以下几个部分:

7.1 简介

7.2 实验任务

7.3 硬件设计

7.4 软件设计

7.5 下载验证

简介

SDRAM 控制器 IP 核能够处理所有的 SDRAM 协议要求,包括上电初始化、地址复用、刷

新、读写时序等,极大的方便了 SDRAM 的使用。下面我们先来看看 SDRAM 控制器 IP 核和

SDRAM 芯片的连接框图,如下所示:

d9351ea5df95b4140509ca75948ac6ca.png

图 7.1.1SDRAM控制器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,如下图所示。

ed793b92034e9152cab182e76eca546b.png

图 7.1.2 SDRAM控制器IP核的配置选项

为了使用方便,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 选项卡设置项如下表所示。

图 7.1.3 Memory Profile 选项卡设置

bcefcf12e7357325ce64736d6bd8fefa.png

这些参数值可参照使用的 SDRAM 手册来设置。通过 Memory Profile 选项卡上的设置后,

消息框以兆字节、兆 bit 位以及可寻址的字长显示 SDRAM 预期的内存容量。将这些预期值与

选择的 SDRAM 的实际大小相比较可以检验设置是否正确。说完了 Memory Profile 选项卡,接

下来我们看看 Timing 选项卡。

(2) Timing 选项卡

Timing 选项卡允许设计者设置 SDRAM 芯片的时序规范。正确值在 SDRAM 芯片数据手册

中提供。Timing 选项卡上可用的设置如下表所示。

图 7.1.4 Timing 选项卡设置

8ef97cd07ecb7204c5396ad4a59f55b6.png

我们需要注意的是无论我们输入的精确时序值如何,每个参数实现的实际时序将为 Avalon

时钟的整数倍。对于每隔一段时间执行一个刷新命令的参数,实际时序将不超出目标值,而其他所有参数,实际时序将大于或等于目标值。

实验任务

本章我们利用官方 SDRAM ControllerIP 核实现对 SDRAM 的读写操作。

硬件设计

本章实验的硬件框架如下图所示:

36361636c5f0268d76994e60a76f7d81.png

图 7.3.1 SDRAM 实验的硬件框架图

图中,我们要把 clk IP 核的时钟频率设置为 100MHz。

另外需要注意的是,Nios II IP 核需要将复位向量 Reset Vector 和异常向量 Exception

Vector 都设置为 SDRAM,如下图所示:

58fb3de937da3385c71b8c0b1e344908.png

图 7.3.2 设置Nios II的复位向量和异常向量

现在我们主要来介绍一下新添加的 SDRAM IP 核,按照开拓者使用的 SDRAM 型号为

821c39480384c779d4d4b55c6aa5cf14.png

W9825G6KH 的 datasheet,配置如下图所示。

8a08cf611d4502248314a8952636a3bd.png

图 7.3.3 SDRAM控制器IP核的Memory Profile配置页面

d764bf454f9bd2dc3a0c7065d7f991f8.png

图 7.3.4 SDRAM控制器IP核的Timing配置页面

为了方便大家以后的使用,下面我们就简单为大家讲解一下如何将自己的 SDRAM 配置添

加至 Library 中。当我们配置好 SDRAM 以后,我们可以在窗口的右下方找到【New】按钮并点

击,弹出如下图所示页面。

89c4b0b34fcbdb6418d1d92444cd48ba.png

图 7.3.5 将 SDRAM 配置添加至Library中

在该页面中,我们将 Preset name 和 Preset description 填写好以后,我们就可以点击【Save】

按钮,弹出如下图所示提示窗口。

151863f28fd62643fed9c2110f76da1b.png

图 7.3.6 路径添加提示窗口

在该提示窗口中我们选择是,这时我们就可以在 Library 中看到我们添加的 SDRAM 配置

了。然后我们重新打开 Qsys 软件,这时,我们就可以在 SDRAM 的 Library 中看到我们添加的

W9825G6KH。最后我们再补充说明一点,SDRAM 为动态存储器对时序要求比较高,由于 FPGA

内部有延迟,所以 PLL 输出 100Mhz 时钟频率给 SDRAM_SCLK 时,PLL 时钟需要设置相位偏移,

相位偏移我们设置为-75deg。

顶层代码如下:

1 module sdram_rw(

2 //module clock

3 input sys_clk , // 时钟信号

4 input sys_rst_n , // 复位信号(低有效)

5

6 //SDRAM interface

7 output sdram_clk, // SDRAM 芯片时钟

8 output sdram_cke, // SDRAM 时钟有效

9 output sdram_cs_n, // SDRAM 片选

10 output sdram_ras_n, // SDRAM 行有效

11 output sdram_cas_n, // SDRAM 列有效

12 output sdram_we_n, // SDRAM 写有效

13 output [ 1:0] sdram_ba, // SDRAM Bank 地址

14 output [12:0] sdram_addr, // SDRAM 行/列地址

15 inout [15:0] sdram_data, // SDRAM 数据

16 output [ 1:0] sdram_dqm // SDRAM 数据掩码

17 //user interface

18 );

19

20 //wire define

21 wire clk_100m; // SDRAM 控制器时钟

22 wire clk_100m_shift; // 相位偏移时钟

23 wire rst_n ; // 复位信号(低有效)

24 wire locked; // PLL 输出有效标志

25

26 //*****************************************************

27 //** main code

28 //*****************************************************

29

30 assign sdram_clk = clk_100m_shift; // SDRAM 驱动时钟

31

32 //例化 PLL

33 pll_clk u_pll_clk(

34 .inclk0 (sys_clk ),

35 .c0 (clk_100m),

36 .c1 (clk_100m_shift)

37 );

38

39 //SDRAM 控制器顶层模块,封装成 FIFO 接口

40 sdram u_sdram (

41 .clk_clk (clk_100m ), // SDRAM 控制器驱动时钟

42 .reset_reset_n (sys_rst_n ), // 复位信号(低有效)

43 .sdram_controller_wire_addr (sdram_addr ), // SDRAM 行/列地址

44 .sdram_controller_wire_ba (sdram_ba ), // SDRAM Bank 地址

45 .sdram_controller_wire_cas_n (sdram_cas_n), // SDRAM 列有效

46 .sdram_controller_wire_cke (sdram_cke ), // SDRAM 时钟有效

47 .sdram_controller_wire_cs_n (sdram_cs_n ), // SDRAM 片选

48 .sdram_controller_wire_dq (sdram_data ), // SDRAM 数据

49 .sdram_controller_wire_dqm (sdram_dqm ), // SDRAM 数据掩码

50 .sdram_controller_wire_ras_n (sdram_ras_n), // SDRAM 行有效

51 .sdram_controller_wire_we_n (sdram_we_n ) // SDRAM 写有效

52 );

53

54 endmodule

从顶层代码可以看到,我们主要例化 PLL 和 SDRAM 控制器,PLL 生成两个 100MHz 的时

钟,其中一个偏移-75 度用于驱动 SDRAM 芯片。

软件设计

本实验的软件工程代码如下:

1 #include <stdio.h> //标准输入输出头文件

2 #include "system.h" //系统头文件

3 #include "alt_types.h" //数据类型头文件

4 #include "string.h"

5

6 //SDRAM 地址

7 alt_u8 *ram = (alt_u8 *)(SDRAM_CONTROLLER_BASE + 0x10000);

8

9 //---------------------------------------------------------------------------

10 //-- 名称 : main()

11 //-- 功能 : 程序入口

12 //-- 输入参数 : 无

13 //-- 输出参数 : 无

14 //---------------------------------------------------------------------------

15

16 int main(void){

17 int i;

18 memset(ram,0,100);

19 //向 ram 中写数据,当 ram 写完以后,ram 的地址已经变为(SDRAM_BASE+0x10000+200)

20 for(i=0;i<100;i++){

21 *(ram++) = i;

22 }

23 //逆向读取 ram 中的数据

24 for(i=0;i<100;i++){

25 printf("%d ",*(--ram));

26 }

27 return 0;

28 }

在代码中,首先定义了一个 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 界面

会显示程序的打印信息,如图 7.5.1 所示。图中可以看到从 SDRAM 中读出的数据为 99 到 0,

与我们写入的数据一致,说明本次实验下载验证成功。

1231625b35db13b5f2a39ff9402fede4.png

图 7.5.1 SDRAM IP核实验结果

如果大家在下载elf文件的过程中工具提示错误,如下图所示:

8deccac2f5df1310e646897ffbcc70df.png

图 7.5.2 下载elf文件过程中报错

我们留意到在下载过程中,Console 会提示如下图所示的信息,说地址“0x2000020”到

“0x200D757”之间验证错误。

2db295301dc02fa99637729a493f4fe6.png

图 7.5.3 下载过程中的提示信息

错误的这段地址并不固定,但它们在 Qsys 系统中刚好处于 SDRAM 的地址范围内。此

时,我们可以通过以下方式解决下载报错的问题。

在 Eclipse 中右击应用工程“qsys_sdram_rw”,在弹出的菜单中选择“Run As”

—>“Run Configurations”,会弹出“Run Configurations”配置页面,如下图所示:

3e6661ceffb7d03c044c0890188c117b.png

图 7.5.4 Run Configurations 配置页面

在上图所示页面中的“Target Connection”标签页最下方,勾选“Reset the selected

target system”。在上图中,我们同时勾选了“Ignore mismatched system ID”以及

Ignore mismatched system timestamp”。

设置完成后,点击“Apply”,最后点击“Run”来重新下载elf文件,这样在下载的过程

中就不会报错了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值