代码库_SDRAM驱动HY57V2
代码库_SDRAM驱动_HY57V2
前言
SDRAM(Synchronous Dynamic Random Access Memory)是DRAM(Dynamic Random Access Memory)的一种,
“DRAM 芯片包括大量存储单元,每 个单元用电容保存 1 位的数据。每个存储单元还配有一个晶体管,它像一个开关一样让控制电路可以读或写这个电容的状态。由于电容和晶体管都极为微小,单个DRAM 芯片中可以放几百万个独立的存储单元。
由于电容会自己漏电,每个存储单元所保存的一位的数据的状态最终会消失, 除非这个电容上的电荷能周期性地被存储控制器所刷新。存储控制器通过读每个存储单元的状态然后再写回去来实现这个刷新。这正是动态 RAM得名的由来。”----The Zynq Book
S–Synchronous,同步,代表内部命名和数据(包括地址)的传输都在该同步时钟下进行,FPGA驱动时,SDRAM作为外设,时钟需要由FPGA产生。
本篇主要记录DQM掩码和刷新细节
README
接口
行列地址复用,A10为1:自动释放 0:手动释放,有2bit即4个bank,可以将bank地址与行地址拼接构成一整块存储空间,方便信号操作
掩码UDQM和LDQM
这是两种不同的输入控制管脚,分别控制读模式下数据的输出和写模式数据的输入,使用数据掩码技术可以屏蔽不需要的读出或写入数据,每8bit数据就会对应一个DQM控制管脚,所以16bit数据需要两个分别控制高、低字节,有个很好的使用场景:
没有DQM时,在执行写操作时,如果只想写8bit数据,但是由于数据总线是两个字节,写操作完成时,高字节也顺带的写入,于是高8bit数据就会被覆盖;读操作时反而没那么大影响,只要将不需要的字节与零“位与”,所以只需要注意写操作过程中的掩码信息,
那么,对于单字写,这个功能怎么实现呢?
控制模块向功能模块输入掩码信息,然后功能模块根据时序要求控制写操作,输出驱动掩码信号,
input [1:0] DQM_WR;
reg [1:0]rDQM;
else if( iCall[3] ) //读操作使能
case( i )
0: // Set IO to output State
begin isOut <= 1'b1; i <= i + 1'b1; end
1: // Send Active Command with Bank and Row address
begin rCMD <= _ACT; rBA <= iAddr[23:22]; rA <= iAddr[21:9]; i <= i + 1'b1; end
2: // wait TRCD
if( C1 == TRCD -1 ) begin C1 <= 14'd0; i <= i + 1'b1; end
else begin rCMD <= _NOP; C1 <= C1 + 1'b1; end
3: // Send Write command with row address, pull up A10 1 clk to Auto Precharge
begin
rCMD <= _WR;
rBA <= iAddr[23:22];
rA <= { 4'b0010, iAddr[8:0] };
rDQM <= DQM_WR;
i <= i + 1'b1;
end
... ...
endcase
assign S_DQ = isOut ? (DQM_WR[0]?iData[15:8]:(DQM_WR[1])?iData[7:0]:iData) : 16'hzzzz;
assign S_DQ = rDQM;
另外,需要特别注意,
刷新
–内容来源大西瓜FPGA blog
“由于SDRAM的内部结构特殊性,需要不断的进行刷新来保证数据不丢失。刷新操作和前面提到的预充电操作效果是一样的,都是对S-AMP进行操作(S-AMP可以理解为存储单元的放大器),预充电是没有随机的,在读写操作完成后进行,而刷新是有固定周期的,规定刷新周期不能超过64ms,也就是说,无论SDRAM的存储空间大小,都需要在64ms之内完成一次刷新,刷新是以行为单位操作的,刷新速率为:行数量/64ms,比如我们经常会看到4096 Refresh Cycles/64ms 或 8192 Refresh Cycles/64ms的标识,此处的4096和8192就是SDRAM单个L-Bank的行数,4096行时为15.625us,8192行时为7.8125us,
刷新有相应的指令,用户需要根据行的刷新时间来发出刷新指令,进行刷新操作;刷新操作分为两种:
(1)自动刷新(Auto Refresh,简称 AR):刷新操作不需要指定行地址,它需要对所有行进行刷新操作,刷新操作中不能进行其他操作,其他指令都得等待,PC133标准下,每次刷新占用9个时钟周期(133MHz的周期为7.51ns,9个时钟周期大约是67.7ns,可以看出,67.7ns 远远小于行时,留给其他指令操作的时间还是蛮多的);
(2)自刷新(Self Refresh,简称SR):主要用于休眠模式下的数据保存,当发出刷新指令,同时将CKE置为低电平就进入了SR模式,此时,SDRAM的所有外部信号都是无效的,而是根据内部的时钟进行刷新操作,CKE置为高电平时,就进入了正常模式。”
上一篇: spark-yarn提交任务
下一篇: Spark yarn模式任务提交