对于sdram,这是掉电会使数据消失的存储器。是通过电容来工作的。sdram里面会有几个bank,每次存储数据的时候,先选bank地址,在进行对其中的行,和列来选则。
我们对于一个器件来说,了解使用说明手册,通过阅读,sdram需要设置初始化的,之后就是进行写,和读操作。但是对于这样掉电会消失的数据存储器,我们就需要对其中sdram,定时进行充电,这就是刷新。
对其中sdram是一个器件,于是我们需要在fpga上弄出一个SDRAM控制,让控制器,对它进行初始化,刷新,读和写。
要书写控制器,我们首先对它进行管脚的了解。
sdram_top(
//输入
sclk,//系统时钟
s_rst_n,//复位信号
//输出
sdram_clk,//输入给sdram的时钟
sdram_cke,//时钟使能,会掉电
sdram_cs_n,//片选信号
sdram_cas_n,//都是命令信号
sdram_ras_n,//都是命令信号
sdram_we_n,//都是命令信号
sdram_bank,//BA0,BA1,控制bank的地址
sdram_addr,//数据地址,a0到a11,row地址行地址,a0到a8,col地址列地址,a10控制auto—precharge。
sdram_dqm,//数据掩码,屏蔽数据地址的输出几位,ldqm,为高,会屏蔽低8bit,
//inout
sdram_dq//交互的数据
);
之后就是进行对于SDRAM的初始化,对于初始化,就是进行在要求的时序中,对其中命令信号输出要求的值
下面是我对其中命令的解释
localparam NOP = 4'b0111 ;
localparam PRE = 4'b0010 ;//给bank进行预充电,与A10,高是所有的bank打开关于bank的选择 a10是auto precharg的标志信号
localparam AREF = 4'b0001 ;//自动刷新
localparam MSET = 4'b0000 ;/*模式寄存器配置 对于地址的配置,其余的pre 和aref没有配置
a0,a1,a2,控制突发(触发)长度,给一个写命令或者读命令一次会给设置的长度,例如a2,a1,a0,010,就是连续写入读入4个数据。
a3,控制的是触发的类型读入写入是连续(0)还是不连续型(1)
a6,a5,a4,控制的潜伏期,针对读命令,会有相应的延迟,一般就是2(010),3(011)个周期,才会读出来
a7,a8,都是0
a9,触发读和触发写(0),或者是触发读和单个写(1)
ba0,ba0,a11,a10,都是0
*/
之后就是进行对其中刷新模块的书写。了解什么时候会掉电。对其中进行定义相应的请求。
之后就是进行对其中,写模块,读模块的书写,观看相应的SDRAM手册即可写好。
对其中不管是刷新,写模块,读模块。如何进行安排。
为啥要安排呢?
因为在程序在写模块的时候,sdram马上就要没电了,程序该如何执行,继续写?掉电后,数据全就没了,所以需要我们对其中的模块进行安排。
有一个仲裁模块,当刷新模块中,需要刷新时候,对仲裁模块,发送刷新请求,我们会在连续写完数据后进行执行刷新操作。
对这些模块的调配。我们需要很明显的状态机思想,先初始化,看仲裁模块怎莫说,之后进行状态调整。
对于sdram的时钟,一般sdram存储的数据使用的时钟都是高速的,与系统时钟不同,所以我们需要进行跨时钟领域的处理,这时候需要FIFO来处理。