FPGA的调试-虚拟JTAG

article/2025/10/25 22:17:03

对于FPGA调试,主要以Intel FPGA为例,在win10 Quartus ii 17.0环境下进行仿真和调试,开发板类型EP4CE15F17。主要包括一下几个部分:

- FPGA的调试-虚拟JTAG(Virtual JTAG)

- FPGA的调试-在线存储器内容编辑工具(In-system Memory Content Editor)

- FPGA的调试-内嵌逻辑分析仪(SignalTap)

- FPGA的调试-LogicLock

- FPGA的调试-调试设计的指导原则

上述内容主要参考《通信IC设计》,有兴趣的可以自己购买书籍进行研读。

FPGA的调试-虚拟JTAG

1.功能及简介

  虚拟JTAG(xilinx也有类似的工具,但是不知道叫什么名字 囧 )就是利用FPGA自身的JTAG口建立对设计课件的调试手段,只要通过例化虚拟JTAG模块,就能通过FPGA器件本身的JTAG引脚对FPGA中的CPU或者逻辑进行调试。
  虚拟JTAG的核心包括两部分:(1)直接在HDL代码中例化SLD_VIRTUAL_JTAG宏功能,使FPGA器件的JTAG接口能够访问FPGA设计指定的部件或者接口信号;(2)通过TCL控制界面以及Quartus_stp.exe接口,实现数据读写操作。其中第二部分还可以利用启动Quartus_stp.exe
端口映射实现基于虚拟串口的调试(可以绕过Quartus_stp.exe,直接对VJTAG操作的方法,具体参见github上的open-sld项目)。虚拟JTAG功能与FPGA本身的SIgnal-TAP以及JTAG下载是并行时分复用的。
  虚拟JTAG可以通过TCL脚本在线地把PC机的数据写入到FPGA内部或者从FPGA内部读出并传到PC机。这样,在调整算法参数(如PID的参数整定)的时候,无需多次综合。此外,只要你会用TCL的TK图形库,就能利用虚拟JTAG做上位机。


这部分是特权同学介绍的:传送门

  这一篇博文里将介绍基于Virtual JTAG的调试方法。对于Virtual JTAG,特权同学也很陌生,在这之前只记得riple兄的博客公告里有一句“Virtual JTAG是一个非常实用的工具,希望更多的朋友把它用起来”。一直以来对tcl不是很熟悉(找了不少资料,但是一直没好好静下心来学习),对Virtual JTAG也不是很熟悉。不过借着这次机会,特权同学好好感受了回Virtual JTAG的很好很强大。

  关于Virtual JTAG的资料,特权同学主要还是参考了官方的一些文档:

  • ug_virtualjtag.pdf【Virtual JTAG Megafunction User Guide】
  • AN 39_ IEEE 1149.1 (JTAG) Boundary-Scan Testing in Altera Devices
    (PDF) .pdf

      当然,英文看得一头雾水找不到眉目的时候,google一下,最终还是riple兄的数篇关于Virtual JTAG的文章(http://blog.ednchina.com/riple/10862/category.aspx)帮了我很大忙。这里要表示感谢,因为在网络上有很多很多像riple兄这样无私的人,才让我们的学习变得简单了。

      这个Virtual JTAG确实也不算什么新奇玩意,可以简单的理解,它和特权同学项目日志2里提到的利用串口来调试的方法思路是一致的。只不过相对于使用Altera支持Virtual JTAG器件的用户来说,如果掌握了这个调试方法,可以省却很多时间和精力(当然也包括额外调试用外设的考虑)。从硬件框图上来理解这个东西,可以如图1所示。和PC机连接只有使用现有的FPGA的JTAG端口,不需要任何额外的电路,这就是它最大的优势。另外,在我们原有的工程中例化一个Virtual JTAG的IP核,利用这个IP核给出的接口来传输数据即可。用户要做的主要任务就是设计符合传输协议的逻辑,适时的将数据接收进来或者传输出去。这一点上和之前提到的串口方法类似。但是,在PC端,用户就可以利用Quartus II提供的tcl支持来定制化自己需要的处理方式。

这里写图片描述

2.简单实例

这部分是一个简单的例子,主要参考一篇博客:传送门

(0).新建工程

选好路径,设置好工程名及芯片类型。

(1).新建一个虚拟JTAG的IP核

1.Tools —>IP Catalog

这里写图片描述

2.搜索 vir ,找到Altera Virtual JTAG

这里写图片描述
PS:点击进去以后,貌似Quartus 13是这样的页面:
这里写图片描述
下图这一步是设置仿真激励,目前我们不需要仿真,可以直接点finish,生成IP核。
这里写图片描述
但是17.0时进入QSYS中进行设置,生成的IP貌似没区别,没有对比过,无法得出结论,继续。

3.设置Entity 名字—-> OK

这里写图片描述

4.设置相关参数
建议手动设定虚拟JTAG的索引号(index),这里设为0,记住索引号,后面有用。如下图所示。
这里写图片描述
5.Generate—->Generate HDL

这里写图片描述

6.进入如下页面,其中.bsf文件是原理图设计时的Symbol,建议勾选上。
这里写图片描述

7.成功

这里写图片描述

(2).建立Verilog文件,代码如下。注意例化时的名称

在这之前需要将上一步制作的IP核添加到工程中,上诉工程结束时,会在工程文件夹下有个与IP名称相关的文件夹,在文件夹下有个synthesis文件夹,里面就是IP核。具体如下
这里写图片描述
vjtag.v代码

module vjtag (
input clock,
output reg [7:0] my_counter='b0
);always @ (posedge clock)if (load && e1dr)     // decode logic: used to load the counter my_countermy_counter <= tmp_reg;elsemy_counter <= my_counter;// Signals and registers declared for VJI instance
wire tck, tdi;
reg tdo='b0;
wire cdr, eldr, e2dr, pdr, sdr, udr, uir, cir;
wire ir_in;// Instantiation of VJI
vjtag_inst my_vji(
.tdo (tdo),
.tck (tck),
.tdi (tdi),
.tms(),
.ir_in(ir_in),
.ir_out(),
.virtual_state_cdr (cdr),
.virtual_state_e1dr(e1dr),
.virtual_state_e2dr(e2dr),
.virtual_state_pdr (pdr),
.virtual_state_sdr (sdr),
.virtual_state_udr (udr),
.virtual_state_uir (uir),
.virtual_state_cir (cir)
);// Declaration of data register
reg [7:0] tmp_reg='b0;// Deocde Logic Block
// Making some decode logic from ir_in output port of VJI
wire load;
assign load = ir_in;// Bypass used to maintain the scan chain continuity for
// tdi and tdo ports
reg bypass_reg='b0;
always @ (posedge clock)bypass_reg <= tdi;// Data Register Block
always @ (posedge tck)
if ( load && sdr )tmp_reg <= {tdi, tmp_reg[7:1]};// tdo Logic Block
always @ (*)if(load)tdo <= tmp_reg[0];elsetdo <= bypass_reg;endmodule

(3).分配引脚,综合,调用SignalTAP,采集my_counter信号,再综合下载代码。

这里写图片描述

(4).在上面的工程目录下,新建一个TCL脚本,这里是VJTAG.tcl。代码如下。

VJTAG.tcl

# exec "D:\\altera\\13.0sp1\\quartus\\bin64\\quartus_stp.exe" "-t" "G:\\WorkDir\\ProAltera\\ProAVerilog\\vjtag\\vji_ctl.tcl"set usb [lindex [get_hardware_names] 0]
set device_name [lindex [get_device_names -hardware_name $usb] 0]proc push {value} {global device_name usbif {$value > 256} {return "value entered exceeds 8 bits" }open_device -device_name $device_name -hardware_name $usbset push_value [int2bits $value]set diff [expr {8 - [string length $push_value]%8}]if {$diff != 8} {set push_value [format %0${diff}d$push_value 0]}puts -nonewline "push value : "puts $push_valuedevice_lock -timeout 10000device_virtual_ir_shift -instance_index 0 -ir_value 1device_virtual_dr_shift -instance_index 0 -dr_value $push_value -length 8device_unlockclose_device
}proc int2bits {i} {set res ""while {$i>0} {set res [expr {$i%2}]$resset i [expr {$i/2}]}if {$res==""} {set res 0}return $res
}push 3

(5).在Quartus里,调出TCL控制台。

这里写图片描述
因为Quartus17.0的TCL控制台有bug,不能载入::quartus::project包,所以不能直接在TCL控制台使用该包的命令(如quartus_stp -t a.tcl,会出错),于是,这里使用exec命令,间接调用quartus_stp命令。(网上的例子多数用的是老版本的Quartus,可以载入::quartus::project包,也可以直接使用quartus_stp -t a.tcl命令)

在TCL控制台中,使用

 exec "E:\\intelFPGA\\17.0\\quartus\\bin64\\quartus_stp.exe" "-t" "G:\\USE\\FILE\\FPGA\\001_TEST\\VJTAG.tcl"

E:\intelFPGA\17.0\quartus\bin64\ , 是我的quartus的安装目录,G:\USE\FILE\FPGA\001_TEST\, 是上面的工程目录。

这两个目录都要按照自己的实际修改,注意:路径分隔符用\。

然后,回车,正常的话,会输出以下信息。
这里写图片描述
其中push命令,可以把数据通过虚拟JTAG发到FPGA,load和e1dr信号有效的话,就把数据装载到my_counter。
这里写图片描述
最后,可以在Signaltap里,看到my_counter的值,有变化。
这里写图片描述

(6).以上例子的使用流程。

只要修改TCL脚本中的push命令后面的参数,保存,再在Quartus的TCL控制台中调用exec命令(使用方向键↑,可以调用以前的命令),就可以把数据发到FPGA的tmp_reg,再利用load和e1dr装载到my_counter。

3.复杂实例

这部分还没想好怎么写,就先放置一段时间

4.参考资料

这是一些基本资料和官方资料还有部分进击资料,其中官方资料建议去官网下载,找到自己对应的版本。
这是一些视频教程:https://so.youku.com/search_video/q_%E8%99%9A%E6%8B%9Fjtag
虚拟JTAG的博客:http://archive.ednchina.com/bbs.ednchina.com/BLOG_PERSONALCAT_100227_41415.HTM
QuartusII脚本参考手册:https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/manual/tclscriptrefmnl.pdf
虚拟JTAG官方文档:https://download.csdn.net/download/pieces_thinking/10646699
《TCL/TK入门经典》:https://download.csdn.net/download/pieces_thinking/10646726


http://chatgpt.dhexx.cn/article/5HcboXUo.shtml

相关文章

Win7、Win8、Win10系统USB-Blaster驱动程序无法安装的解决办法

这篇博文是我转载dezhihuang的博文&#xff0c;原文名称和地址如下&#xff0c;并对内容做了适当调整&#xff1a; [原]Win7、Win8系统USB-Blaster驱动程序无法安装的解决办法 第一次用Markdown编辑博客&#xff0c;格式方面真是捉急啊&#xff01; Win7、Win8、Win10操作系…

avr+开发环境+linux,win7下avr单片机开发环境的搭建

操作系统&#xff1a;win7 professional x86 开发软件&#xff1a;avr studio 4.19 首先下载avr studio 4.19&#xff0c;因为貌似这是atmel官方最后支持jtag ice的开发环境。而且也就只有这个4的版本才支持win7&#xff0c;正好本人有个jtag&#xff0c;所以果断选择这个版本…

IBM Spectrum LSF RTM

IBM Spectrum LSF RTM IBM Spectrum LSF RTM是IBM Spectrum LSF环境的操作仪表板&#xff0c;提供全面的工作负载监视、报告和管理。它使集群管理员在日常活动中更加高效&#xff0c;并提供所需的信息和工具&#xff0c;以提高集群效率&#xff0c;实现更好的用户生产力&#…

IBM Spectrum LSF Suites

IBM Spectrum LSF Suites 高性能计算(HPC)不再仅仅适用于大型组织和技术熟练的用户。在当今竞争激烈的商业环境中&#xff0c;几乎每个行业都需要更短的设计周期和更高质量的结果&#xff0c;HPC适用于任何规模的组织。它是为那些需要从大量数据中进行分析和回答的用户而设计的…

LSF_SPAN

span字符串指定并行作业运行的位置。如果省略span, LSF将从可用的处理器中为作业分配所需的处理器。 一、语法 span[host1]&#xff1a;指示分配给作业的处理器必须位于同一个主机上。 span[blockvalue]&#xff1a;对并行作业来说&#xff0c;LSF将根据block size来分配slot…

集群调度LSF-学习笔记

集群-------多台设备 HPC集群----多台用于计算的设备 集群调度-LSF&#xff1a;LSF 是一种强大的工作负载管理平台&#xff0c;提供基于各种策略的智能调度功能&#xff0c;利用分布式的基础架构资源来提高整体的系统性能。用户通过 LSF可以实现集群间的负载均衡&#xff0c;扩…

IBM Platform LSF在IC行业内的使用

LSF在&#xff29;&#xff23;设计中有哪些值得匹配的 1、管理低利用率Job •针对short normal这类队列&#xff0c;查询20分钟以后&#xff0c;Job利用率依然很低的Job信息。 •$bjobs -u all -q short -o ‘id user queue stat ugroup first_host sla idle_factor slots …

IBM Spectrum LSF-手册

在所有规模的企业中&#xff0c;应用程序能力和数据量持续显著增长&#xff0c;推动了对更多计算能力和高性能管理和分析工具的需求。即使在传统的高性能计算(HPC)环境中&#xff0c;多个计算竖井、不均匀处理、设计周期泄漏和延迟结果也是常见的。面对日益严格的经济压力&…

LSF - 提交GUI应用到LSF无法运行,报错Failed to connect to socket /tmp/dbus-xxxxxxxxx: Connection refused

问题描述 提交GUI应用到LSF无法运行&#xff0c;如下所示 问题分析 这种GUI应用&#xff0c;不能以交互式的方式提交。提交命令换成bsub firefox即可。

LSF的使用方法总结

一、LSF 基本介绍 LSF&#xff08;Load Sharing Facility&#xff09;是IBM旗下的一款分布式集群管理系统软件&#xff0c;负责计算资源的管理和批处理作业的调度。它给用户提供统一的集群资源访问接口&#xff0c;让用户透明地访问整个集群资源。同时提供了丰富的功能和可定制…

IBM Spectrum LSF

IBM Spectrum LSF IBMSpectrum LSF系列是对用于高性能计算(HPC)环境的工作负载管理解决方案有一个完整的组合。具有全面的智能配套调度能力&#xff0c;它有助于确保正确的资源自动分配到正确的作业&#xff0c;最大限度地提高应用程序性能和效率。具有强大的管理功能和无与伦…

LSF - 集群概览

LSF - 集群概览 LSF - 术语与概念 Job状态 PEND 在队列中等待调度和调度的。RUN 发送到主机并运行。DONE 正常结束与零退出值。EXIT 以非零退出值结束。PSUSP 当作业挂起时挂起。USUSP 被用户挂起。SSUSP 被LSF系统挂起。POST_DONE 后处理完成&#xff0c;没有错误。POST_ER…

LSF集群搭建笔记

LSF-linux_amd64集群搭建记录 修改节点ip地址为静态ip安装并开启ssh服务修改主机名修改/etc/hosts文件(为了方便所有机器都要改)设置集群间ssh免密钥通信(如果想root间无需密码登陆需要设置了所有机器可以root登陆&#xff0c;并改root密码为固定密码&#xff0c;默认root密码每…

LSF集群基本概念介绍

集群的基本概念-作业 作业是集群中最重要的一个概念&#xff0c;用户通过提交作业申请集群计算资源&#xff0c;完成计算任务作业状态 • PEND &#xff08;待定&#xff09;- - 作业在队列中等待调度与分派 • RUN &#xff08;运行&#xff09;- - 作业已经被分派到节点机上…

LSF client安装

在master01节点添加&#xff1a; [rootmaster01 conf]# pwd /share01/app/lsf/conf [rootmaster01 conf]# ls cshrc.lsf lsf.cluster.nju_cluster1 lsf.shared perl.lsf ego lsf.conf lsf.shared.old profile.lsf lsbatch lsf.entitlement…

LSF Reordering

可通过[! ]重新排序作业调度主机。 假设&#xff1a; 主机resh1110h220 假设如上两个作业处于pending状态&#xff0c;在同一个调度周期内被调度器考虑&#xff0c;首先调度job1。 在调度周期的早期&#xff0c;通过获取集群中的所有主机或任何(-m)请求的主机列表中列出的主机…

LSF安装部署

前言 目前&#xff0c;市面上主流的HPC调度器分为LSF、SGE、Slurm、SGE四大类型&#xff0c;不同行业根据自身场景和不同调度器对应用支持力度的不同&#xff0c;往往会有不同的偏好&#xff0c;在芯片设计公司中最常用的是LSF LSF&#xff08;Load Sharing Facility&#xf…

关于LSF的高级用法

1、通过脚本查询Job的利用率和所占的Core数&#xff0c;从而管理低利用率的Job。 •通过脚本查询JOB的利用率和所占的CORE数&#xff0c;从而管理低利用率的JOB。 •低CPU利用率的JOB要特别小心&#xff0c;最可能存在2个原因&#xff1a;JOB缺少LICENSE导致等待&#xff1b;存…

LSF_术语及概念

术语及概念 作业状态&#xff1a; PEND&#xff1a;在队列中等待调度和分派。RUN&#xff1a;分配给指定主机并运行。DONE&#xff1a;返回值为0&#xff0c;正常结束。PSUSP&#xff1a;在调度和分派时暂停。&#xff08;具体暂停条件待考究&#xff09;USUSP&#xff1a;由…

LSF - 基础 - 管理

LSF - 基础 - 管理 在LSF环境下工作 启动、停止与重新配置LSF 使用 LSF 管理命令 lsadmin 和 badmin 来启动和停止 LSF 守护进程&#xff0c;并重新配置集群属性。 两个 LSF 管理命令&#xff08;lsadmin 和 badmin&#xff09; 这两个命令只有LSF管理员或root能运行。 要…