ddr3调试经验分享(四)——KC705_MIG_axi接口

  前面已经把DDR用app接口的方式控制住了,结果这个工程确要用microblaze。所以还要接到axi上。于是又来了一段苦逼的路程。

  要用axi控制ddr,先得把接口给弄清楚了,各个接口干嘛的。把mig上的axi接口全部复制出来。再一个个的查    

 

 1 // **************************************************************************************
 2 // *****************************  MIG  Interface     ************************************
 3 // **************************************************************************************
 4 //  output                ui_clk,
 5 //  output                ui_clk_sync_rst,
 6 //  output                mmcm_locked,
 7 //  input                 aresetn,
 8 //  input                 app_sr_req,               //    assign 0
 9 //  input                 app_ref_req,              //    assign 0 
10 //  input                 app_zq_req,             //  assign 0 
11 //  output                app_sr_active,
12 //  output                app_ref_ack,
13 //  output                app_zq_ack,
14 // Slave Interface Write Address Ports
15   input [3:0]           s_axi_awid, //写地址信号组的标记 
16   input [29:0]          s_axi_awaddr, // **************** 写地址
17   input [7:0]           s_axi_awlen, //猝发长度
18   input [2:0]           s_axi_awsize, //猝发大小
19   input [1:0]           s_axi_awburst,//猝发类型
20   input [0:0]           s_axi_awlock,//锁类型   00
21   input [3:0]           s_axi_awcache,//缓存类型 00
22   input [2:0]           s_axi_awprot,//保护类型 00
23   input [3:0]           s_axi_awqos, //优先级标志 0
24   input                 s_axi_awvalid,// *****************写地址有效
25   output                s_axi_awready,// *****************写地址准备完成信号,可接收对方写地址操作
26 // Slave Interface Write Data Ports
27   input [511:0]         s_axi_wdata, // ****************** 写数据
28   input [63:0]             s_axi_wstrb,//WSTRB 写选通,对于数据总线的每8bit有一个写选通。1: active
29   input                 s_axi_wlast, // ****************** 猝发中写最后一个数据
30   input                 s_axi_wvalid, // ***************** 写数据有效信号 
31   output                s_axi_wready, // ***************** 写数据准备完成信号,可接收对方写数据操作
32 // Slave Interface Write Response Ports
33   input                    s_axi_bready, //表示可接收响应信号
34   output [3:0]          s_axi_bid,  // 响应ID 
35   output [1:0]          s_axi_bresp,  // ******************* 写回应信号,2‘b00表示写成功
36   output                s_axi_bvalid, //  表示所要求的写响应是可用的
37 // Slave Interface Read Address Ports
38   input [3:0]           s_axi_arid, // 读地址ID 
39   input [29:0]             s_axi_araddr, // ********************* 读地址
40   input [7:0]           s_axi_arlen, //猝发长度
41   input [2:0]           s_axi_arsize, // 猝发大小 
42   input [1:0]           s_axi_arburst, //猝发类型 00:固定猝发,01:递增猝发 10:回卷猝发
43   input [0:0]           s_axi_arlock, //锁类型
44   input [3:0]           s_axi_arcache, //锁类型
45   input [2:0]           s_axi_arprot,  //保护类型
46   input [3:0]           s_axi_arqos, // 优先级标志 
47   input                 s_axi_arvalid, // ****************** 读地址有效
48   output                s_axi_arready,  // ****************  读地址准备信号
49 // Slave Interface Read Data Ports
50   input                 s_axi_rready,
51   output [3:0]          s_axi_rid,
52   output [511:0]        s_axi_rdata,
53   output [1:0]          s_axi_rresp, // ********************* 读回应信号,2’b00 表示读成功
54   output                s_axi_rlast,
55   output                s_axi_rvalid,
56 //  output                init_calib_complete,
57 //  output [11:0]       device_temp,
58   
59 //  input                sys_rst
60 
61 
62 /*
63 burst, //猝发类型 00:固定猝发,01:递增猝发 10:回卷猝发     
64 回卷猝发必须满足 1,开始地址必须对齐传输大小。2猝发长度必须是2.4.8.16 。大于16拍的猝发传输只支持INCR递增类型
65    在example中 
66     lock = 2'b0;
67     cache = 4'b0;
68     prot = 3'b0;
69     burst = 1   // lenth >16 采用递增型
70     size  = 6  // data with/8=64
71     
72      |    arsize/awsize   |     bytes in transfer
73      |____________________|__________________
74      |       000          |           1
75      |       001          |           2
76      |       010          |           4
77      |       011          |           8
78      |       100          |          16
79      |       101          |          32   
80      |       110          |          64
81      |       111          |         128
82      |--------------------|-------------------
83 */

 

 

用 // ************ 注释的信号      表示很清楚这个信号的作用

只有 // 注释的信号    表示用法有些模糊。不过这些信号在example中都给出了基本用法。  

 

最后是实现了写操作。log中显示确实按照我的要求写进去了,地址数据都正确。可是效率真的太差了

还有一点就是如果你的len是7,那么你就要给它传7+1=8个数,axi总线才会给响应。 开始我的程序就是这样的len设定为8,传了8个数等响应,死等等不来。

 

 

 

代码中写8个数据。从0地址开始存。写8个数据中间需要休息这么久? 还是我控制的有问题啊。

考虑还要不要用axi了

 

 

 

 

 

欢迎加入: FPGA广东交流群:162664354

      FPGA开发者联盟: 485678884

posted on 2017-05-24 12:19  清霜一梦  阅读(6418)  评论(0编辑  收藏  举报