SDRAM的mode设置为CAS=2 为何实际却是CL=3出数据
SDRAM的mode设置为CAS=2 为何实际却是CL=3出数据研究了好几天都没结果,附上 signaltag抓取的图
请哪位大侠帮忙分析下是哪里的问题
为何第一个数据0102会持续延续3个周期,照道理在发送READ命令的时候假设为T0,那么应该在T1时刻出数据0102啊,
然后我尝试把mode的cas设置为3,结果却是CL=5出数据,附图
在T0时刻发送READ命令,结果却在T5时刻真正出现第一个0102数据,后面的0203 0304都是对的
在附一张BURST TERMINAL命令的图
datasheet上面说在读取的时候,burst terminal命令发送之后,其实还会传送CL个数据,结果却是传送了CL+1个数据
总结下来,即是说SDRAM实际设置的MODE里面的CAS跟实际 读取CL相差一个周期,虽然可以解决,但是原理上面讲不通
不知道哪位碰到过这样的问题, sdram用的是现代的 -6的模块 附上一段设置SDRAM的测试OK的代码,希望对你有帮助:
case(init_state_read)
PRECHARGE://100
begin
CMD <= PRECHARGE;
// o_test_pin_38 = 1'b0;
if(i_cmd_ack==1'b1)
begin
CMD <= NOP;
init_state_read <= LOAD_MODE;
// config_data <= 3'b000;//Burst=1
// config_data <= 3'b001;//Burst=2
// config_data <= 3'b010;//Burst=4
// config_data <= 3'b011;//Burst=8
config_data <= 3'b111;//Burst=page
config_data <= cl;//CL=3
end
else
init_state_read <= PRECHARGE;
end
LOAD_MODE://101
begin
ADDR <= config_data;
CMD <= LOAD_MODE;
if(i_cmd_ack==1'b1)
begin
CMD <= NOP;
init_state_read <= LOAD_REG2;
end
else
init_state_read <= LOAD_MODE;
end
LOAD_REG2://111
begin
ADDR <= refresh_cnt; //refresh counter=0x1d4
CMD <= LOAD_REG2;
config_data <= 23'd0;
if(i_cmd_ack==1'b1)
begin
CMD <= NOP;
ADDR <= 0;
init_state_read <= LOAD_REG1;
config_data <= cl;//3
config_data <= rc;//3
config_data <=pm_page;//pm_burst;//pm=1'b0;//SDR SDRAM control mode, 0=normal, 1=page mode
config_data <= bl_page;//bl_burst8;//parameter bl=4'd8;//burst length, valude=1,2,4,8
end
else
init_state_read <= LOAD_REG2;
end
LOAD_REG1://110
begin
ADDR <= config_data;
CMD <= LOAD_REG1;
if(i_cmd_ack==1'b1)
begin
CMD <= NOP;
ADDR <= 0;
config_data <= 23'd0;
main_state <= MAIN_STATE_READA;
init_state_read <= PRECHARGE;
end
else
init_state_read <= LOAD_REG1;
end
endcase ximuyi 发表于 2014-1-9 16:03
附上一段设置SDRAM的测试OK的代码,希望对你有帮助:
case(init_state_read)
PRECHARGE://100
你就直接告诉LZ原因好了。很简单,CL=2 SDRAM出数据,但是FPGA得花一周期读入,所以就变成CL=3了。 CL=2是从sdram 吐出data开始算大约2个cycle,到controller latch data还要经过板子delay,fpga pad delay,你要自己算controller的clock latch实际data的时间是在什么时候 谢谢楼上几位热心的回答,但是我感觉不是这个问题,另外有个问题比较疑惑,设计这类模块的时候,大家有没有在第一拍锁存数据,比如一个sdram模块,外部输入信号为wr_en信号和16位地址信号,大家在wr_en=1的时候,有没有锁存地址信号,这样外部调用的时候wr_en和地址信号只需要维持一个时钟周期就行了,,但是这样的话,第一拍必须锁存,这样的话,跟不锁存相比,就慢了一拍了,不知道大家有没有理解这个意思,因为如果是时序逻辑,必定慢一拍,但是如果用组合逻辑却可以实现不慢一拍,但是逻辑消耗感觉有比较大,不知道大家怎么处理的 也在学,你抓的图上面怎么没有clock啊,能再抓个带时钟的吗?最好有SDRAM的时钟和控制器的都带上,一起学习一下; sdram clk用的是100M,采样时钟也是100M,没法采,也不想再用pll生成200M的时钟去采样,
页:
[1]