力战SDRAM(三)

我们分两条主线来介绍SDRAM的读写:地址线和数据线

首先地址线上,在FPGA启动,延时500微妙。然后地址计数器cntwr每等到延时500us加1

(else if(delay_done) cntwr <=cntwr+1‘b1)

直到加到63,然后让地址寄存器addr加1。

(else if(!wr_done && cntwr ==6‘h3f) addr <= addr+1‘b1)

也就是说,32毫秒,地址线加1,但是这个地址线并不是最终送到SDRAM上的,只是产生的暂时地址信息。

----------------------------------------------------------------------------------------------------------

在数据线,FPGA启动,延时500微妙。为了写数据到写FIFO(写是名词,表示这个FIFO是用来写进数据的)而设定的计数器cnt于5时拉高写有效引脚,同时此时让数据寄存器wr_dinr加1,cnt与0d时,拉低写有效引脚,同时数据寄存器停止加1,结束数据写入,共写入8个数据。如此8个8个的往复写入!

(else if(!wr_done && ((cntwr >6‘h05) && (cntwr <= 6‘h0d)))begin

wrf_dinr <= wrf_dinr+1‘b1)

------------------------------------------------------------------------------------------------------------------------------

一旦数据写入FIFO达到8个,则激活系统写SDRAM请求信号sdram_wr_req,使之有效(高)

(assign sdram_wr_req = ((wrf_use >=9‘d8) & ~syswr_done))。

而sdram_wr_req有效,进而使读写状态机运行到`W_ACTIVE状态

(elseif(sdram_wr_req & sdram_init_done) begin

work_state_r <= `W_ACTIVE)。

从而顺势走向`W_WRITE状态。而一旦进入这个状态,将激活sdram_wr_ack信号

(assign sdram_wr_ack = (work_state ==`W_WRITE) | ((work_state == `W_WD) & (cnt_clk_r < 9‘d8)& (cnt_clk_r>= 9‘d0));)

这个信号控制着写FIFO内的数据是否传输到q引脚,所以sdram_wr_ack有效后,写FIFO的数据就会传输到q进而传输到与其相连的sys_data_in数据寄存器。由于进入了`W_WRITE状态,就会启动写数据模块sdram_wr_data,把数据送到SDRAM芯片的数据端口

(elseif((work_state == `W_WRITE) | ((work_state == `W_WD)&(cnt_clk <9‘d8)& (cnt_clk >= 9‘d0)))

sdr_din<=sys_data_in;)

(此状态完成一次后,进入等待状态IDEL,重新判断当前信息,如果满足,再次进入此状态,不满足此状态要求,进入其他状态)

-----------------------------------------------------------------------------------------------------------------------------------

再看地址线,在进入`W_WRITE状态时,我们是不知道此时addr已经计数到哪了,但是无论如何,到达`W_WRITE时,我们会把当前addr所形成的sys_addr的拆分成行,列数值数值传送到SDRAM的地址线上

(sdram_addr_r <= {

4‘b0010,

sys_addr[8:0]        };

在传送地址的同时,数据也就跟着写进去了!就这样不停的传送地址,直到地址线加满。我们往SDRAM中写数据的时代也就过了

(else if(addr == 22‘h3fffff)

wr_done <= 1‘b1)。

---------------------------------------------------------------------------------------------------------------------------------------

这个时候地线写满标志syswr_done被激活

(assign syswr_done = wr_done)

同时由于读FIFO储存器之中数据为0,也就激活了往读FIFO储存器中写数据的信号线sdram_rd_req

(assign sdram_rd_req = ((rdf_use <=9‘d256) & syswr_done))

此信号一有效,状态机即进入读SDRAM数据的状态`W_READ

(else if(sdram_rd_req &&sdram_init_done) begin

work_state_r <= `W_ACTIVE;//读SDRAM

sys_r_wn <= 1‘b1;

在此状态下,会激活读数据请求信号sdram_rd_ack

(assign sdram_rd_ack = (work_state_r ==`W_RD) & (cnt_clk_r >= 9‘d0) & (cnt_clk_r < 9‘d8);)

这个信号有效则会使地址线由0开始自加1

(else if(wr_done && neg_rdack)

addr <=addr+1‘b1;)//neg_rdack是sdram_rd_ack有效后产生的脉冲

同时送到SDRAM地址线(此状态完成一次后,进入等待状态IDEL,重新判断当前信息,如果满足,再次进入此状态,不满足此状态要求,进入其他状态)

(sdram_addr_r <= {

4‘b0010,                //A10=1,设置写完成允许预充电

sys_addr[8:0]        //列地址

};

也就是说每次这个状态来临时,SDRAM地址线会更新加1。相比于写数据的时候,读数据的时候,地址是连续的,相当于遍历一遍所有地址。每次SDRAM地址线更新后,SDRAM的数据总线上的数据就会更新。把此数据传递给串口发送模块

(else if((work_state == `W_RD) &(cnt_clk >=9‘d0) & (cnt_clk < 9‘d8))

sdr_dout <= sdram_data;        )

发给电脑上位机(关于串口发送模块,自行补脑)

时间: 2024-10-12 13:47:33

力战SDRAM(三)的相关文章

力战SDRAM(二)

前文中讲解了SDRAM的总体思想,以为有了例程,改了改一些时钟方面的问题就行了,然而烧录到自己的开发板上却不好使! (备注:特权例程所用飓风二代,我的是飓风四代,这点没有关系!主要的修改就是1.时钟频率不同25-48: 2.SDRAM芯片不同HY-winbond,结果是,我的是13位地址,他的是12位地址,也就是容量不同) 现象一:烧录成功后,串口显示程序出现FF,之后再无数据! 于是又是研读了一番程序,看了看自己的程序,没有发现可以更改的地方,只是把时钟,计数方面的修改的更为精准,继续烧录,现

力战SDRAM(一)

SDRAM的时序可以说比I2C通信更为复杂,除了要遵循严格的时序外,还要在每步操作前都要指定命令才行.而实现这个目的的核心就是状态机.我们先来了解一下 SDRAM的读写时序: 1.上电复位200us后进入预充电状态: 2.八次自刷新: 3.进入模式寄存器设置: 4.读写地址: 5.读写数据. 需要说明的是:1.读写地址和数据之间也要穿插一些其他的刷新命令,上面就不写了. 2.关于每个时序的原理,我也不做详细介绍,只说明两点: 1.每步操作都有个延时等待时间. 2.关于模式寄存器设置:SDRAM上

S3C2440的Linux启动过程分析(一)——SC2440处理器结构

1.1.     S3C2440处理器结构 S3C2440处理器的结构如下图所示,其核心单元为ARM9TDMI处理器核,主要包括16K的指令Cache和16K的数据Cache,以及分开的指令和数据MMU单元等.CP15为一个协处理器(Co-Processor).通过AMBA2.0(Advanced Microcontroller Bus Architecture)总线接口与外部设备相连. 图 1  S3C2440处理器框图 IVA指Instruction Virtual Address,指令虚拟

SDRAM 学习(三)之command

command 模块总述 SDRAM 的 command 模块的内容包括如下: 1.对初始化请求.配置模式寄存器.读/写.刷新.预充电等命令的一个优先级的控制. 2.将相应的命令进行解码即转化成相应的控制总线,转化依据如图1: 图1 代码详解 1.SDRAM 重要的参数 SDRAM 的容量为 4 * 1 M* 16 bit , 一共有 4 个 bank , 每个 bank 为 12 行.8列. 本次设计 SDRAM 为 顺序的突发读写模式.TCAS=3,TCL=3 . 我们将这些参数定义到 pa

实验三——SDRAM

一.运行环境 开发板:jz2440 系统:  ubuntu12.04 编译器:arm-linux-gcc 关于介绍性 的东西这里不说,以及2440的地址映射图什么的  ,有空再补充. 先看代码:这里主要有三个head.S  ,led.c ,Makefile,其中led的代码同流水灯一样,直接拷贝过来. 此外外,代码参考韦东山先生的源码,经过烧写可验证没问题. 二.直接贴代码 先看Makefile: 1 sdram.bin:head.S led.c 2 arm-linux-gcc -Wall -O

(三)内存 SDRAM 驱动实验

SDRAM 芯片讲解: 地址: 行地址 (A0-A12) 列地址 (A0-A8)    片选信号(BA0 BA1)(L-BANK)(因为SDRAM有 4片) 两片SDRAM 连线唯一区别在 UDQM LDQM DQM0 ---片1 LDQM DQM1----片1 UDQM DQM2----片2  LDQM DQM3---片2   UDQM ———————————————————————————————————————————————————————————— 1.读操作(见杨铸 121) 地址线

SDRAM和重定位(三)---icache的开启和关闭

这里只是简单的介绍下 icache,对于 icache和 dcache 以后有时间再去深入研究下.dcache 主要和虚拟内存管理(MMU)相关. 之所以会出现 cache,主要是为了解决 cpu 和 RAM之间的速度差异.通常来说 cpu 的主频很高速度非常快,但是内存ram的速度相对于cpu来说就慢了很多,这就导致系统整体的速度将会被拖慢. 为了解决这个问题,就在 cpu 和 ram 之间加入一层cache.cache的特点就是容量小,速度比ram快,价格高.这样先将 ram 中的内容放到

交换机开发(三)—— 深入分析三层网络交换机的原理和设计

引言 传统路由器在网络中起到隔离网络.隔离广播.路由转发以及防火墙的作业,并且随着网络的不断发展,路由器的负荷也在迅速增长.其中一个重要原因是出于安全和管理方便等方面的考虑,VLAN(虚拟局域网)技术在网络中大量应用.VLAN技术可以逻辑隔离各个不同的网段.端口甚至主机,而各个不同VLAN间的通信都要经过路由器来完成转发.由于局域网中数据流量很大,VLAN间大量的信息交换都要通过路由器来完成转发,这时候随着数据流量的不断增长路由器就成为了网络的瓶颈.为了解决局域网络的这个瓶颈,很多企业内部.学校

SDRAM 讲解(一)

mini2440的地址怎么分配.mini2440处理器的地址怎么分配.mini2440的处理器是S3C2440,理论上,S3C2440处理器可以使用的物理地址空间可以达到4GB,其中前1GB的地址(也就是0x0000 0000--0x4000 0000)为外设地址空间,还有一部分为CPU内部使用的特殊功能寄存器地址空间(地址范围为0x4800 0000--0x5FFF FFFF),其余的地址空间没有使用. 下面用两个表格说明外设地址空间好特殊功能寄存器地址空间 内存概念: 内存是代码的执行空间,