强大的JTAG边界扫描(1):基本原理介绍
文章目录
- 1. 什么是边界扫描?
- 2. JTAG硬件接口
- 3. 边界扫描相关的软硬件
- 4. 学习资料
- 5. 总结
我是怎么了解到边界扫描的呢?
这就要从我淘到一块FPGA板卡的事情说起了。
前段时间我在某二手平台上淘了一块FPGA板子,它长这样:
板子的整体尺寸很小巧,和手掌差不多大,外设也很简单:
- 12v供电,带一个散热器
- FPGA芯片是Xilinx XC7K325T,FFG676封装,芯片等级2I,生产日期是2017年21周
- 4路LED
- 3路轻触按键,其中一路是Config
- 1路CAN接口(没有焊接CAN收发器和电平转换芯片)
- 1路USB串口,CP2102转换芯片
- 1颗Spansion 128Mb QSPI Flash S25F128
- 1颗有源差分时钟200MHz
- 标准2.54mm 14P下载接口
听卖家介绍说,这是之前挖矿盛行时,定制矿机中的一块HASH算力卡,主要功能是通过串口接收数据,FPGA计算出HASH值,再通过串口输出,由于工作频率较高,还外加了散热器,后来由于矿难,就把矿机中的板卡都处理掉了,遗憾的是没有留下任何软硬件资料。
好在价格比较便宜,只要150块,要知道仅一颗FPGA芯片的价格都不止150块。
板子买来之后,接上12v电源,板子正常点亮,JTAG口也是正常的,FPGA芯片也没有加密,可以下载调试,虽然没有DDR等大容量缓存,无法做一些复杂的运算,即使跑MicroBlaze也无法运行太大的程序,但是对于入门学习FPGA基本知识,比如LED按键驱动,串口,CAN总线,SPI接口,MicroBlaze SDK入门学习等等足够用了。
遗憾的是不知道芯片的管脚定义,最简单粗暴的方式是,使用热风枪先把FPGA芯片拆下来,然后通过万用表蜂鸣档来确定LED、串口等外设的管脚,这种方式风险极高,一旦拆下再装上,板子有很高的报废风险。
那么,有没有一种方式,在不破坏板子的情况下可以确定管脚定义呢?
经过一番搜索和问询,还真发现了一种方式,那就是JTAG边界扫描。
简单的理解,只要通过JTAG口就可以随意的读取或改变芯片的任意一个管脚状态。
比如要获取按键对应的管脚,只要用手按住和松开按键,然后通过边界扫描,查看FPGA哪个管脚的状态有变化即可确定;对于LED,虽然是输出方向,同样我们也可以把它当成输入,人为的通过跳线给定高或低电平,通过这种方式,串口管脚、CAN管脚,时钟管脚都可以一一确定。
下面,我将分几个部分,带领大家大致了解JTAG边界扫描,从JTAG边界扫描介绍、到上位机软硬件,再到基于MCU和FPGA的边界扫描实际应用。
1. 什么是边界扫描?
提到边界扫描,就不得不提JTAG,因为边界扫描是JTAG接口的功能之一。
JTAG,是Joint Test Action Group的简称,即联合测试行为小组。
JTAG,对于电子行业的工程师们来说再熟悉不过了,无论是搞单片机、ARM开发,还是FPGA、DSP开发,都离不开这个接口,它不仅可以进行程序下载,还能在线调试Debug,简简单单几根线就完成了如此强大的功能,大大的提高了开发效率。
但是,你知道吗?JTAG协议的设计初衷,并不是用来下载程序的。
JTAG中的’T’,是Test的缩写,没错!JTAG接口被设计之初,就是用来测试的!
上世纪90年代,集成电路、芯片设计产业开始迅速发展,同时,也面临着诸多问题:芯片管脚和晶圆之间的连接如何确定是正常的?芯片管脚之间是没有短路的?芯片被焊接到PCB板上之后,如何保证焊接是良好的,没有短路、开路?芯片外围的电路和与之互联的芯片是正常的呢?尤其是一些BGA封装的芯片,无法使用探针等方式来直接测量芯片的管脚。
面对这些问题,Philips、TI等半导体厂商在1985年成立了联合测试行动小组 ,即JTAG,用来解决这些问题。
尽管人们认为 IEEE 1149.1 标准实际上就是JTAG,不过该标准的官方称谓是“标准测试访问端口与边界扫描架构 (Standard Test Access Port and Boundary-Scan Architecture)”。它定义了利用边界扫描检测 PC 电路板的检测访问端口 (TAP) 等。
JTAG协议发展到现在,目前主要有三个典型应用:
-
程序下载。即目前最常用的一个功能,它可以把用户程序下载到芯片内部的Flash中。
-
程序调试。即实时监控程序的运动状态,并且可以通过加入断点的方式来实时调试程序。
-
边界扫描。即Boundary-scan,也就是JTAG设计的初衷,主要用于芯片本身和PCB电路板的硬件测试。
2. JTAG硬件接口
JTAG协议工作的基本逻辑全依赖内部的TAP控制器(Test Access Port),其实就是一个状态机,通过TMS信号来切换不同的状态。
标准的JTAG接口最少需要4个引脚,即:TCK、TDI、TDO和TMS,在IEEE1149.1标准中,TRST信号是可选的。
下面是每个信号的定义和功能:
- Test Clock Input (TCK)
TCK 为 TAP 的操作提供了一个独立的、基本的时钟信号,TAP 的所有操作都是通过这个时钟信号来驱动的。TCK 在 IEEE 1149.1 标准里是强制要求的。 - Test Mode Selection Input (TMS)
TMS 信号用来控制 TAP 状态机的转换。通过 TMS 信号,可以控制 TAP 在不同的状态间相互转换。TMS 信号在 TCK 的上升沿有效。TMS 在 IEEE 1149.1 标准里是强制要求的。 - Test Data Input (TDI)
TDI 是数据输入的接口。所有要输入到特定寄存器的数据都是通过 TDI 接口一位一位串行输入的(由 TCK 驱动)。TDI 在 IEEE 1149.1 标准里是强制要求的。 - Test Data Output (TDO)
TDO 是数据输出的接口。所有要从特定的寄存器中输出的数据都是通过 TDO 接口一位一位串行输出的(由 TCK 驱动)。TDO 在 IEEE 1149.1 标准里是强制要求的。 - Test Reset Input (TRST)
TRST可以用来对TAP Controller进行复位(初始化)。不过这个信号接口在IEEE 1149.1标准里是可选的,并不是强制要求的。因为通过 TMS 也可以对 TAP Controller 进行复位(初始化)。
以Jlink的JTAG接口为例,可以看到标准的4个JTAG管脚:
以下是JTAG接口的使用示意:
每个管脚都有一个边界扫描寄存器单元,在时钟的驱动下,每个管脚的信号在寄存器单元之间依次流动,从而实现每个管脚状态的控制和读取。
3. 边界扫描相关的软硬件
理论上只要支持JTAG协议的调试器、下载器,都可以用来进行边界扫描测试,不过可能需要开发相对应的上位机软件。
本文介绍常见的两款边界扫描测试方案。
- JLink + TopJTAG Probe
TopJTAG是一款非常简洁、实用的边界扫描测试软件,支持多种调试器,比如最常用的JLink、USB-Blaster等等。我会在后面的文章单独介绍这款软件配合Jlink来进行边界扫描测试。
- X-JTAG
一套非常专业的边界扫描方案,研发公司位于英国剑桥,包括调试器和上位机,功能极其强大,当然售价也不菲!广泛应用于航天、汽车、国防、医疗、通信等专业领域。
4. 学习资料
一位国外小哥在YouTube发布的视频:EEVblog#449-什么是JTAG以及边界扫描,B站有人搬运了,地址是:
https://www.bilibili.com/video/BV1TT4y1e7HU
还有一个是《ARM JTAG调试原理》文档,很精简,只有22页,可以对JTAG协议有个初步了解。
http://www.micetek.com.cn/technic/jtag.pdf
JTAG协议的官方文档JTAG_IEEE-Std-1149.1-2001:
https://fiona.dmcs.pl/~rkielbik/nid/JTAG_IEEE-Std-1149.1-2001.pdf
虽然不是最新版本的,但是对于学习JTAG协议的参考来说足够了。
5. 总结
对了,开头介绍的那款板卡,我使用边界扫描获取到的管脚定义如下:
####################################################################
# Copyright(C), 2010-2023, https://blog.csdn.net/whik1194
# ModuleName : top.xdc
# Date : 2023-03-04
# Time : 23:55:00
# Author : whik1194
# Function : Pin constraint
# Version : v1.0
# Version | Modify
# ----------------------------------
# v1.0 first version
####################################################################set_property PACKAGE_PIN AA10 [get_ports gclk_p]
set_property PACKAGE_PIN D9 [get_ports greset]
set_property PACKAGE_PIN D8 [get_ports key]
set_property PACKAGE_PIN G20 [get_ports led1]
set_property PACKAGE_PIN H19 [get_ports led2]
set_property PACKAGE_PIN E20 [get_ports led3]
set_property PACKAGE_PIN F19 [get_ports led4]set_property PACKAGE_PIN F8 [get_ports uart_rxd]
set_property PACKAGE_PIN F9 [get_ports uart_txd]
set_property PACKAGE_PIN G14 [get_ports can_rx]
set_property PACKAGE_PIN H14 [get_ports can_tx]set_property IOSTANDARD DIFF_SSTL12 [get_ports gclk_p]
set_property IOSTANDARD DIFF_SSTL12 [get_ports gclk_n]
set_property IOSTANDARD LVCMOS33 [get_ports greset]
set_property IOSTANDARD LVCMOS25 [get_ports led1]
set_property IOSTANDARD LVCMOS25 [get_ports led2]
set_property IOSTANDARD LVCMOS25 [get_ports led3]
set_property IOSTANDARD LVCMOS25 [get_ports led4]
set_property IOSTANDARD LVCMOS33 [get_ports key]
set_property IOSTANDARD LVCMOS33 [get_ports uart_rxd]
set_property IOSTANDARD LVCMOS33 [get_ports uart_txd]
set_property IOSTANDARD LVCMOS33 [get_ports can_rx]
set_property IOSTANDARD LVCMOS33 [get_ports can_tx]#QSPI set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design]
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design]
如果哪位朋友也买了这款板子,欢迎互相交流学习!
相关文章:

强大的JTAG边界扫描(1):基本原理介绍
文章目录 1. 什么是边界扫描?2. JTAG硬件接口3. 边界扫描相关的软硬件4. 学习资料5. 总结 我是怎么了解到边界扫描的呢? 这就要从我淘到一块FPGA板卡的事情说起了。 前段时间我在某二手平台上淘了一块FPGA板子,它长这样: 板子的…...

【C++】源文件.cpp和头文件.h分离编程
优势介绍 将C代码分为头文件(.h)和源文件(.cpp)的做法有以下几个好处: 模块化和代码组织:将函数和类的声明(包括函数原型、类的成员和属性等)放在头文件中,将函数和类的…...

报错ssh: Could not resolve hostname
…按照网上好多教程试了一下: 新建密钥,添加到gitee,重新测试。修改host,加入gitee的ip地址到里面去。修改.gifconfig配置文件,配置成ssh的仓库链接。 这上面的方法都不行,后面发现一篇文章:SS…...
从零开始学网站建设:从需求分析到上线发布
从零开始学网站建设:从需求分析到上线发布 一、需求分析 在进行网站建设之前,首先需要与客户进行沟通,了解客户的需求和要求,并进行深入的分析和研究。根据不同的需求,需要确定网站的类型、功能、布局、风格等方面的…...

软件系统验收测试需要注意的地方
验收测试 一、软件验收测试含义: 软件验收测试是指测试人员检验软件是否符合软件规格说明书和用户需求的测试活动。 验收测试是软件测试的最后一个环节,也是最为关键的一个要素。 它关系到软件开发公司的产品质量,也关系到需求方的产品能…...

解决three.js中加载纹理贴图时,初次渲染不显示的问题
效果: 解决方法:主要是将一些构建网格对象的操作放在了textureLoader.load()方法中,加载图片也用了require init() {// 1, 创建场景对象this.scene new this.$three.Scene();// 2, 创建立方缓冲几何体this.geometry new this.$three.BoxGe…...

Git学习记录
Contest 一、工作区域二、操作命令2.1 创建仓库2.2 查看仓库状态2.3 从工作区向暂存区添加文件2.3.1 只添加一个文件2.3.2 添加全部文件 2.4 从暂存区向仓库区添加文件2.5 查询日志2.5.1 从当前版本开始查询2.5.2 查看所有日志 2.6 回滚2.6.1 从仓库回滚到工作区2.6.2 取消工作…...

建筑模板木模好还是钢模好
在建筑施工中,模板是一项关键的工程,对于建筑结构的质量和施工效率起着重要作用。在选择模板材料时,木模和钢模都是常见的选择。本文将比较木模和钢模的优缺点,以帮助您做出明智的选择。 正文:一、木模:传统…...

写代码中碰到的错误
bind绑定类内成员导致 "no matching function for call to ..." 当bind绑定类内成员时,需要指明绑定的成员所在类的位置。 上面未指明Remove函数在哪个类中从而导致错误。 此外 bind 的函数指针类型是const类型的,都需要添加 const 修饰。 S…...
java文件传输简单方法
java文件传输简单方法 假设现在已经打包了一个文件(1233444333),要将这个文件传输给另一方: import java.io.*; public class F_PasswordUnPassword { public static void main (String[] args)throws Exception { ByteArrayOutp…...

Vue3后台管理系统Element-plus_侧边栏制作_无限递归
在home.view中添加代码 <template><div><div class"common-layout"><el-container><el-header class"common-header flex-float"><div class"flex"><img class"logo" src"../assets/logo…...
PCIe基础概念
《PCI_Exepress体系结构导读》《WDC databook》读书笔记 RCB read completion boundary MPS max payload size MRRS max read request size 4K对齐 Specifies the address page boundary size supported by the AXI bridge. No packet can have an address that crosses…...

GE IS220PVIBH1A 336A4940CSP16 数字输入模块
GE IS220PVIBH1A(336A4940CSP16)是一种数字输入模块,通常用于工业控制和自动化系统中,以将数字信号输入到PLC(可编程逻辑控制器)或其他控制系统中。以下是一些可能的产品特点和功能,但请注意&am…...

比特币与火人节
作者:Greg Cipolaro,NYDIG 全球研究主管 编译:WEEX 唯客 阅读提要: 灰度胜诉后市场缺乏后续动力,这告诉我们什么信号? ETF 不断涌现,但投资者似乎不太关心。 比特币和火人节:它们有何…...

Nginx 中 location 和 proxy_pass 斜杠/ 问题
location 的斜杠问题比较好理解,不带斜杠的是模糊匹配。例如: location /doc 可以匹配 /doc/index.html,也可以匹配 /docs/index.html。 location /doc/ 强烈建议使用这种 只能匹配 /doc/index.html,不能匹配 /docs/index…...

【Spring】开发框架Spring核心技术含Resource接口详细讲解
这里写目录标题 前言1. Spring简介2. Spring体系结构2.1 核心模块(Core Container)2.2 AOP模块2.3 数据访问集成模块(Data Access/Integration )2.4 Web模块 3. 初识Ioc与DI3.1 IoC控制反转和DI依赖注入3.2 常见的几种注入方法3.3 Spring的IoC例子3.4 Sp…...
【随想】每日两题Day.5 (实则一题)
题目:LeetCode 707.设计链表 你可以选择使用单链表或者双链表,设计并实现自己的链表。 单链表中的节点应该具备两个属性:val 和 next 。val 是当前节点的值,next 是指向下一个节点的指针/引用。 如果是双向链表,则还…...

【LeetCode刷题笔记】动态规划 — 70.爬楼梯
创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!! 主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步! 更多算法知识专栏:算法分析🔥 给大家跳段街舞感谢…...

2024腾讯校招后端面试真题汇总及其解答(三)
21【算法题】反转链表 题目: 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 示例 1: 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head = [1,2] 输出:[2,1]示例 3: 输入:head = [] 输出:[]提示: 链表中节点的数目范围是 [0, 5…...
mysql的分组group by
文章目录 一、介绍1、分组查询的内容2、多字段分组3、将查询内容连接group_concat4、有条件的分组查询having 一、介绍 将某个字段的相同值分为一组,分组查询的结果强调的是一个整体,每组内容只显示一行分组查询的内容一般要查询分组字段,因…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...