原核经过修改控制SDRAM大小后,存在以下问题:
如在将写入SDRAM的时候,中间产生自动刷新操作,刷新操作正确执行,同时数据写入操作并未停止而继续进行,但由于控制核在进行刷新操作,数据未能经过
控制核正确输出并写入SDRAM中。
在原Xilinx
SDRAM控制器中ref_cntr.v文件中,对变量“rcount”进行监控,当“rcount”小于10时,通过控制核输出DO_REF信号为
‘1’。
SDRAM控制器输入接口(负责初始化控制器、将读写命令发送给控制核并控制进行读写工作,sdrm_c_interface.v文件)接收该
DO_REF信号并触发“do_cmd”变量为‘0’(do_cmd ==
0时不得进行读写操作),当DO_REF信号为‘1’时,始终不进行读写工作(do_cmd <=
0)。当控制核刷新命令已经经过处理,控制核将在7个时钟周期内进行刷新,此时DO_REF信号变为‘0’,注意,由于进入刷新过程而命令并未执行,此时
仍不可进行读写操作,在DO_REF信号变为‘0’后延迟25个时钟周期后,将“do_cmd”变量设置为‘1’(可以进行读写操作),则继续进行读写操
作。
========================================
sdrm_c_interface.v内修改代 码如下:
写数据开始判断条件内加入条件:do_cmd == 1,关系为&&(并且)
读数据开始判断条件内加入条 件:do_cmd == 1,关系为&&(并且)
添加部分控制代码于初始化、读、写操作的always前:
reg do_cmd;
reg [5:0] do_cmd_delay;
always @(posedge clk) //zts
begin
if(DO_REF == 1)
begin
do_cmd <= 0;
do_cmd_delay <= 1;
end
else if(do_cmd_delay != 0)
begin
if(do_cmd_delay == 25)
//保证refresh能成功完成
begin
do_cmd
<= 1;
do_cmd_delay <= 0;
end
else
begin
do_cmd_delay <= do_cmd_delay + 1;
do_cmd
<= 0;
end
end
else
begin
do_cmd <= 1;
do_cmd_delay <= 0;
end
end
---------------------------------------
ref_cntr.v 内修改代码如下:
添加于module末尾:
reg do_ref;
assign DO_REF = do_ref;
always @(rcount) //监控rcount变量
begin
if(rcount <=
10) //提前在刷新操作开始前多少时钟停止读写功能
//保证burst读写能将剩余数据读写完毕
do_ref
<= 1;
else
do_ref
<= 0;
end
========================================
以 上数据变量中(do_cmd_delay == 25、rcount <= 10)以仿真波形调整,其值与Load value
for Controller
MR值相关,即与burst_max、ref_max、ki_max、cas_lat_max、rcd_c_max均有关。