上图是terasic公司提供的SDRAM控制器,大部分已经封装好,我们需要修改其中部分代码,以此来实现我们自己需要的功能。

1.PLL时钟设定

首先上面的sdram_pll.v中产生上一篇博客所需要的“驱动时钟”和“控制时钟”,这两个时钟由于PCB走线延时,两个时钟会有一定的时间差,一般会设定在-3ns ~ 1ns之间。如下图所示:

    上图是对SDRAM的PLL进行的更改,这个时钟差设定多少没有严格规定,可以先设定一个值,读取出图像进行调试,看图像是否帧错位或者图像显示不正确等原因,多是由于PLL没有配置好所导致,可以修改此部分进行修改,重新设定。

2.SDRAM_parameter.h 参数设置

之前在VGA显示一篇博客中,就用到了这种思想,就是将常用的参数设定在一个.h文件或者.v文件,然后利用 `include        "Sdram_Params.h"加载进来即可。

在此模块中,我们需要将常用到的一些参数设置好,主要用到以下一些参数:

(1) SDRAM  parameter.h

笔者使用H57V2562GTR和H57V641620E系列,再此以H57V2562GTR为例。

//==================================================

//address space parameters

// 4M x 4 x 16bit = (8192 x 512)x 4 x 16bit = 256Mbit 注意,8192和512分别为行数和列数。

//行和列的地址,行是12位的,列是8位的,所以会用到这样的乘积。

//宏定义的参数

‘define ROWSIZE  13 //行的宽度在一个bank中

‘define COLSIZE 9 //列的宽度在一个bank中

‘define DSIZE 16 //width of data bus to SDRAM  16bit SDRAM data

‘define BANKSIZE 2 //4 banks in one SDRAM

//所利用宏定义的参数

‘define  COLSTART 0

‘define  ROWSTART   ‘COLSIZE

‘define  BANKSTART  ‘COLSIZE + ‘ROWSIZE

‘define  ASIZE   ‘ROWSIZE  +  ‘ COLSIZE  +  ’ BANKSIZE

//==================================

//上述是对SDRAM的位宽,行宽,列宽,行起始,列起始,bank数,进行设置。已经最大限度参数化,对

//于同一类hynix这一部分所需要更改的只需更改ROWSIZE和COLSIZE以及DSIZE即可。

//==================================================

(2) 按照SDRAM的驱动流程,那么接下来应该是先200us的SDRAM的稳定启动。

INIT_PER = 200us / T = 200 x 10^3ns / (1000/CLK) = 200 x CLK;

其中CLK为xxMHz的驱动时钟频率,已经转换为ns状态下,所以为1000/clk。以上是计算出来的是延时计 数,就是一开始上电之后,先有一个200us的延时。

比如驱动时钟频率为100MHz,则INIT_PRE  = 20000;

比如驱动时钟频率为133MHz,则INIT_PRE  = 26600;

//==================================================

(3) 预刷新计数的宏定义

存储器上面的手册的信息是64ms必须完成所有逻辑单元的更新,主要是希望保证SDRAM数据不丢失的前提下,尽可能提高SDRAM的有效带宽,因此设置64ms为刷新间隔上限。

行刷新周期时间 = 64ms / 每个bank的行数.

例如,如果有4096行,则行刷新周期为 64ms / 4096 = 15.625us。

例如,如果有8192行,则行刷新周期为 64ms / 8192 = 7.8125us。

所以REF_PER = 15.625us / (1000/CLK) =15.625 x 10^3 ns / (1000/CLK) = 15.625 x CLK  (对应有4096行)

REF_PER = 7.8125us / (1000/CLK) =7.8125 x 10^3 ns / (1000/CLK) = 7.8125x CLK  (对应有8192行)

只要至少在预刷新的时间内刷新一次即可,若是有小数部分,可以取最大的整数,忽略小数部分,取最大的整数。

如4096行采用100MHz 时钟频率进行驱动,则15.625 x 100 = 1562/1563均可。

//==================================================

(4) SC_CL潜伏期延时的宏定义

SC_CL为SDRAM列选通命令的潜伏期延时设定,手册规定为2或者3;潜伏期的延时大小直接关系到SDRAM的最高运行速率,因此一般选择3。

定义SC_CL的宏后,会映射到SDR_CL的宏上,这个直接关系到最终的潜伏期选择,

parameter SDR_CL = (SC_CL == 2)? 3’b10 : 3’b11;

//==================================================

(5) SC_RCD数据读取延时定义

保持默认值3

//==================================================

(6) SC_PM突发长度命令宏定义

这里采用了全页突发读/写操作,因此直接设置为A2A1A0 = 1 1 1;

为了便于其他模式修改:通过宏定义选择突发读写长度:

parameter SC_BL = 1;

//SDRAM parameter

parameter SDR_BL = (SC_PM == 1)? 3’b111:    //page 256

(SC_BL == 1)? 3’b000:    //1

(SC_BL == 2)? 3’b001:    //2

(SC_BL == 4)? 3’b010:    //4

3’b011;    //8

//==================================================

(7) 突发顺序/交错读/写宏定义

一般在视频流的操作中采用顺序读/写,这里的宏定义如下:

parameter SDR_BT = 1’b0 ;    // 顺序读/写   A3 = 0

// 1’b1;   // 交错读/写   A3 = 1;

以上就是所有SDRAM所需要设定的参数。

//==================================================

//下面是terasic 公司的SDRAM参数设置。

// Address Space Parameters

`define ROWSTART        8         
`define ROWSIZE         12
`define COLSTART        0
`define COLSIZE         8
`define BANKSTART       20
`define BANKSIZE        2

// Address and Data Bus Sizes

`define  ASIZE           23      // total address width of the SDRAM
`define  DSIZE           16      // Width of data bus to SDRAMS

//parameter    INIT_PER    =    100;        //    For Simulation

//    Controller Parameter
////////////    133 MHz    ///////////////
/*
parameter    INIT_PER    =    32000;
parameter    REF_PER        =    1536;
parameter    SC_CL        =    3;
parameter    SC_RCD        =    3;
parameter    SC_RRD        =    7;
parameter    SC_PM        =    1;
parameter    SC_BL        =    1;
*/
///////////////////////////////////////
////////////    100 MHz    ///////////////
parameter    INIT_PER    =    24000;
parameter    REF_PER        =    1024;
parameter    SC_CL        =    3;
parameter    SC_RCD        =    3;
parameter    SC_RRD        =    7;
parameter    SC_PM        =    1;
parameter    SC_BL        =    1;
///////////////////////////////////////
////////////    50 MHz    ///////////////
/*
parameter    INIT_PER    =    12000;
parameter    REF_PER        =    512;
parameter    SC_CL        =    3;
parameter    SC_RCD        =    3;
parameter    SC_RRD        =    7;
parameter    SC_PM        =    1;
parameter    SC_BL        =    1;
*/
///////////////////////////////////////

//    SDRAM Parameter
parameter    SDR_BL        =    (SC_PM == 1)?    3'b111    :
                            (SC_BL == 1)?    3'b000    :
                            (SC_BL == 2)?    3'b001    :
                            (SC_BL == 4)?    3'b010    :
                                            3'b011    ;
parameter    SDR_BT        =    1'b0;    //    Sequential
                            //    1'b1:    //    Interteave
parameter    SDR_CL        =    (SC_CL == 2)?    3'b10:3'b11;

//=======================================

//优化上述各参数如下所示:

// Address and Data Bus Sizes
//(1M * 4) * 16Bit =(4096 * 256) * 4 * 16Bit = 64MBit
`define    ROWSIZE            12        //Rows width in one bank
`define    COLSIZE            8        //Column width in one bank
`define DSIZE            16      //16Bit SDRAM data
`define    BANKSIZE        2        //4 Banks in one SDRAM

`define ASIZE            `COLSIZE + `ROWSIZE + `BANKSIZE    //SDRAM Total address

// Address Space Parameters -> The new code addres: {Bank, Row, Column}
`define COLSTART        0                       
`define ROWSTART          `COLSIZE                 
`define BANKSTART        `COLSIZE + `ROWSIZE

//上述将rowstart和bankstart进行了参数化,只需修改有限几个参数即可。

//---------------------------------------
//SDRAM Init paramter setting
//`define        ROW4096_133MHz
//`define        ROW4096_125MHz
`define        ROW4096_100MHz   
//`define        ROW8192_133MHz
//`define        ROW8192_125MHz
//`define        ROW8192_100MHz

//利用命令`define…….`ifdef …….`endif 结构来实现对模式的选择,可以方便的修改。

`ifdef    ROW4096_133MHz
//    Controller Parameter for 4096 Rows @ 133MHz
parameter    INIT_PER    =    16'd26600;    //200 * 133
parameter    REF_PER     =    16'd2078;    //15.625*133 = 2078.125
parameter    SC_CL        =    3;
parameter    SC_RCD     =    3;
parameter    SC_PM      =    1;
parameter    SC_BL        =    1;
`endif

`ifdef    ROW4096_125MHz
//    Controller Parameter for 4096 Rows @ 125MHz
parameter    INIT_PER    =    16'd25000;    //200 * 125
parameter    REF_PER        =    16'd1953;    //15.625*125 = 1953.125
parameter    SC_CL        =    3;
parameter    SC_RCD        =    3;
parameter    SC_PM        =    1;
parameter    SC_BL        =    1;
`endif

`ifdef    ROW4096_100MHz
//    Controller Parameter for 4096 Rows @ 100MHz
parameter    INIT_PER    =    16'd20000;    //200 * 100
parameter    REF_PER        =    16'd1562;    //15.625*100 = 1562.5
parameter    SC_CL        =    3;
parameter    SC_RCD        =    3;
parameter    SC_PM        =    1;
parameter    SC_BL        =    1;
`endif

`ifdef    ROW8192_133MHz
//    Controller Parameter for 8192 Rows @ 133MHz
parameter    INIT_PER    =    16'd26600;    //200 * 133
parameter    REF_PER        =    16'd1039;    //7.8125*133 = 1039.0625;
parameter    SC_CL        =    3;
parameter    SC_RCD        =    3;
parameter    SC_PM        =    1;
parameter    SC_BL        =    1;
`endif

`ifdef    ROW8192_125MHz
//    Controller Parameter for 8192 Rows @ 125MHz
parameter    INIT_PER    =    16'd25000;    //200 * 125
parameter    REF_PER        =    16'd976;    //7.8125*125 = 976.5625
parameter    SC_CL        =    3;
parameter    SC_RCD        =    3;
parameter    SC_PM        =    1;
parameter    SC_BL        =    1;
`endif

`ifdef    ROW8192_100MHz
//    Controller Parameter for 8192 Rows @ 100MHz
parameter    INIT_PER    =    16'd20000;    //200 * 100
parameter    REF_PER        =    16'd781;    //7.8125*100 = 781.25
parameter    SC_CL        =    3;
parameter    SC_RCD        =    3;
parameter    SC_PM        =    1;
parameter    SC_BL        =    1;
`endif

//-----------------------------------------------------------
//    SDRAM Parameter
parameter    SDR_BL    =    (SC_PM == 1)?    3'b111    :    //Page 256
                        (SC_BL == 1)?    3'b000    :    //1
                        (SC_BL == 2)?    3'b001    :    //2
                        (SC_BL == 4)?    3'b010    :    //4
                                        3'b011    ;    //8
parameter    SDR_BT    =    1'b0;    //    Sequential
                    //    1'b1:    //    Interteave
parameter    SDR_CL    =    (SC_CL == 2)?    3'b10:
                                        3'b11;

上述就定义完成了SDRAM初始化以及模式配置所需要的各寄存器参数,上述的配置正确与否直接决定了输出的数据和运行速率。

//=======================================================================

更多详细的资料下载可以登录笔者百度网盘:

网址:http://pan.baidu.com/s/1bnwLaqF

密码:fgtb

//=======================================================================

SDRAM 学习笔记(三)的更多相关文章

  1. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  2. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  3. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  4. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  5. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  6. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

  7. NumPy学习笔记 三 股票价格

    NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  10. Typescript 学习笔记三:函数

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

随机推荐

  1. Enum,Int,String的互相转换 枚举转换

    Enum为枚举提供基类,其基础类型可以是除 Char 外的任何整型.如果没有显式声明基础类型,则使用 Int32.编程语言通常提供语法来声明由一组已命名的常数和它们的值组成的枚举. 注意:枚举类型的基 ...

  2. angular学习笔记(三十一)-$location(1)

    本篇介绍angular中的$location服务的基本用法,下一篇介绍它的复杂的用法. $location服务的主要作用是用于获取当前url以及改变当前的url,并且存入历史记录. 一. 获取url的 ...

  3. PC-Lint概念与基本操作

    1.   PC-Lint工具介绍 PC-Lint for C/C++是由Gimpel软件公司于1985年开发的代码静态分析工具,它能有效地发现程序语法错误.潜在的错误隐患.不合理的编程习惯等. C语言 ...

  4. [Windows Azure] Load Balancing Virtual Machines

    Load Balancing Virtual Machines All virtual machines that you create in Windows Azure can automatica ...

  5. ubuntu 查看软件安装目录以及安装版本

    1.aptitude show 软件名 例如:aptitude show kde-runtime ****@ubuntu:~$ aptitude show kde-runtime 软件包: kde-r ...

  6. django rest_framework入门五-认证和权限

    1.django User实体 django自带了用户验证模块,django/contrib/auth/models.py定义了用户实体,代码如下: class AbstractUser(Abstra ...

  7. LeetCode: Jump Game II 解题报告

    Jump Game II Given an array of non-negative integers, you are initially positioned at the first inde ...

  8. 分类算法----k近邻算法

    K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的 ...

  9. Cpu表现出正弦曲线

    #include <windows.h> #include <math.h> int main(void) { SetThreadAffinityMask(GetCurrent ...

  10. [dts]AM4378的dts中配置和数据手册映射关系

    最近在设置AM4378 GPIO的时候产生了困惑 如何设置GPIO为output_pullup, output_pulldown, input_pullup, input_pulldown, high ...