协议学习:arm_dap
差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录前一修订版后一修订版 | 前一修订版 | ||
协议学习:arm_dap [2023/12/01 14:15] – [2. DPACC & APACC TDR] admin | 协议学习:arm_dap [2024/12/12 17:41] (当前版本) – [5. verilog example code] user01 | ||
---|---|---|---|
行 12: | 行 12: | ||
- | {{: | + | {{: |
===== - JTAG DP IR command | ===== - JTAG DP IR command | ||
- | {{: | + | {{: |
行 24: | 行 24: | ||
===== - DPACC & APACC TDR ===== | ===== - DPACC & APACC TDR ===== | ||
- | 通过DPACC TDR去访问DP | + | 通过DPACC TDR去访问DP register,通过APACC TDR去访问AP register \\ |
+ | 其定义如下: | ||
TDR length为35bit, | TDR length为35bit, | ||
TDI输入数据格式定义如下: | TDI输入数据格式定义如下: | ||
- | * bit[34: | + | * bit[34: |
* bit[2: | * bit[2: | ||
* bit[0] 表示读(1)或者写操作(0) | * bit[0] 表示读(1)或者写操作(0) | ||
TDO输出数据格式定义如下: | TDO输出数据格式定义如下: | ||
- | * bit[34: | + | * bit[34: |
- | * bit[2: | + | * bit[2: |
- | {{: | + | {{: |
- | {{: | + | {{: |
在操作APACC时,会发起对应的AP操作,一般分为AP写和AP读操作,以下是AP读需要注意的地方。 | 在操作APACC时,会发起对应的AP操作,一般分为AP写和AP读操作,以下是AP读需要注意的地方。 | ||
如果是AP读的话,需要再读一次TDR,但是如果IR还是指定为APACC的话,就会再触发一次AP操作,所以此时可以临时用IR切换为DPACC,这样读结果不会重新AP操作。 | 如果是AP读的话,需要再读一次TDR,但是如果IR还是指定为APACC的话,就会再触发一次AP操作,所以此时可以临时用IR切换为DPACC,这样读结果不会重新AP操作。 | ||
+ | |||
+ | 通过DP.RDBUFF将AP读数据取出。\\ | ||
+ | {{: | ||
===== - DP register summary ===== | ===== - DP register summary ===== | ||
- | {{: | + | {{: |
+ | |||
+ | SELECT:\\ | ||
+ | {{: | ||
行 113: | 行 120: | ||
repeat(len-1) begin | repeat(len-1) begin | ||
tck_cycle(1' | tck_cycle(1' | ||
- | shift_ret[i] = sample_tdo; | + | shift_ret[i] = sample_tdo; i = i+1; |
- | | + | |
end | end | ||
tck_cycle(1' | tck_cycle(1' | ||
+ | shift_ret[i] = sample_tdo; i = i+1; | ||
tck_cycle(1' | tck_cycle(1' | ||
tck_cycle(1' | tck_cycle(1' | ||
行 136: | 行 143: | ||
repeat(len-1) begin | repeat(len-1) begin | ||
tck_cycle(1' | tck_cycle(1' | ||
- | shift_ret[i] = sample_tdo; | + | shift_ret[i] = sample_tdo; i = i+1; |
- | | + | |
end | end | ||
tck_cycle(1' | tck_cycle(1' | ||
+ | shift_ret[i] = sample_tdo; i = i+1; | ||
tck_cycle(1' | tck_cycle(1' | ||
tck_cycle(1' | tck_cycle(1' | ||
行 152: | 行 159: | ||
input [7:0] ap_addr; | input [7:0] ap_addr; | ||
input | input | ||
+ | |||
+ | reg [7:0] ap_sel; | ||
begin | begin | ||
行 159: | 行 168: | ||
#1000; | #1000; | ||
// | // | ||
- | shift_dr(35, | + | |
+ | | ||
#1000; | #1000; | ||
行 182: | 行 192: | ||
input [7:0] ap_addr; | input [7:0] ap_addr; | ||
input | input | ||
+ | |||
+ | reg [7:0] ap_sel; | ||
begin | begin | ||
行 189: | 行 201: | ||
#1000; | #1000; | ||
// | // | ||
- | shift_dr(35, | + | |
+ | | ||
#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, | ||
- | // #1000; | ||
- | ahbap_write(8' | ||
- | ahbap_read(8' | ||
- | ahb_data = shift_ret[34: | ||
- | $display(" | ||
- | end | ||
- | endtask | ||
endmodule | endmodule |
协议学习/arm_dap.1701411359.txt.gz · 最后更改: 2023/12/01 14:15 由 admin