SDRAM自动刷新模块
- cnt_7: 自动刷新是周期性的,因此需要时钟去重复计数,计满后就可以发出自动刷新请求信号给仲裁模块(依赖 init_end,计满清零)
- auto_ref_req: 传给仲裁模块的自动刷新请求信号,计数器加满拉高,得到内部应答后拉低(依赖计数器 cnt_7、auto_ref_ack)
- auto_ref_en:
- auto_ref_ack: 当状态跳转到预充电 ATREF_PRE,内部产生应答信号(依赖 ATREF_PRE)
- state
- cnt_cmd: 计数器,用来给2个等待时间计数 (依赖 cnt_cmd_reset)
- cnt_cmd_reset: 上一个计数器的清零信号 (依赖计满信号:trp_end、trfc_end)
- trp_end、trfc_end: 自家延时结束的信号(依赖 状态)
- 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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?