SDRAM控制器设计(4)自动刷新&自刷新操作
程序员文章站
2022-04-01 23:37:48
...
ps: 刷新&预充电
刷新操作与预充电中重写的操作一样,都是用S-AMP先读再写。但为什么有预充电操作还要进行刷新呢?因为预充电是对一个或所有L-Bank中的工作行操作,并且是不定期的,而刷新则是有固定的周期,依次对所有行进行操作,以保留那些久久没有经历重写的存储体中的数据。但与所有L-Bank预充电不同的是,这里的行是指所有L-Bank中地址相同的行,而预充电中各L-Bank中的工作行地址并不一定是相同的。
1.自动刷新时序
刷新操作分为两种:自动刷新(Auto Refresh,简称AR)与自刷新(Self Refresh,简称SR)。
不论是何种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。
下图为SDRAM 自动刷新时序图
将刷新操作以任务的形式进行表示,便于在主状态机的多个地方执行该任务。由于刷新过程时序很明确,刷新任务的实现也采用线性序列机方法实现。
首先将刷新过程中几个需要操作发送命令的时刻进行本地参数表示
//自动刷新操作任务,采用线性序列机方法
localparam ref_PRE_TIME = 1'b1,
ref_REF1_TIME = REF_PRE+1,
ref_REF2_TIME = REF_PRE+REF_REF+1,
ref_END = REF_PRE+REF_REF*2;
对刷新过程中时钟进行计数
//自动刷新过程时间计数器
aaa@qq.com(posedge Clk or negedge Rst_n)
begin
if(!Rst_n)
ref_cnt <= 16'd0;
else if(ref_cnt == ref_END)
ref_cnt <= 16'd0;
else if(ref_req || ref_cnt>1'b0)
ref_cnt <= ref_cnt + 16'd1;
else
ref_cnt <= ref_cnt;
end
//自动刷新操作,线性序列机
task auto_ref;
begin
case(ref_cnt)
ref_PRE_TIME:begin
Command <= C_PRE; //预充电
Sa[10] <= 1'b1;
end
ref_REF1_TIME:begin
Command <= C_AREF; //自动刷新
end
ref_REF2_TIME:begin
Command <= C_AREF; //自动刷新
end
ref_END:begin
FF <= 1'b1;//退出任务标志位,1:退出任务;0:启动任务
Command <= C_NOP;
end
default:
Command <= C_NOP;
endcase
end
endtask
最后,对刷新操作完成和刷新过程进行标志,可用于其他信号的产生
//一次刷新操作完成标志位
aaa@qq.com(posedge Clk or negedge Rst_n)
begin
if(!Rst_n)
ref_opt_done <= 1'b0;
else if(ref_cnt == ref_END)
ref_opt_done <= 1'b1;
else
ref_opt_done <= 1'b0;
end
//一次突发写操作过程状态标识信号
reg ref_opt;
aaa@qq.com(posedge Clk or negedge Rst_n)
begin
if(!Rst_n)
ref_opt <= 1'b0;
else if(ref_req == 1'b1)
ref_opt <= 1'b1;
else if(ref_opt_done == 1'b1)
ref_opt <= 1'b0;
else
ref_opt <= ref_opt;
end
仿真略
上一篇: stm32学习笔记 串口usart