打印
[FPGA]

MIG生成ddr2控制器,ddr2读数据混乱,但是是写入的数据,求解

[复制链接]
1696|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xiantingfeng 于 2014-3-7 22:17 编辑


Xilinx的ddr2 控制器出问题了,自己写的读写程序,很奇怪,读写256M的内存条,64位宽,突发长度为8。
设起始写地址为1,存连续的整数,如果读地址为1的话,读写的数据一样。
如果读地址为2,出现后面这种情况,2,3,1,4,6,7,8,5 。
如果起始地址为3,读的数据为3,4,1,2,7,8,5,6 。
是不是读写程序出问题了,求解。
N取32,burst_cnt,burst_cnt2 是存储的计数,wr_state是写数据的状态机,write_flag是(app_wdf_afull == 1) || (app_af_afull == 1)后中止写的标志位。写这些数据的时候,write_flag一直有效。
求解!
部分程序如下
                       
   if (burst_cnt2 < N+1)        begin
                        if (burst_cnt < N+1)        begin
                                if (write_flag == 1)        begin       
                                        if ((ram3_cnt != N+1) && (ram3_cnt != N+2))        begin
                                                ram3_cnt <= ram3_cnt + 2;
                                                app_af_cmd <= 3'b000;                app_wdf_wren <= 1;       
                                                wr_data_rise <= ram3_cnt + j_mti_N;            wr_data_fall <= ram3_cnt+1 + j_mti_N;
                                                case(wr_state)
                                                        1:        begin        app_af_wren <= 1;        wr_state <= 2;       
                                                                if (burst_cnt == 1)       
                                                                                app_af_addr <= 5242880 +1+{burst_cnt2,10'b0}-1024;
                                                                else        app_af_addr <= app_af_addr + 8;                end
                                                        2:        begin        app_af_wren <= 0;        wr_state <= 3;        end
                                                        3:        wr_state <= 4;
                                                        4:        begin        wr_state <= 1;        burst_cnt <= burst_cnt + 8;
                                                                if ((app_wdf_afull == 1) || (app_af_afull == 1))        begin
                                                                        write_flag <= 0;        // app_wdf_wren <= 0;        app_af_wren <= 0;       
                                                                end                end       
                                                endcase
                                        end
                                end
                                else        begin
                                        app_wdf_wren <= 0;        app_af_wren <= 0;
                                        if ((app_wdf_afull == 0) && (app_af_afull == 0))        begin
                                                write_flag <= 1;        wr_state <= 1; //wr_state <= state1;          
                                        end                                                               
                                end
                        end
                        else        begin
                                app_wdf_wren <= 0;                app_af_wren <= 0;       
                                burst_cnt2 <= burst_cnt2 + 1;
                                j_mti_N <= j_mti_N + 1024;//100;
                                burst_cnt <= 1;                ram3_cnt <= 1;
                        end
                end
                else        begin
                        if (app_af_afull==0) begin
                                if (burst_cnt3 < N+1)       
                                        if (burst_cnt3 == 1)       
                                                app_af_addr <= 5242880 +1;
                                        else
                                                app_af_addr <= app_af_addr + 8;
                                        app_af_cmd <= 3'b001;        app_af_wren <= 1;
                                        burst_cnt3 <= burst_cnt3 + 8;
                                end
                         end
                  end


相关帖子

沙发
greenapl1985| | 2014-4-1 23:24 | 只看该作者
楼主问题解决了?想问一下为何不直接看rd_data_fifo_out,而要看rise和fall呢?最近也在搞这一块,有问题想请教一下,我在使用chipscope看rd_data_fifo_out和rd_data_valid这两个信号时,发现即使rd_data_valid为低,rd_data_fifo_out也会有值,请问楼主知道原因吗?

使用特权

评论回复
板凳
xiantingfeng|  楼主 | 2014-4-9 10:12 | 只看该作者
greenapl1985 发表于 2014-4-1 23:24
楼主问题解决了?想问一下为何不直接看rd_data_fifo_out,而要看rise和fall呢?最近也在搞这一块,有问题想 ...

读地址低三位最好为0,不是任意地址开始的,读数据就是地址随后的8个数据,你可以上Xilinx的网站,搜Reading data is disordered when using ddr2 controller,这个是我提的问题,解决了。
rise和fall是实际写入的数据。
valid为低,out有输出,我在modelsim仿真中也看得,这个没影响,你可以用valid作为判断条件接收输出数据,要想弄清原因,可以看model.v文件。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

18

帖子

1

粉丝