oceanheart 发表于 2014-1-9 15:31:25

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的模块

ximuyi 发表于 2014-1-9 16:03:42

附上一段设置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

wye11083 发表于 2014-1-9 18:04:43

ximuyi 发表于 2014-1-9 16:03
附上一段设置SDRAM的测试OK的代码,希望对你有帮助:
case(init_state_read)
                                                        PRECHARGE://100


你就直接告诉LZ原因好了。很简单,CL=2 SDRAM出数据,但是FPGA得花一周期读入,所以就变成CL=3了。

ix1982 发表于 2014-1-9 20:13:23

CL=2是从sdram 吐出data开始算大约2个cycle,到controller latch data还要经过板子delay,fpga pad delay,你要自己算controller的clock latch实际data的时间是在什么时候

oceanheart 发表于 2014-1-9 21:12:36

谢谢楼上几位热心的回答,但是我感觉不是这个问题,另外有个问题比较疑惑,设计这类模块的时候,大家有没有在第一拍锁存数据,比如一个sdram模块,外部输入信号为wr_en信号和16位地址信号,大家在wr_en=1的时候,有没有锁存地址信号,这样外部调用的时候wr_en和地址信号只需要维持一个时钟周期就行了,,但是这样的话,第一拍必须锁存,这样的话,跟不锁存相比,就慢了一拍了,不知道大家有没有理解这个意思,因为如果是时序逻辑,必定慢一拍,但是如果用组合逻辑却可以实现不慢一拍,但是逻辑消耗感觉有比较大,不知道大家怎么处理的

jm2011 发表于 2014-1-10 09:52:51

也在学,你抓的图上面怎么没有clock啊,能再抓个带时钟的吗?最好有SDRAM的时钟和控制器的都带上,一起学习一下;

oceanheart 发表于 2014-1-10 22:45:35

sdram clk用的是100M,采样时钟也是100M,没法采,也不想再用pll生成200M的时钟去采样,
页: [1]
查看完整版本: SDRAM的mode设置为CAS=2 为何实际却是CL=3出数据