Skip to content

openocd调试zynq7020

minichao9901 edited this page May 11, 2024 · 5 revisions

说明

板子用的是z7nano板子,ubuntu系统。确实是可以连上的。以前在windows环境下不能连上。

cfg文件(my.cfg)

source [find interface/ftdi/digilent_jtag_hs3.cfg]
source [find target/zynq_7000.cfg]
#source [find target/stm32h7x.cfg]

说明,可以用locate命令找到这2个文件的路径:

locate -r "openocd.*zynq"
locate -r "openocd.*ftdi"

image image

运行脚本(run)

openocd -f my.cfg

image

运行telnet调试

image image

运行程序自动生成的tcl脚本

image

sdk每次烧录程序,都会自动在这个路径生成一个.tcl文件。可以查看其中的内容,用source的方法执行。

关于tcl语法的基本介绍

Xilinx的TCL(Tool Command Language)脚本主要用于自动化FPGA设计流程中的各种任务,如项目的创建、约束文件的生成、综合、实现、时序分析等。TCL是一种动态类型的脚本语言,它具有以下一些常见语法:

  1. 注释:以#开头的行是注释,不会被执行。

    # 这是一个单行注释
  2. 变量:使用花括号{}来定义变量,变量名区分大小写。

    set my_variable "Hello, World!"
  3. 命令:TCL中的命令通常由单词组成,单词之间可以有空格分隔。

    create_project my_project my_project_dir
  4. 流程控制

    • if 语句:用于条件执行。

      if { $condition } {
        # Do something if condition is true
      }
    • foreach 循环:遍历列表中的每个元素。

      foreach item $list {
        # Do something with each item
      }
    • while 循环:在条件为真时重复执行代码块。

      while { $condition } {
        # Do something as long as condition is true
      }
  5. 函数:自定义的代码块,可以带参数。

    proc my_function { arg1 arg2 } {
      # Do something with arg1 and arg2
    }
  6. 文件操作:可以读取和写入文件。

    set file_handle [open "output.txt" "w"]
    puts $file_handle "Hello, World!"
    close $file_handle
  7. 列表:使用花括号定义列表,列表中的元素可以是任意TCL表达式。

    set my_list {item1 item2 item3}
  8. 数组:使用array命令创建数组。

    array set my_array { key1 value1 key2 value2 }
  9. 错误处理:使用catch命令捕获错误。

    catch {
      # Commands that may cause an error
    } error_result
  10. 字符串操作:可以使用字符串操作函数,如concat(连接字符串)。

    set result [concat "Hello" " " "World"]
  11. 正则表达式:TCL支持正则表达式。

    if {[regexp {^[a-zA-Z]+$} $string]} {
      # $string contains only letters
    }
  12. 项目特定的命令:Xilinx的TCL脚本通常与Vivado或ModelSim等工具结合使用,这些工具提供了自己的TCL命令集。

    read_verilog "my_design.v"
    synth_design

为了编写有效的Xilinx TCL脚本,你需要熟悉Xilinx提供的工具的特定命令和语法。你可以查阅Xilinx的官方文档,或者通过工具的帮助系统(通常通过在TCL命令行中输入help命令)来获取更多信息。此外,实践是最好的老师,尝试写一些简单的脚本来自动化你的设计流程,随着时间的推移,你将更加熟悉TCL脚本的编写。

在TCL中,并没有像C语言那样的内置for循环结构。相反,TCL使用for命令来实现循环,其基本语法如下:

for {set i 0} {$i < N} {incr i} {
    # 循环体中的代码
}

这里是一个具体的例子,假设N是一个已经定义的变量:

set N 10
for {set i 0} {$i < $N} {incr i} {
    puts "当前的i值是: $i"
}

在这个例子中,for命令初始化了一个名为i的变量,然后检查这个变量是否小于N。如果是,它将执行循环体内的代码块。每次循环结束后,incr i命令会增加i的值。这个过程会一直重复,直到i的值不再小于N

请注意,TCL中的变量是动态类型的,所以不需要事先声明变量的类型。此外,TCL中的命令和变量之间不需要使用分号(;)分隔,但在某些情况下,如命令列表或脚本块中,分号仍然用于分隔多个命令。

下面是一个综合的例子

#!/usr/bin/tclsh

# 定义一个变量
set greeting "Hello, World!"

# 打印变量
puts $greeting

# 条件语句
set user "Alice"
if { $user eq "Alice" } {
    puts "Hello, $user! Welcome back."
} elseif { $user eq "Bob" } {
    puts "Hello, $user! Long time no see."
} else {
    puts "Hello, $user!"
}

# 循环
set numbers [list 1 2 3 4 5]
foreach num $numbers {
    puts "The current number is: $num"
}

# 函数定义
proc printSquares { max } {
    for {set i 1} {$i <= $max} {incr i} {
        set square [expr {$i * $i}]
        puts "Square of $i is: $square"
    }
}

# 调用函数
printSquares 5

# 错误处理
set result [catch {
    puts "This will cause an error: [divide_by_zero]"
} error_message]

if { $result } {
    puts "An error occurred: $error_message"
}

# 字符串操作
set name "John"
set message "Greetings, $name! Your account has been activated."
puts $message

# 列表操作
set fruits [list "apple" "banana" "cherry"]
set fruits [linsert $fruits 0 "orange"]  ;# 在列表开头插入一个元素
puts "Fruits list after insertion: $fruits"

# 数组操作
array set user_info {
    name "Jane"
    age 30
    city "New York"
}
puts "User info: [array get user_info]"
Clone this wiki locally