用户工具

站点工具


协议学习:arm_dap

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录前一修订版
后一修订版
前一修订版
协议学习:arm_dap [2023/12/01 14:20] zhangguo协议学习:arm_dap [2024/12/12 17:41] (当前版本) – [5. verilog example code] user01
行 24: 行 24:
  
 ===== - DPACC & APACC TDR ===== ===== - DPACC & APACC TDR =====
-通过DPACC TDR去访问DP & AP register, 其定义如下:+通过DPACC TDR去访问DP register,通过APACC TDR去访问AP register \\ 
 +其定义如下:
  
 TDR length为35bit, 低bit数据先传。 TDR length为35bit, 低bit数据先传。
行 45: 行 46:
  
 如果是AP读的话,需要再读一次TDR,但是如果IR还是指定为APACC的话,就会再触发一次AP操作,所以此时可以临时用IR切换为DPACC,这样读结果不会重新AP操作。 如果是AP读的话,需要再读一次TDR,但是如果IR还是指定为APACC的话,就会再触发一次AP操作,所以此时可以临时用IR切换为DPACC,这样读结果不会重新AP操作。
 +
 +通过DP.RDBUFF将AP读数据取出。\\
 +{{:协议学习:pasted:20241212-090848.png?nolink}}
  
  
行 50: 行 54:
  
 {{:协议学习:pasted:20231201-135514.png?nolink}} {{:协议学习:pasted:20231201-135514.png?nolink}}
 +
 +SELECT:\\
 +{{:协议学习:pasted:20241212-102752.png?nolink}}
  
  
行 113: 行 120:
         repeat(len-1) begin         repeat(len-1) begin
             tck_cycle(1'b0, data[i]);             tck_cycle(1'b0, data[i]);
-            shift_ret[i] = sample_tdo; +            shift_ret[i] = sample_tdo; i = i+1;
-            i = i+1;+
         end         end
         tck_cycle(1'b1, data[i]);         tck_cycle(1'b1, data[i]);
 +            shift_ret[i] = sample_tdo; i = i+1;
         tck_cycle(1'b1, 1'b0);         tck_cycle(1'b1, 1'b0);
         tck_cycle(1'b0, 1'b0); // rti         tck_cycle(1'b0, 1'b0); // rti
行 136: 行 143:
         repeat(len-1) begin         repeat(len-1) begin
             tck_cycle(1'b0, data[i]);             tck_cycle(1'b0, data[i]);
-            shift_ret[i] = sample_tdo; +            shift_ret[i] = sample_tdo; i = i+1;
-            i = i+1;+
         end         end
         tck_cycle(1'b1, data[i]);         tck_cycle(1'b1, data[i]);
 +            shift_ret[i] = sample_tdo; i = i+1;
         tck_cycle(1'b1, 1'b0);         tck_cycle(1'b1, 1'b0);
         tck_cycle(1'b0, 1'b0); // rti         tck_cycle(1'b0, 1'b0); // rti
行 152: 行 159:
     input   [7:0] ap_addr;     input   [7:0] ap_addr;
     input   [31:0] ap_data;     input   [31:0] ap_data;
 +
 +    reg     [7:0] ap_sel;
  
     begin     begin
行 159: 行 168:
     #1000;     #1000;
     //shift_dr(35, 35'h0); // 32b data, 2b A[3:2] (1:ctrl, 2:ap-sel, 3:read-buffer), 1b RnW (0:write)     //shift_dr(35, 35'h0); // 32b data, 2b A[3:2] (1:ctrl, 2:ap-sel, 3:read-buffer), 1b RnW (0:write)
-    shift_dr(35, {{8'h02,16'h0, ap_addr[7:4],4'h0} , 2'h2, 1'b0}); // ap_sel = select ahb-ap   (31:24 ap_sel, 7:4 ap_banksel)+    ap_sel = 8'h0; 
 +    shift_dr(35, {{ap_sel,16'h0, ap_addr[7:4],4'h0} , 2'h2, 1'b0}); // ap_sel = select ahb-ap   (31:24 ap_sel, 7:4 ap_banksel)
     #1000;     #1000;
  
行 182: 行 192:
     input   [7:0] ap_addr;     input   [7:0] ap_addr;
     input   [31:0] ap_data;     input   [31:0] ap_data;
 +
 +    reg     [7:0] ap_sel;
  
     begin     begin
行 189: 行 201:
     #1000;     #1000;
     //shift_dr(35, 35'h0); // 32b data, 2b A[3:2] (1:ctrl, 2:ap-sel, 3:read-buffer), 1b RnW (0:write)     //shift_dr(35, 35'h0); // 32b data, 2b A[3:2] (1:ctrl, 2:ap-sel, 3:read-buffer), 1b RnW (0:write)
-    shift_dr(35, {{8'h02,16'h0, ap_addr[7:4],4'h0} , 2'h2, 1'b0}); // ap_sel = select ahb-ap   (31:24 ap_sel, 7:4 ap_banksel)+    ap_sel = 8'h0; 
 +    shift_dr(35, {{ap_sel,16'h0, ap_addr[7:4],4'h0} , 2'h2, 1'b0}); // ap_sel = select ahb-ap   (31:24 ap_sel, 7:4 ap_banksel)
     #1000;     #1000;
  
行 261: 行 274:
 end end
  
-task ahb_read; 
-    input [31:0] ahb_addr; 
-    reg [31:0] ahb_data; 
-    begin 
-    //    // idcode 
-    //    shift_ir(4, 4'he); 
-    //    #1000; 
-    //    shift_dr(32, 32'h0); 
-    //    #1000; 
-        ahbap_write(8'h4, ahb_addr); 
-        ahbap_read(8'hc, 32'h0); 
-        ahb_data = shift_ret[34:3]; 
-        $display("ahb_read ret = %8h", ahb_data); 
-    end 
-endtask 
  
 endmodule endmodule
协议学习/arm_dap.1701411606.txt.gz · 最后更改: 2023/12/01 14:20 由 zhangguo

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki