欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SDRAM控制器设计(4)自动刷新&自刷新操作

程序员文章站 2022-04-01 23:37:48
...

ps: 刷新&预充电
刷新操作与预充电中重写的操作一样,都是用S-AMP先读再写。但为什么有预充电操作还要进行刷新呢?因为预充电是对一个或所有L-Bank中的工作行操作,并且是不定期的,而刷新则是有固定的周期,依次对所有行进行操作,以保留那些久久没有经历重写的存储体中的数据。但与所有L-Bank预充电不同的是,这里的行是指所有L-Bank中地址相同的行,而预充电中各L-Bank中的工作行地址并不一定是相同的。

SDRAM控制器设计(4)自动刷新&自刷新操作

1.自动刷新时序

刷新操作分为两种:自动刷新(Auto Refresh,简称AR)与自刷新(Self Refresh,简称SR)。
不论是何种刷新方式,都不需要外部提供行地址信息,因为这是一个内部的自动操作。

下图为SDRAM 自动刷新时序图
SDRAM控制器设计(4)自动刷新&自刷新操作

将刷新操作以任务的形式进行表示,便于在主状态机的多个地方执行该任务。由于刷新过程时序很明确,刷新任务的实现也采用线性序列机方法实现。

首先将刷新过程中几个需要操作发送命令的时刻进行本地参数表示

//自动刷新操作任务,采用线性序列机方法
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

仿真略

相关标签: FPGA sdram fpga