Vivado - JTAG to AXI Master (GPIO、HLS_IP、UART、IIC)

1. 简介

本文分享 JTAG to AXI Master IP Core 的使用教程。

此 IP 用于 AXI 接口向设计输入数据,或者读取数据。通过 Tcl 控制台编写命令来驱动此 IP,通过 JTAG 即可进行操作,而这个 IP 则在 AXI 端口上驱动 AXI 事务。由于这个核心没有自己的地址空间,它对所有从 JTAG 生成的 AXI 事务都是透明的。

与 Vivado 逻辑分析器一起,此 IP 可以用作 AXI 系统调试和测试工具。

IP Feature:

  • 最大工作频率为 200MHz
  • 协议支持:
    • AXI4
    • AXI4-Lite
  • 地址宽度: 32 位或者 64 位
  • ID 宽度支持最多四位,允许用户定义 ID 信号
  • AXI4-Lite 数据宽度为 32 位
  • AXI4 数据宽度为 32 位或者 64 位
  • 支持所有内存映射AXI接口事务,包括:
    • 突发类型 - INCR(增量)、FIXED(固定)和WRAP(环绕)
    • 突发长度:
      • 对于INCR和FIXED为1到256
      • 对于WRAP为2、4、8和16
  • 支持缓存信号
  • 硬件调试运行时 Tcl 控制台控制同时读/写操作

2. JTAG to AXI Master

2.1 添加 IP Core

1). 添加 JTAG to AXI Master v1.2 IP Core:

 

2). 下载 bitstream 后,可以看到该调试核: 

2.2 基本TCL命令

2.2.1 复位 JTAG-to-AXI Master

在创建并发出传输事务之前执行:

reset_hw_axi [get_hw_axis hw_axi_1]

2.2.2 创建并运行写入传输事务

create_hw_axi_txn                    \write_txn [get_hw_axis hw_axi_1]   \-type WRITE                      \-address 4000_0000               \-len 1                           \-data {12345678}                 \-forcerun_hw_axi [get_hw_axi_txns write_txn]
  • write_txn,用户定义的传输事务名称
  • [get_hw_axis hw_axi_1] ,返回 hw_axi_1 对象
  • -address 40000000 是起始地址
  • -len 1,会将 AXI 突发长度设置为 1 个字
  • -data {12345678},“-data” 为十六进制

2.2.3 创建并运行读取传输事务

create_hw_axi_txn                       \read_txn [get_hw_axis hw_axi_1]       \-type READ                          \-address 4000_0000                  \-len 1                              \-forcerun_hw_axi [get_hw_axi_txns read_txn]---
INFO: [Labtoolstcl 44-481] READ DATA is: 00000003
  • read_txn,用户定义的传输事务名称
  • [get_hw_axis hw_axi_1] ,返回 hw_axi_1 对象
  • -address 4000_0000 是起始地址
  • -len 1,会将 AXI 突发长度设置为 1 个字
  • INFO 为读取到的数据。

2.2.4 命令列表

| Tcl 命令             | 描述
|----------------------|------------------------------------------------------------------
| create_hw_axi_txn    | 创建硬件 AXI 传输事务对象。
| delete_hw_axi_txn    | 删除硬件 AXI 传输事务对象。
| get_hw_axi_txns      | 获取硬件 AXI 传输事务对象列表。
| get_hw_axis          | 获取硬件 AXI 对象列表。
| refresh_hw_axi       | 刷新硬件 AXI 对象状态。
| report_hw_axi_txn    | 报告已格式化的硬件 AXI 传输事务数据。
| reset_hw_axi         | 复位硬件 AXI 核状态。
| run_hw_axi           | 在对应 hw_axi 对象中运行硬件 AXI 读写传输事务并更新传输事务状态。

2.3 帮助信息

查看帮助信息

create_hw_axi_txn -help
---
Description: 
Create hardware AXI transaction objectSyntax: 
create_hw_axi_txn  [-address <arg>] [-data <arg>] [-size <arg>] -type <arg>[-len <arg>] [-burst <arg>] [-cache <arg>] [-id <arg>][-force] [-quiet] [-verbose] <name> <hw_axi>Returns: 
New hardware AXI transaction object.Usage: Name        Description-----------------------

2.4 创建TCL读写程序

2.4.1 Read proc

读取一个数据字长(DataBit = 32)。

proc read {address} {# 移除地址中的 "0x" 前缀(如果存在)和任何下划线set address [string map {"0x" "" "_" ""} $address]# 创建读事务create_hw_axi_txn -quiet -force rd_tx [get_hw_axis hw_axi_1] -address $address -len 1 -type readrun_hw_axi -quiet rd_tx# 在返回的数据上加上前缀 '0x'return 0x[get_property DATA [get_hw_axi_txn rd_tx]]
}

使用说明:

read 0x4000_0000
---
0x00000001

2.4.2 Write proc

写入一个数据字长(DataBit = 32)。

proc write {address value} {# 移除地址中的 "0x" 前缀(如果存在)和任何下划线set address [string map {"0x" "" "_" ""} $address]# 创建写事务create_hw_axi_txn -quiet -force wr_tx [get_hw_axis hw_axi_1] -address $address -data $value -len 1 -type writerun_hw_axi -quiet wr_tx
}

使用说明:

write 0x4000_0000 0x0000_0003

错误提示:

ERROR: [Labtoolstcl 44-224] Invalid option value 'wr_tx' specified for 'hw_axi_txns'.

原因:write 0x4000_0000 0x0000_00003,第二个参数为需要写入的数据,误打多了一位。更正后错误提示消失。

2.4.3 创建复杂过程

创建复杂过程,调用 2.4.2 Write proc 中定义的写过程,实现 LED 闪烁。

proc test_gpio {gpio_BA} {while {1} {write $gpio_BA 0x0000_0003after 1000write $gpio_BA 0x0000_0000after 1000}
}test_gpio 0x4000_0000

说明:

向 test_gpio 过程中传入gpio 基地址(Base Address)即可。

3. 示例

3.1 AXI-GPIO IP Core

3.1.1 寄存器描述

1)AXI GPIO 寄存器描述

| Address Space Offset | Register Name | Access Type | Default Value | Description
|----------------------|---------------|-------------|---------------|------------------------------------------
| 0x0000               | GPIO_DATA     | R/W         | 0x0           | Channel 1 AXI GPIO Data Register.
| 0x0004               | GPIO_TRI      | R/W         | 0x0           | Channel 1 AXI GPIO 3-state Control Register.
| 0x0008               | GPIO2_DATA    | R/W         | 0x0           | Channel 2 AXI GPIO Data Register.
| 0x000C               | GPIO2_TRI     | R/W         | 0x0           | Channel 2 AXI GPIO 3-state Control.
| 0x011C               | GIER          | R/W         | 0x0           | Global Interrupt Enable Register.
| 0x0128               | IP IER        | R/W         | 0x0           | IP Interrupt Enable Register (IP IER).
| 0x0120               | IP ISR        | R/TOW       | 0x0           | IP Interrupt Status Register.

2)AXI GPIO 三态寄存器描述

| Bits                | Field Name | Access Type | Reset Value          | Description
|---------------------|------------|-------------|----------------------|----------------------
| [GPIOx_Width-1:0]   | GPIOx_TRI  | Read/Write  | Default Tri State    |0 = output, 1 = input.

3.1.2 TCL 命令

见 2.2 基本TCL命令。

proc write {address value} {set address [string range $address 2 [expr {[string length $address]-1}]]create_hw_axi_txn -quiet -force wr_tx [get_hw_axis hw_axi_1] -address $address -data $value -len 1 -size 32 -type writerun_hw_axi -quiet wr_tx
}write 0x4000_0004 0x0000_0000 # 设置 GPIO 为输出
write 0x4000_0000 0x0000_0003 # 设置 GPIO 状态。

 

3.2 驱动 HLS IP

3.2.1 HLS IP

功能:使用 ap_ctrl_hs 协议,控制接口使用 AXI_Llite。

启动该 HLS IP 后,内部代码执行一次,即 led_state 翻转,并传递给 led 顶层接口。

#include <ap_int.h>void blink_counter(ap_uint<1> *led)
{
#pragma HLS INTERFACE mode=ap_none 	 port=led register
#pragma HLS INTERFACE mode=s_axilite port=returnstatic ap_uint<1> led_state = 0;led_state = ~led_state;*led = led_state;
}

* REGISTER
+-----------+---------+----------+
| Interface | Mode    | Bitwidth |
+-----------+---------+----------+
| led       | ap_none | 1        |
+-----------+---------+----------+* TOP LEVEL CONTROL
+-----------+------------+-----------+
| Interface | Type       | Ports     |
+-----------+------------+-----------+
| ap_clk    | clock      | ap_clk    |
| ap_rst_n  | reset      | ap_rst_n  |
| interrupt | interrupt  | interrupt |
| ap_ctrl   | ap_ctrl_hs |           |
+-----------+------------+-----------+

3.2.2 Block Design

1)构建 Block Design 原理图

2)配置 AXI 总线地址 

 

3.2.3 寄存器描述

// ==============================================================
// control
// 0x0 : Control signals
//       bit 0  - ap_start (Read/Write/COH)
//       bit 1  - ap_done (Read/COR)
//       bit 2  - ap_idle (Read)
//       bit 3  - ap_ready (Read/COR)
//       bit 7  - auto_restart (Read/Write)
//       bit 9  - interrupt (Read)
//       others - reserved
// 0x4 : Global Interrupt Enable Register
//       bit 0  - Global Interrupt Enable (Read/Write)
//       others - reserved
// 0x8 : IP Interrupt Enable Register (Read/Write)
//       bit 0 - enable ap_done interrupt (Read/Write)
//       bit 1 - enable ap_ready interrupt (Read/Write)
//       others - reserved
// 0xc : IP Interrupt Status Register (Read/COR)
//       bit 0 - ap_done (Read/COR)
//       bit 1 - ap_ready (Read/COR)
//       others - reserved
// (SC = Self Clear, COR = Clear on Read, TOW = Toggle on Write, COH = Clear on Handshake)

3.2.3 TCL 命令

烧写 bitstream 后,即可通过 TCL 命令控制该 HLS IP。

proc write {address value} {set address [string range $address 2 [expr {[string length $address]-1}]]create_hw_axi_txn -quiet -force wr_tx [get_hw_axis hw_axi_1] -address $address -data $value -len 1 -size 32 -type writerun_hw_axi wr_tx
}write 0x0000_0000 0x0000_0001

3.3 AXI UART Lite

3.3.1 Block Design

1)构建 Block Design 原理图

 2)配置 AXI 总线地址

3.3.2 AXI UART 寄存器描述

《DS741 - AXI UART Lite v1.02a》

| Offset (hex) | Register Name | Access Type | Default Value (hex) | Description                    |
|--------------|---------------|-------------|---------------------|--------------------------------|
| 0x0          | Rx FIFO       | Read        | 0x0                 | Receive data FIFO              |
| 0x4          | Tx FIFO       | Write       | 0x0                 | Transmit data FIFO             |
| 0x8          | STAT_REG      | Read        | 0x4                 | UART Lite status register      |
| 0xC          | CTRL_REG      | Write       | 0x0                 | UART Lite control register     |

Status Register (STAT_REG)

Control Register (CTRL_REG) 

 

3.3.3 TCL 命令

1)定义 TCL 过程

proc read {address} {# 移除地址中的 "0x" 前缀(如果存在)和任何下划线set address [string map {"0x" "" "_" ""} $address]# 创建读事务create_hw_axi_txn -quiet -force rd_tx [get_hw_axis hw_axi_1] -address $address -len 1 -type readrun_hw_axi -quiet rd_tx# 在返回的数据上加上前缀 '0x'return 0x[get_property DATA [get_hw_axi_txn rd_tx]]
}proc write {address value} {# 移除地址中的 "0x" 前缀(如果存在)和任何下划线set address [string map {"0x" "" "_" ""} $address]# 创建写事务create_hw_axi_txn -quiet -force wr_tx [get_hw_axis hw_axi_1] -address $address -data $value -len 1 -type writerun_hw_axi -quiet wr_tx
}# 定义一个过程 string2hex,输入参数为 s,作用是将字符串转换为十六进制格式
proc string2hex s {# 将字符串 s 转换为 UTF-8 编码,然后使用 binary scan 命令将其转换成十六进制字符串binary scan [encoding convertto utf-8 $s] H* hex# 使用 regsub 命令将连续的两个十六进制数字之间添加一个空格,以便于后续处理regsub -all (..) $hex {\1 }
}# 定义一个过程 print,输入参数为 UART 地址和 string,用于将字符串通过 UART 接口按字符发送
proc print {address string} {# 移除地址中的 "0x" 前缀(如果存在)和任何下划线set address [string map {"0x" "" "_" ""} $address]# 调用 string2hex 过程将字符串转换为十六进制,并去除前后空格,然后按空格分割成列表set hex_string [split [string trim [string2hex $string]] " "]# 遍历每个十六进制字符foreach char $hex_string {# 向 UART 接口写入数据,这里的写入命令为假设的 write,具体实现需根据实际情况调整write $address 000000$char# 每发送一个字符后暂停10毫秒after 10}
}

2)写入单个数据

0x48 对应的 ASCII 码为 'H':

write 0x4060_0004 0x0000_0048

 

3)读取单个数据

通过串口调试小助手,发送 'I',0x49。

分别在发送前后读取状态寄存器:

# 发送前
read 0x4060_0008
---
0x00000004
~~~~~~~~~~~~~~~~~~~~~
# 发送后
read 0x4060_0008
---
0x00000005

可以看到 Rx FIFO Valid Data 有效,即有数据到达。

读取数据:

read 0x4060_0000
---
0x00000049

4)发送字符串

print 0x4060_0004 "Hello"

3.4 AXI IIC IP Core

3.4.1 Block Design

1)构建 Block Design 原理图

 2)配置 AXI 总线地址

3.4.2 AXI IIC 寄存器描述

| Address Space Offset | Register Name   | Description                                              |
|----------------------|-----------------|----------------------------------------------------------|
| 01Ch                 | GIE             | Global Interrupt Enable Register                         |
| 020h                 | ISR             | Interrupt Status Register                                |
| 028h                 | IER             | Interrupt Enable Register                                |
| 040h                 | SOFTR           | Soft Reset Register                                      |
| 100h                 | CR              | Control Register                                         |
| 104h                 | SR              | Status Register                                          |
| 108h                 | TX_FIFO         | Transmit FIFO Register                                   |
| 10Ch                 | RX_FIFO         | Receive FIFO Register                                    |
| 110h                 | ADR             | Slave Address Register                                   |
| 114h                 | TX_FIFO_OCY     | Transmit FIFO Occupancy Register                         |
| 118h                 | RX_FIFO_OCY     | Receive FIFO Occupancy Register                          |
| 11Ch                 | TEN_ADR         | Slave Ten Bit Address Register                           |
| 120h                 | RX_FIFO_PIRQ    | Receive FIFO Programmable Depth Interrupt Register       |
| 124h                 | GPO             | General Purpose Output Register                          |
| 128h                 | TSUSTA          | Timing Parameter Register                                |
| 12Ch                 | TSUSTO          | Timing Parameter Register                                |
| 130h                 | THDSTA          | Timing Parameter Register                                |
| 134h                 | TSUDAT          | Timing Parameter Register                                |
| 138h                 | TBUF            | Timing Parameter Register                                |
| 13Ch                 | THIGH           | Timing Parameter Register                                |
| 140h                 | TLOW            | Timing Parameter Register                                |
| 144h                 | THDDAT          | Timing Parameter Register                                |

3.4.3 TCL 命令

4. 总结

  • JTAG to AXI Master 功能简介
  • 在 Vivado 中添加该 IP
  • 基本 TCL 操作命令
  • 三个示例
    • 通过 JTAG to AXI 控制 AXI GPIO
    • 通过 JTAG to AXI 控制 AXI IIC
    • 通过 JTAG to AXI 控制 HLS IP Core

参考列表:

1)UG908

Programming and Debugging (UG908)icon-default.png?t=O83Ahttps://docs.amd.com/r/en-US/ug908-vivado-programming-debugging/Hardware-System-Communication-Using-the-JTAG-to-AXI-Master-Debug-Core2)Xilinx Wiki - JTAG to AXI

Xilinx Wiki - JTAG to AXIicon-default.png?t=O83Ahttps://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/64488613/Using+the+JTAG+to+AXI+to+test+Peripherals+in+Zynq+Ultrascale

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1556257.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

oh-crop: OpenHarmony/HarmonyOS上的简单的图片剪裁库,可用于头像剪裁等常见场景。

&#x1f4da; 简介 oh-crop: OpenHarmony/HarmonyOS上的简单的图片剪裁库&#xff0c;可用于头像剪裁等常见场景。 代码仓库&#xff1a;oh-crop &#x1f4da; 下载安装 ohpm i xinyansoft/oh-cropOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考: 下载安装三方库…

六、Java 基础语法(下)

一、变量 1、变量的定义与使用 变量就是内存中的存储空间&#xff0c;空间中存储着经常发生改变的数据变量定义格式&#xff1a; 数据类型 变量名 数据值使用时根据变量名使用举例如下&#xff0c;上面是代码&#xff0c;下面是输出 2、变量的注意事项 变量名不允许重复…

系统分析师16:系统测试与维护

1 内容概要 2 软件测试类型 2.1 测试类型 动态测试【计算机运行】 白盒测试法&#xff1a;关注内部结构与逻辑灰盒测试法&#xff1a;介于两者之间黑盒测试法&#xff1a;关注输入输出及功能 静态测试【人工监测和计算机辅助分析】 桌前检查代码审查代码走查以上三个都是做的…

图解网络OSI模型与TCP/IP

一、OSI模型与TCP/IP 1、OSI模型 OSI/RM&#xff08;Open System Interconnection&#xff0c;开放系统互联参考模型&#xff09;是由ISO&#xff08;国际标准组织&#xff09;创建的一个有助于开放和理解计算机的通信模型&#xff0c;OSI七层参考模型作为一套规范的标准&…

端口冲突的解决方案以及SpringBoot自动检测可用端口demo

端口冲突的解决方案 端口冲突通常发生在尝试运行两个或多个应用程序或服务时&#xff0c;它们尝试使用同一个端口号&#xff0c;导致系统无法正确分配资源。 各种端口错误 你是否遇到过下面这些报错信息呢&#xff1f; Windows 系统报错&#xff1a; 系统错误 1004 套接字操作…

[C#]使用纯opencvsharp部署yolov11-onnx图像分类模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 使用纯OpenCvSharp部署YOLOv11-ONNX图像分类模型是一项复杂的任务&#xff0c;但可以通过以下步骤实现&#xff1a; 准备环境&#xff1a;首先&#xff0c;确保开发环境已安装OpenCvSharp和必…

初始项目托管到gitee教程,开箱即用

0.本地仓库与远程仓库关联&#xff08;需先在gitee创建仓库&#xff09; ①打开powershell生成ssh key ssh-keygen -t ed25519 -C "Gitee SSH Key"-t key 类型-C 注释 生成成功如下&#xff0c;并按下三次回车 ②查看公私钥文件 ls ~/.ssh/输出&#xff1a; id_…

PPPoE协议个人理解+报文示例+典型配置-RFC2516

个人认为&#xff0c;理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息&#xff0c;更加便于理解协议。 因此本文将在PPPoE协议报文的基础上进行介绍。 PPPoE协议发展 关于PPPoE基本原理&#xff0c;可参考1999年发布的《RFC2516-A Method fo…

大模型客服的未来发展趋势

在当今数字化时代&#xff0c;大模型客服正以惊人的速度改变着客户服务的格局。随着技术的不断进步&#xff0c;大模型客服的未来发展趋势充满了无限可能。随着人工智能技术的快速发展&#xff0c;智能客服领域正迎来一场前所未有的变革。大模型客服作为其中的重要分支&#xf…

32位机器上指针大小为什么是4字节?

&#xff08;1&#xff09;32位机器可寻址内存空间位4GB。为什么&#xff1f; 32位机器的总线宽度是32位&#xff0c;每一位可以是0或者1&#xff0c;那么32位可以表示个不同的值&#xff0c;也就是能寻址到个内存地址&#xff0c;每个内存地址对应一个内存单元&#xff08;1个…

RFID学习

24.10.5学习目录 一.简介1.组成2.RFID协议3.RFID卡 一.简介 RFID被称为无线射频识别&#xff0c;其是一种通信技术&#xff0c;通过无线电讯号耦合识别特定目标并读写相关数据&#xff1b; RFID主要位于典型物联网架构中的感知层&#xff0c;其因为具有非接触式特性&#xff…

hiricacp 连接池校验机制

一、背景 项目发生告警&#xff0c;但是并没有影响业务&#xff0c;看了下日志&#xff0c;红框里面有循环调用了3次 &#xff0c;一直以为是外部的重试在重试&#xff0c;但是外部确没有重试记录&#xff0c;就深扒了代码 二、想法 我知道hikaricp获取连接之后会校验连接的有…

k8s 之安装metrics-server

作者&#xff1a;程序那点事儿 日期&#xff1a;2024/01/29 18:25 metrics-server可帮助我们查看pod的cpu和内存占用情况 kubectl top po nginx-deploy-56696fbb5-mzsgg # 报错&#xff0c;需要Metrics API 下载 Metrics 解决 wget https://github.com/kubernetes-sigs/metri…

系统架构设计师⑦:企业信息化战略与实施

系统架构设计师⑦&#xff1a;企业信息化战略与实施 信息的概念及特点 信息的定义&#xff1a; ①香农:信息就是不确定性的减少。 ②维纳:信息就是信息&#xff0c;既不是物质&#xff0c;也不是能量。 信息的特点&#xff1a; ①客观性(真伪性):也叫事实性&#xff0c;不符…

【最新华为OD机试E卷-支持在线评测】简单的自动曝光(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

神经网络激活函数列表大全及keras中的激活函数定义

一、概述 在机器学习中&#xff0c;激活函数是神经网络中的一种函数&#xff0c;用于在神经网络的每个神经元中引入非线性。没有激活函数&#xff0c;神经网络就无法学习复杂的模式&#xff0c;因为线性变换的组合仍然是线性的。 在神经网络的每层中&#xff0c;将该层所有输…

设计模式之装饰器模式(Decorator)

一、装饰器模式介绍 装饰模式(decorator pattern) 的原始定义是&#xff1a;动态的给一个对象添加一些额外的职责。 就扩展功能而言&#xff0c;装饰器模式提供了一种比使用子类更加灵活的替代方案。 在软件设计中&#xff0c;装饰器模式是一种用于替代继承的技术&#xff0c;它…

【颜色平衡树 / E】

题目 思路 DFS暴力 60分 代码 #include <bits/stdc.h> using namespace std; const int N 5010; const int M 5010; int h[N], e[M], ne[M], idx; int c[N], f; int ans; void add(int a, int b) // 添加一条边a->b {e[idx] b, ne[idx] h[a], h[a] idx ; } …

Linux防火墙-常用命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令&#xff0c;我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…

C语言—单链表

目录 一、链表的概念及结构 二、单链表实现 &#xff08;2.1&#xff09;基本结构定义 &#xff08;2.2&#xff09;申请节点 &#xff08;2.3&#xff09;打印函数 &#xff08;2.4&#xff09;头部插入删除\尾部插入删除 &#xff08;2.4.1&#xff09;尾部插入 &…