AXI jtag2axi的tcl脚本控制法 - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

D1 可以在vivado中烧录bitstream,然后用tcl脚本来读写寄存器

jtag2axi_cmd.tcl脚本如下

# An highlighted block
set_param messaging.defaultLimit 50000

proc ReadReg { Addr } {
# puts "Start reading operation"
set address [format "0x%08X" $Addr]
set len 1
create_hw_axi_txn read_txn -force [get_hw_axis hw_axi_1] -type read \
-address $address -len $len
run_hw_axi [get_hw_axi_txns read_txn]
set read_proc [list [report_hw_axi_txn [get_hw_axi_txns read_txn]]];
set read_status_value [lindex $read_proc 0 1]
delete_hw_axi_txn [get_hw_axi_txns read_txn]
puts $read_status_value;
return $read_status_value;
}

proc WriteReg { Addr data} {
set len 1
set address [format "0x%08X" $Addr]
set data [format "0x%08X" $data]
create_hw_axi_txn -force write_txn [get_hw_axis hw_axi_1] -type write \
-address $address -len $len -data $data
run_hw_axi [get_hw_axi_txns write_txn]
delete_hw_axi_txn [get_hw_axi_txns write_txn]
}

proc WriteReg_N {Addr data length} {
    for {set i 0} {$i < $length} {incr i} {
        set new_address [expr $Addr + 4*$i]
        set new_data [expr $data + $i]
        WriteReg $new_address $new_data
    }
}

proc ReadReg_N {Addr length} {
    for {set i 0} {$i < $length} {incr i} {
        set new_address [expr $Addr + 4*$i]
        ReadReg $new_address
    }
}

# 定义 mrd 函数,根据参数数量选择调用 ReadReg 或 ReadReg_N
proc mrd {args} {
    set num_args [llength $args]

    if {$num_args == 1} {
        ReadReg [lindex $args 0]
    } elseif {$num_args == 2} {
        ReadReg_N [lindex $args 0] [lindex $args 1]
    } else {
        puts "Invalid number of arguments for mrd"
    }
}

# 定义 mwr 函数,根据参数数量选择调用 WriteReg 或 WriteReg_N
proc mwr {args} {
    set num_args [llength $args]

    if {$num_args == 2} {
        WriteReg [lindex $args 0] [lindex $args 1]
    } elseif {$num_args == 3} {
        WriteReg_N [lindex $args 0] [lindex $args 1] [lindex $args 2]
    } else {
        puts "Invalid number of arguments for mwr"
    }
}

# Example usage:
# WriteReg 0xC0000000 0x12345678
# ReadReg 0xC0000000
# WriteReg_N 0xC0000000 1 10
# ReadReg_N 0xC0000000 10

D2 仍然以jtag2axi控制cdma为例来说明

image

image

读写bram

image

控制led灯

image

读取sw状态

D3 连续写入N个,读出N个

image

D4 用tcl脚本驱动cdma,读写bram

WriteReg_N 0xC0000000 0x87654321 8
ReadReg_N 0xC0000000 8
WriteReg 0x44A00018 0xC0000000
WriteReg 0x44A00020 0xC0001000
WriteReg 0x44A00028 32
ReadReg_N 0xC0001000  8

image

结果ok

image

cdma完成后,再读一下cdma的寄存器配置确认ok。

待完成

tcl脚本是非常强大的。可以补充busrt_write, burst_read等内容。burst_write可以实现写入的序列是0,1,2,...自动递增的。这个是脚本容易实现的。