记录了SDRAM控制器进行初始化配置后的刷新模块。
SDRAM要进行不停地刷新保证数据的存在,因为SDRAM类似于电容,每次放电结束后数据都会丢失,所以要进行不断地刷新,刷新间隔为15us。
控制器状态从开始的idle状态到仲裁状态,在仲裁状态下进行刷新,读,写状态的跳转。
在仲裁状态下接收到刷新请求,发送刷新使能,状态转到刷新状态,当刷新结束后发送刷新结束标志,状态跳转到仲裁状态。
文档信息:
首先进行precharge命令,trp时间后进行auto refresh命令(20ns,1个周期),文档中要进行两次刷新才能进行act命令,但是实际上只用一次就行了。
在何种情况下进行刷新:
1.每个15us以后自动进行刷新
刷新状态会输出哪些信息:
1.输出刷新请求,仲裁阶段接收到刷新请求,仲裁同意刷新才可以刷新。
2.输出刷新结束,状态跳转回到仲裁
3.刷新命令command(cs,cas,ras,we)
4.addr(a0-a11),文档中显示A0-A9,A11,A12不关心。
根据文档编写代码:
输出:
ref_req:只有在每个15us拉高(每隔15us刷新一次)
flag_ref_end:刷新结束,当命令寄存器发送aref命令结束后拉高
cmd_reg:发送命令(precharge—cmd_cnt计数1和auto refcmd_cnt计数2)
ref_addr:A0-A11
内部变量:
falg_ref:在刷新阶段为高电平
ref_cnt_15us:计数15us,初始化结束后自动开始计数
cmd_cnt:首先是precharge,一个周期后aref,在刷新阶段内部开始计数(flag_ref为高)
module sdram_aref(
input sclk,
input srst,
//commmunicate with arbit
input ref_en,
output wire ref_req,
output wire flag_ref_end,
//others
input flag_init_end,
output reg [3:0] cmd_reg,
output wire [11:0] ref_addr
);
//==========================================================
//======= define parameter and internal signal