SDRAM 学习笔记(三)
上图是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 学习笔记(三)的更多相关文章
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- java之jvm学习笔记三(Class文件检验器)
java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
- NumPy学习笔记 三 股票价格
NumPy学习笔记 三 股票价格 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.&l ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) 补充 hector_slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Learning ROS for Robotics Programming Second Edition学习笔记(三) indigo rplidar rviz slam
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
随机推荐
- Atitit 图像处理类库 halcon11 安装与环境搭建attilax总结
Atitit 图像处理类库 halcon11 安装与环境搭建attilax总结 正常安装软件,安装前请先退出其它一切正在运行的程序. 先安装halcon-10.0-windows.exe.安装完成后 ...
- mysql中delimiter
delimiter xx 其实就是告诉MySQL解释器,该段命令已经结束了,mysql是否可以执行了.默认请况下delimiter是分号';'.
- 安装mysql提示3306端口已经被占用解决方案
今天遇到的问题是这样的,之前已经安装过mysql了,一直用的好好的,但是今天开启服务时报异常,无法启动.为了省事,于是想到卸载重装,在安装的过程中发现3306已经被占用,这也是一开始服务无法启动的原因 ...
- Mac git pull失败,最新操作系统导致 SSH issues with Mac OS X High Sierra
Mac 升级到最新操作系统ssh加密方式和gitlub不一样,导致不能git pull 如:mac是md5加密方式,gitlut是aes-256-cbc加密方式 解决方法如下 A coworker ...
- 详解利用Dockerfile构建mysql镜像并实现数据的初始化及权限设置
本文提要 本文目的不仅仅是创建一个MySQL的镜像,而是在其基础上再实现启动过程中自动导入数据及数据库用户的权限设置,并且在新创建出来的容器里自动启动MySQL服务接受外部连接,主要是通过Docker ...
- KVM虚拟机的xml配置文件
在RHEL6中,用于从磁盘启动的XML文件 这里以dcs01.xml为例: <domain type='kvm'><name>dcs01</name><uui ...
- django HttpRequest对象
概述: 服务器接收http请求后,会根据报文创建HttpRequest对象 视图的第一个参数就是HttpRequest对象 django创建的,之后调用视图时传递给视图 属性 path:请求的完整路径 ...
- tf.Variable
tf.Variable __init__( initial_value=None, trainable=True, collections=None, validate_shape=True, cac ...
- [转]PowerDesigner中name和code取消自动关联
PowerDesigner中,但修改了某个字段的name,其code也跟着修改,这个问题很讨厌,因为一般来说,name是中文的,code是字段名. 解决方法如下: 1.选择Tools->Gene ...
- docker打开api remote接口设置
前言 本文记录docker怎么打开api remote接口设置,docker的版本更新太快了,不同的版本之间,设置可能不同,本文是针对docker13.1 1. 查看配置文件位于哪里 systemc ...