SDRAM 学习(三)之command
command 模块总述
SDRAM 的 command 模块的内容包括如下:
1、对初始化请求、配置模式寄存器、读/写、刷新、预充电等命令的一个优先级的控制。
2、对命令执行时间进行控制,依据如图1,红圈框起来的都是最小值。

图1
3、将相应的命令进行解码即转化成相应的控制总线,转化依据如图2:

图2
代码详解
以下代码都是我通过学习别人的代码,然后按照我自己的理解修改后的,经过验证是正确的。
1、SDRAM 重要的参数
SDRAM 的容量为 4 * 1 M* 16 bit , 一共有 4 个 bank , 每个 bank 为 12 行、8列。 本次设计 SDRAM 为 顺序的突发读写模式、TCAS=3,TCL=3 。
我们将这些参数定义到 parameter.h 模块中,然后通过 `include "parameter.h" 在其他文件中调用这个文件,具体如下。

在command.v 中调用该文件。


图2
2、command.v 模块接口

3、命令的优先级,
(1) SDRAM在每一刻只有一个指令在执行;
(2) 先到的指令先执行,即:如果刷新请求到来时,其它命令正在执行中,要等到当前命令执行完成后,才能执行刷新指令;
(3) 其它指令和刷新请求同时到来时刷新操作先执行。
命令优先级代码:

初始化命令,可以和上面的代码融合为1个代码。
4、命令执行的延时控制
经过优先级判断后,要把指令解码成可控制SDRAM的信号,同时还要用三个移位寄存器对命令执行的延迟时间进行控制。第一个为指令延时寄存器,用来保证SDRAM有充足时间完成最终指令。例如,如果命令的执行需要9个时钟周期的时间(高手进阶—终极内存计数指南中说刷新需要9个时钟周期),则指令延时寄存器command_delay的初值设为 8 个 1 即“11111111”,同时声明一个内部信号command_done,作为指令执行完成的标志的。在指令执行期间,每一个时钟上升沿到来时,移位寄存器向右移位一次,command_delay[0]的移入command_done,同时“0” 移入最高位command_delay[7]。当command_done为“0”时,就说明指令的延迟时间已到,即通过command_done的值,就可以判断当前指令是否执行完成。要注意的是:移位寄存器的位数和初值,应该根据SDRAM的数据手册中命令完成需要的时间和系统的时钟周期来确定。
观察 图1 给出的数据手册内容得知,命令执行时间最长的是刷新命令至少63ns,我们时钟是100Mhz,至少需要7个时钟周期,因此设置为''11111111"是合适的,而对于更高工作频率的SDRAM则需要更多的时钟周期,只要满足数据手册要求就好了。
下面我将画出command_delay = 2‘b11 的时序图,以便理解。

代码:

当输入的指令为writea和reada指令,行激活到列激活必须满足的时间 TRCD。所以,声明第二个移位寄存器rw_shift,来计算这两个指令的附加时间,其工作原理和第一个移位寄存器是一样的。数据通道oe,即数据输入、输出使能信号。对于非页模式的读写来说,oe保持有效的时间取决于突发长度。并且oe有效的起始时间对读操作和写操作时不同的:读操作时,oe有效的起始时间取决于CAS延时时间,而对于写操作时则在写指令开始时oe就是有效的。

刷新、读、写命令还需要一个延时,原因如下(这都是我自己的理解还请大神指点)
对于非全页模式,延迟完 9 个时钟周期后继续延时 5 个时钟周期保证命令有充足的时间执行完毕我是这样理解的,对于非全页模式的读来讲,需要的最大时间为
TRCD(3)+TCL(3)+8(突发长度为8) = 14个时钟周期。
对于全页模式则当一页数据传输完成后再延迟 5 个时钟周期,对于全页模式的读操作,Burst_STOP命令发出后,数据不是立刻停止,而是与CL有关,因此需要保护这些数据,进行一个延迟。
全页模式下ex_write、ex_read 有效时,即正在进行全页数据传输过程中,当PM_STOP指令来时,则为0,

4、命令解码,将命令转化成控制信号的具体数值。


其中(do_reada| do_writea) 是指行激活
do_rw 是列激活
do_rw =1为读激活,do_rw =0 为写激活。

片选信号

5、行列地址、bank地址
将总地址的值分开,与 SDRAM 的重要参数保持一致

行列参数,行和列地址共用数据总线
当是单独的预刷新命令,SA[10]=1是指所有bank预充电
当是do_rwdo_rw==1列激活,SA[10] =1代表执行完读写操作就自动刷新,SA[10]=0 的含义则反之,
这里需要注意的是全页模式不能设置自动刷新,即不能在全页模式读写完以后自动启动预刷新。

bank地址

这些都是比较重要的,简单分析做个总结怕自己忘记。SDRAM设计中有很多细节,数据手册还是要多看看,每看一遍感觉都是不一样的。
学习的过程中没人交流,只能靠自己从网上搜、各种尝试,虽然很艰难,还是挺开心的。
以上都是我自己的理解,如果有大神发现问题,还请指出,本女子感激不尽!
原文链接:http://www.cnblogs.com/aslmer/p/6031921.html
SDRAM 学习(三)之command的更多相关文章
- docker深入学习三
docker学习三:network docker支持容器之间的网络通信,docker的网络通信方式有以下五种: bridge docker 默认的网络驱动,如果不指定网络驱动,docker就会创建一个 ...
- HTTP学习三:HTTPS
HTTP学习三:HTTPS 1 HTTP安全问题 HTTP1.0/1.1在网络中是明文传输的,因此会被黑客进行攻击. 1.1 窃取数据 因为HTTP1.0/1.1是明文的,黑客很容易获得用户的重要数据 ...
- TweenMax动画库学习(三)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) ...
- Struts2框架学习(三) 数据处理
Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...
- 4.机器学习——统计学习三要素与最大似然估计、最大后验概率估计及L1、L2正则化
1.前言 之前我一直对于“最大似然估计”犯迷糊,今天在看了陶轻松.忆臻.nebulaf91等人的博客以及李航老师的<统计学习方法>后,豁然开朗,于是在此记下一些心得体会. “最大似然估计” ...
- DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
- [ZZ] 深度学习三巨头之一来清华演讲了,你只需要知道这7点
深度学习三巨头之一来清华演讲了,你只需要知道这7点 http://wemedia.ifeng.com/10939074/wemedia.shtml Yann LeCun还提到了一项FAIR开发的,用于 ...
- SVG 学习<三>渐变
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- Android JNI学习(三)——Java与Native相互调用
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- day91 DjangoRestFramework学习三之认证组件、权限组件、频率组件、url注册器、响应器、分页组件
DjangoRestFramework学习三之认证组件.权限组件.频率组件.url注册器.响应器.分页组件 本节目录 一 认证组件 二 权限组件 三 频率组件 四 URL注册器 五 响应器 六 分 ...
随机推荐
- android 内存泄露调试
一.概述 1 二.Android(Java)中常见的容易引起内存泄漏的不良代码 1 (一) 查询数据库没有关闭游标 2 (二) 构造Adapter时,没有使用缓存的 convertView 3 (三) ...
- Android接口回调机制
开发中,接口回调是我们经常用到的. 接口回调的意思即,注册之后并不立马执行,而在某个时机触发执行. 举个例子: A有一个问题不会,他去问B,B暂时解决不出来,B说,等我(B)解决了再告诉你(A)此时A ...
- Android开发笔记——常见BUG类型之内存泄露与线程安全
本文内容来源于最近一次内部分享的总结,没来得及详细整理,见谅. 本次分享主要对内存泄露和线程安全这两个问题进行一些说明,内部代码扫描发现的BUG大致分为四类:1)空指针:2)除0:3)内存.资源泄露: ...
- 深入理解java虚拟机(1)------内存区域与内存溢出
在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻. 而Java确把这一工作交给了虚拟机来处理. 我们首先来看看关于内存的问题. 1.问题: 1)java ...
- 转 Android中shape中的属性大全
<shape> <!-- 实心 --> <solid android:color="#ff9d77"/&g ...
- nginx安装过程,报错处理:make[1]: *** [objs/addon/src/bson.o] Error 1
nginx安装过程中,经常会有各种错误: 具体安装步骤这里不做说明,网上一搜大把: 主要分析安装过程中遇到的问题 在make编译的时候,若报如下错误: cc1: warnings being trea ...
- ReportViewer技巧汇总
在MVC项目中使用ReportViewer 创建WebForm,向Webform中添加ReportViewer控件,通过CodeBehind设置报表参数并填充数据,测试通过后在MVC的View中iFr ...
- Sql server存储过程中常见游标循环用法
用游标,和WHILE可以遍历您的查询中的每一条记录并将要求的字段传给变量进行相应的处理 DECLARE ), ), @A3 INT DECLARE YOUCURNAME CURSOR FOR SELE ...
- LVS入门
说到大型网站的架构,就必然要谈到LVS.LVS即:Linux Virtual Server,是由国人章文嵩博士所创立的,已经被加入到了Linux 2.6的内核模块中了.官方网址: http://www ...
- tomcat 部署脚本
将一下3个脚本放到一个目录里,做成一个 python 的包即可使用 脚本介绍 操作服务脚本 #!/usr/bin/env python # _*_coding:utf-8_*_ # Author: & ...