您当前的位置: 首页 > 

刘颜儿

暂无认证

  • 3浏览

    0关注

    99博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

02-SDRAM:自动刷新

刘颜儿 发布时间:2022-07-29 17:46:15 ,浏览量:3

SDRAM自动刷新模块

  1. cnt_7: 自动刷新是周期性的,因此需要时钟去重复计数,计满后就可以发出自动刷新请求信号给仲裁模块(依赖 init_end,计满清零)
  2. auto_ref_req: 传给仲裁模块的自动刷新请求信号,计数器加满拉高,得到内部应答后拉低(依赖计数器 cnt_7、auto_ref_ack)
  3. auto_ref_en:
  4. auto_ref_ack: 当状态跳转到预充电 ATREF_PRE,内部产生应答信号(依赖 ATREF_PRE)
  5. state
  6. cnt_cmd: 计数器,用来给2个等待时间计数 (依赖 cnt_cmd_reset)
  7. cnt_cmd_reset: 上一个计数器的清零信号 (依赖计满信号:trp_end、trfc_end)
  8. trp_end、trfc_end: 自家延时结束的信号(依赖 状态)
  9. cnt_ref: 自动刷新的次数,至少需要2次自动刷新(依赖状态 ATREF_AR 、 ATREF_IDLE)
设计文件
// SDRAM自动刷新模块
// 1. cnt_7:		自动刷新是周期性的,因此需要时钟去重复计数,计满后就可以发出自动刷新请求信号给仲裁模块(依赖 init_end,计满清零)
// 2. auto_ref_req:	传给仲裁模块的自动刷新请求信号,计数器加满拉高,得到内部应答后拉低(依赖计数器 cnt_7、auto_ref_ack)
// 3. auto_ref_en:		
// 4. auto_ref_ack:		当状态跳转到预充电 ATREF_PRE,内部产生应答信号(依赖 ATREF_PRE)
// 5. state
// 6. cnt_cmd:			计数器,用来给2个等待时间计数	 (依赖 cnt_cmd_reset)
// 7. cnt_cmd_reset:	上一个计数器的清零信号			 (依赖计满信号:trp_end、trfc_end)
// 8. trp_end、trfc_end: 自家延时结束的信号(依赖 状态)
// 9. cnt_ref:			 自动刷新的次数,至少需要2次自动刷新(依赖状态 ATREF_AR 、 ATREF_IDLE) 
module sdram_auto_ref(
	input 				    clk,
	input 				    rst_n,
	input 				    init_end,//初始化模块传入
	input 				    auto_ref_en,//仲裁模块传入,仲裁模块用来判断当前SDRAM是否可以自动刷新
	
	output reg    			auto_ref_req,//传给仲裁模块(要得到仲裁模块传来的刷新使能信号auto_ref_en才能开始自动刷新)
	output reg 	[3:0]		auto_ref_cmd,//SDRAM命令,组成{CS#,RAS#,CAS#,WE#}
	output   	[1:0] 		auto_ref_bank,//BANK地址,共4个BANK
	output   	[12:0]		auto_ref_addr,//SDRAM地址总线
	output      			auto_ref_end//初始化完成信号,初始化完成后拉高,其他时间保持低电平
);
//==========================================parameter===========================================================
//状态机
localparam	ATREF_IDLE = 3'b000,			//自动刷新初始状态
			ATREF_PRE  = 3'b001,			//预充电状态
			ATREF_TRP  = 3'b011,			//预充电等待状态
			ATREF_AR   = 3'b010,			//自动刷新状态
			ATREF_TRFC = 3'b110,            //自动刷新等待状态
			ATREF_END  = 3'b111;            //自动刷新结束状态
			
parameter 	MAX_CNT_700  = 12'd700;  //计算出来是 7812ns,但是仲裁模块需要时间去给出auto_ref_en,需要花费时间,因此这里使用7000ns
parameter 	MAX_REF_TIME = 2'd2;

//等待时间参数定义	
localparam	TRP  = 3'd2	,					//发送预充电指令后进行下一个操作需要等待的时间
			TRFC = 3'd7	;					//发送自动刷新指令后进行下一个操作需要等待的时间
			
//命令指令参数				
localparam 	PRECHARGE 	 = 4'b0010 , 		//预充电指令
			AT_REF   	 = 4'b0001 , 		//自动刷新指令
			NOP       	 = 4'b0111 ; 		//空操作指令
//==========================================reg=================================================================			
reg [5:0]   state;
reg [5:0]   next_state;
reg [3:0]   cnt_cmd;
reg [11:0]  cnt_7;//64_000/2^13=7.8125us,于是需要10ns的时钟计数7_00次
reg [1:0]   cnt_ref;
//==========================================wire=================================================================
wire auto_ref_ack;
wire trp_end;
wire trfc_end;
wire cnt_cmd_reset;

//==========================================assign=================================================================
// 内部应答信号
assign auto_ref_ack  = (state ==  ATREF_PRE) ? 1'd1:1'd0;
assign trp_end  	 = ((state == ATREF_TRP)  && (cnt_cmd == TRP-1)) ? 1'd1:1'd0;
assign trfc_end 	 = ((state == ATREF_TRFC) && (cnt_cmd == TRFC-1))? 1'd1:1'd0;
assign cnt_cmd_reset = ((state == ATREF_IDLE) || (state == ATREF_END) || trp_end || trfc_end) ? 1'd1:1'd0;

assign auto_ref_bank = 2'd11;
assign auto_ref_addr = 13'h1fff;
assign auto_ref_end  = (state == ATREF_END)?1'd1:1'd0;

//==========================================always=================================================================
// 自动刷新周期计数器
always@(posedge clk or negedge rst_n)begin
	if(!rst_n )begin
		cnt_7             
关注
打赏
1659364566
查看更多评论
0.0439s