在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 1795|回复: 1

[求助] 关于xilinx MIG核使用

[复制链接]
发表于 2017-8-13 14:59:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本人用xilinx MIG核自带例程仿真DDR3程序可以实现数据读写,然后删除例程中traffic_gen_top模块,改成自己写的读写状态机,并把例程中的的ddr3_model连接到我的工程,MIG核初始化完成后,写入数据写到第16个数据时,MIG核的app_wdf_rdy信号就一直拉低,写不进去数。有没有仿真过的大神指点一下哪里有问题



  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date:    20:44:13 08/11/2017
  7. // Design Name:
  8. // Module Name:    my_ddr3_ctrl
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module my_ddr3_ctrl(
  22. input        wire                                 clk,
  23. input        wire                                 rst,
  24. input        wire                             memc_init_done,
  25. input        wire                                 memc_cmd_full,
  26. output        wire                                 memc_cmd_en,
  27. output        wire        [2:0]        memc_cmd_instr,
  28. output        wire        [31:0]                 memc_cmd_addr,
  29. output        wire                                 memc_wr_en,
  30. output        wire                                 memc_wr_end,
  31. output        wire        [31:0]                 memc_wr_mask,
  32. output        wire        [63:0]             memc_wr_data,
  33. input        wire                                 memc_wr_full,
  34. input        wire        [63:0]                 memc_rd_data,
  35. input        wire                                 memc_rd_data_valid,

  36. //fifo接口
  37. input        wire        [63:0]                        Din,
  38. input        wire                                        Din_valid,
  39. input        wire                                        IMG_OK,
  40. output        reg                                                Rd_fifo,
  41. output        wire                                        ddr3_rd_clk,

  42. output        wire                                        Dout_valid,
  43. output        wire                                        ddr3_wr_clk,
  44. output        reg                                                ddr3_read_finish,
  45. output        wire        [63:0]                        Dout
  46.     );
  47. parameter                BASE_ADDR  = 32'h0000_0000;

  48. parameter        READ_CMD                =        3'b000,
  49.                         WRITE_CMD                =        3'b001;
  50.                        
  51. parameter        IMG_SIZE                =        15'd16384;

  52. //写入DDR3操作
  53. parameter        WRITE_IDLE                        =        4'b0001,
  54.                         WRITE_READY                        =        4'b0010,
  55.                         WRITE_OPT                        =        4'b0100,
  56.                         WRITE_END                        =        4'b1000;
  57.                        
  58. parameter        READ_IDLE                        =        4'b0001,
  59.                         READ_READY                        =        4'b0010,
  60.                         READ_OPT                        =        4'b0100,
  61.                         READ_END                        =        4'b1000;

  62. reg                [3:0]        wr_cstate,wr_nstate;                       
  63. reg                [3:0]        rd_cstate,rd_nstate;

  64. reg                [14:0]        wr_data_cnt,rd_data_cnt;
  65. reg                [26:0]        wr_addr,rd_addr;
  66. reg                                wr_ddr3,rd_ddr3;
  67. reg                                ddr3_wr_busy,ddr3_rd_busy;
  68. reg                                wr_finish;

  69. assign  memc_cmd_instr = (wr_ddr3) ? WRITE_CMD : ((rd_ddr3) ? READ_CMD : 3'b111);
  70. assign  memc_cmd_en    = wr_ddr3 || rd_ddr3;

  71. assign  memc_cmd_addr = (wr_ddr3) ? wr_addr : rd_addr;

  72. assign        ddr3_rd_clk = clk;
  73. assign  ddr3_wr_clk = clk;

  74. assign        memc_wr_data=        Din;
  75. assign        memc_wr_en        =        Din_valid;
  76. assign        memc_wr_end        =        Din_valid;

  77. assign  Dout            =   memc_rd_data;
  78. assign  Dout_valid  =   memc_rd_data_valid;

  79. always @ (posedge clk or negedge rst) begin
  80.         if(~rst) begin
  81.                 wr_cstate        <= WRITE_IDLE;
  82.         end
  83.         else begin
  84.                 wr_cstate        <=        wr_nstate;
  85.         end
  86. end

  87. always @ ( * ) begin
  88.         case(wr_cstate)
  89.                 WRITE_IDLE : begin
  90.                         if(memc_init_done)                wr_nstate        =        WRITE_READY;
  91.                         else                                                wr_nstate        =        WRITE_IDLE;
  92.                 end
  93.                
  94.                 WRITE_READY : begin
  95.                         if(~memc_wr_full && ~memc_cmd_full && IMG_OK && ~ddr3_rd_busy)               
  96.                                  wr_nstate        =        WRITE_OPT;
  97.                         else wr_nstate        =        WRITE_READY;
  98.                 end
  99.                
  100.                 WRITE_OPT        : begin
  101.                         if(memc_wr_full || memc_cmd_full || ddr3_rd_busy)       
  102.                                 wr_nstate        =        WRITE_READY;
  103.                         else if(wr_data_cnt < IMG_SIZE)                wr_nstate        =        WRITE_OPT;
  104.                         else                                                                wr_nstate        =        WRITE_END;
  105.                 end
  106.                
  107.                 WRITE_END        : begin
  108.                         wr_nstate        = WRITE_END;
  109.                 end
  110.                
  111.                 default :  wr_nstate        =        WRITE_IDLE;
  112.         endcase
  113. end

  114. always @ (posedge clk or negedge rst) begin
  115.         if(~rst) begin
  116.                 wr_data_cnt                <= 0;
  117.                 wr_addr                        <= BASE_ADDR;
  118.                 Rd_fifo                        <= 0;
  119.                 wr_ddr3                        <= 0;
  120.                 wr_finish                <= 0;
  121.                 ddr3_wr_busy    <= 0;
  122.         end
  123.         else begin
  124.                 case(wr_nstate)
  125.                         WRITE_IDLE : begin
  126.                                 wr_data_cnt                <= 0;
  127.                                 wr_addr                        <= BASE_ADDR;
  128.                                 Rd_fifo                        <= 0;
  129.                                 wr_ddr3                        <= 0;
  130.                                 wr_finish                <= 0;
  131.                                 ddr3_wr_busy    <= 0;
  132.                         end
  133.                        
  134.                         WRITE_READY : begin
  135.                                 wr_data_cnt                <= wr_data_cnt;
  136.                                 wr_addr                        <= wr_addr;
  137.                                 Rd_fifo                        <= 0;
  138.                                 wr_ddr3                        <= 0;
  139.                                 wr_finish                <= 0;
  140.                                 ddr3_wr_busy    <= 0;
  141.                         end
  142.                        
  143.                         WRITE_OPT : begin
  144.                                 wr_data_cnt                <= wr_data_cnt + 1;
  145.                                 wr_addr                        <= wr_addr + 8;                                                //app端一次写BL=8个
  146.                                 Rd_fifo                          <= 1;
  147.                                 wr_ddr3                        <= 1;
  148.                                 wr_finish                <= 0;
  149.                                 ddr3_wr_busy    <= 1;
  150.                         end       
  151.                        
  152.                         WRITE_END : begin
  153.                                 wr_data_cnt                <= 0 ;
  154.                                 wr_addr                        <= BASE_ADDR;
  155.                                 Rd_fifo                        <= 0;
  156.                                 wr_ddr3                        <= 0;
  157.                                 wr_finish                <= 1;
  158.                                 ddr3_wr_busy    <= 0;
  159.                         end
  160.                                
  161.                         default : begin
  162.                                 wr_data_cnt                <= 0 ;
  163.                                 wr_addr                        <= BASE_ADDR;
  164.                                 Rd_fifo                        <= 0;
  165.                                 wr_ddr3                        <= 0;
  166.                                 wr_finish                <= 0;
  167.                                 ddr3_wr_busy    <= 0;
  168.                         end       
  169.                 endcase       
  170.         end
  171. end       

  172. //读取ddr数据
  173. always @ (posedge clk or negedge rst) begin
  174.         if(~rst) begin
  175.                 rd_cstate        <= READ_IDLE;
  176.         end
  177.         else begin
  178.                 rd_cstate        <=        rd_nstate;
  179.         end
  180. end       

  181. always @ ( * ) begin
  182.         case(rd_cstate)
  183.                 READ_IDLE : begin
  184.                         if(memc_init_done)                rd_nstate        =        READ_READY;
  185.                         else                                                rd_nstate        =        READ_IDLE;
  186.                 end
  187.                
  188.                 READ_READY : begin
  189.                         if(~memc_cmd_full && wr_finish && ~ddr3_wr_busy)       
  190.                                     rd_nstate        =        READ_OPT;
  191.                         else        rd_nstate        =        READ_READY;
  192.                 end
  193.                
  194.                 READ_OPT        : begin
  195.                         if(rd_data_cnt < IMG_SIZE)        rd_nstate        =        READ_OPT;
  196.                         else                                                rd_nstate        =        READ_END;
  197.                 end
  198.                
  199.                 READ_END        : begin
  200.                         rd_nstate        =        READ_END;
  201.                 end
  202.                
  203.                 default :  rd_nstate        =        READ_IDLE;
  204.         endcase
  205. end       


  206. always @ (posedge clk or negedge rst) begin
  207.         if(~rst) begin
  208.                 rd_addr                <= 0;
  209.                 rd_ddr3                <= 0;
  210.                 rd_data_cnt <= 0;
  211.                 ddr3_rd_busy <= 0;
  212.                 ddr3_read_finish<= 0;
  213.         end
  214.         else begin
  215.                 case(rd_nstate)
  216.                         READ_IDLE : begin
  217.                                 rd_addr        <= BASE_ADDR;
  218.                                 rd_ddr3        <= 0;
  219.                                 rd_data_cnt <= 0;
  220.                                 ddr3_rd_busy <= 0;
  221.                                 ddr3_read_finish        <= 0;
  222.                         end
  223.                        
  224.                         READ_READY : begin
  225.                                 rd_addr        <= rd_addr;
  226.                                 rd_ddr3 <= 0;
  227.                                 rd_data_cnt <= rd_data_cnt;
  228.                                 ddr3_rd_busy <= 0;
  229.                                 ddr3_read_finish        <= 0;
  230.                         end
  231.                        
  232.                         READ_OPT : begin
  233.                                 rd_addr        <= rd_addr +8;
  234.                                 rd_ddr3        <= 1;
  235.                                 rd_data_cnt <= rd_data_cnt + 1;
  236.                                 ddr3_rd_busy <= 1;
  237.                                 ddr3_read_finish        <= 0;
  238.                         end
  239.                        
  240.                         READ_END : begin
  241.                                 rd_addr        <= BASE_ADDR;
  242.                                 rd_ddr3        <= 0;
  243.                                 rd_data_cnt <= 0;
  244.                                 ddr3_rd_busy <= 0;
  245.                                 ddr3_read_finish        <= 1;
  246.                         end
  247.                        
  248.                         default : begin
  249.                                 rd_addr        <= BASE_ADDR;
  250.                                 rd_ddr3        <= 0;
  251.                                 rd_data_cnt <= 0;
  252.                                 ddr3_rd_busy <= 0;
  253.                                 ddr3_read_finish        <= 0;
  254.                         end
  255.                 endcase
  256.         end
  257. end       
  258. endmodule



复制代码

仿真图

仿真图
 楼主| 发表于 2017-8-15 13:04:11 | 显示全部楼层
从仿真图上看ddr_dp一直出的数据跟我写的数据不一样
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /3 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-24 14:31 , Processed in 0.022316 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表