Vivado使用IP核创建ILA调试环境

2024-02-19 07:59

本文主要是介绍Vivado使用IP核创建ILA调试环境,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

创建ILA核

1.在IP核中找到ILA
在这里插入图片描述
2.在这里插入图片描述

General Options:
1.Monitor Type:ILA 探针接口类型设置。ILA 探针接口有两种类型,Native 与 AXI。Native 是普通接口模式;AXI 是 AXI 接口模式,用于调试 AXI 接口信号。Native 通常是用来测量电平或一定位宽信号,AXI 就比较明显了直接测量 AXI 总线的信号。这里主要测试 led 信号,所以只需要用 Native 模式。

1)Number of Probes:探针数量最大可设置 64 个。根据led实验的需求,对 rst_n、led、count信号抓取后进行线调试,这里设置探针数量为 3。
在这里插入图片描述

2)Sample Data Depth:采样数据深度,设置的数值越大,采样的数据越多,看到的波形数据越多,但是最终占用的资源也会越多,并不是设置的越大越好。这里选择设置 4096。
pic=400x在这里插入图片描述
3)Same Number of Comparators for All Probe Ports:这里是设置相同探针接口的 Comparators 的个数,如果该选项不被勾选,接下来的 Number of Comparators 选项就会消失。LED实验默认勾选,后面的参数也保持默认。
在这里插入图片描述
4)Trigger Out Port:触发输出端口,可用于 ILA 模块的级联或一些高级功能,具体使用参考 IP 手册。LED实验的在线调试数据只需要基本功能,这里保持默认不勾选。

5)Trigger In Port:触发输入端口,可用于手工设置添加触发信号或进行 ILA 模块的级联或一些高级功能,具体使用参考 IP 手册。LED实验的在线调试数据只需要基本功能,这里保持默认不勾选。

6)Input Pipe Stages:设置待探测信号打拍次数,如下图所示,可设置数值 0~6,一般情况下,采样时钟和探测信号是一个时钟域下,这里可以默认设置为 0 即可。
在这里插入图片描述

2.Trigger And Storage settings:触发器和存储设置
1)Capture Control:捕获控制,支持基本触发(时间点捕获)外的捕获类型,比如信号变化的间歇捕获。如果勾选,可在调试查看波形窗口进行对 Capture mode 的设置;如果不勾选,后面有关Capture mode 就不可修改,会保持常用捕获模式。常用捕获模式满足大部分调试需求,所以LED实验我们这里不勾选,使用默认的常用捕获模式。
2)Advanced Trigger:高级触发,该模式下可以创建和使用复杂的触发序列。如果这里勾选,可在调试查看波形窗口进行对 Trigger mode 的设置;如果不勾选,后面有关 Trigger mode 就不可修改。LED的调试不需要使用高级触发,所以这里不勾选。如果有需要高级触发调试需求的可以详细阅读 Xilinx 官方的文档 UG936《Vivado Design Suite TutorialProgramming and Debugging》与 UG908《Vivado Design Suite User Guide Programming and Debugging》。
在这里插入图片描述

综上,最终配置如下:
在这里插入图片描述

接下来对 Probe_Ports(探针端口)进行配置:
在这里插入图片描述

1)Probe Port:探针。因为呼吸灯我们抓取了rst_n、led、count 信号 3个信号,探针数设置的个数为 3,对应上图最左边一列的 PEOBE0 ~PEOBE2。
2)Probe Width:设置探针信号的位宽。rst_n、led 信号位宽为 1,计数[26:0]count位宽为27。
3)Number of Comparators:如果已经勾选,这里就不可设置,如果没有勾选,这里就可以设置。保持默认即可。
4)Probe Trigger or Data:对探针设置触发器或数据。
  DATA AND TRIGGER:既是数据又可作为触发条件;
  DATA:仅作为数据,不可作为触发条件;
  TRIGGER:仅可作为触发条件

最终设置如下:
在这里插入图片描述

以上LED实验的 ILA IP 核配置完成,接下来点击右下角的“OK”退出配置界面,如下图所示:
在这里插入图片描述

接下来会弹出下图对话框,直接点击“Generate”即可,此时 Vivado 就开始对该 ILA IP 核进行 OOC 综合:
pic=400x在这里插入图片描述
1)图中 Synthesis Options 选择的是 Out of context per IP,简称 OOC。
Vivado OOC 综合的概念:对于顶层设计,Vivado 使用自顶向下的全(Global)综合方式,将顶层之下的所有逻辑模块都进行综合,但是设置为 OOC 方式的模块除外,它们独立于顶层设计而单独综合。通常在整个设计周期中,顶层设计会被多次修改并综合,但有些子模块在创建完毕之后不会因为顶层设计的修改而被修改,如 IP,它们被设置为 OOC 综合方式。OOC 模块只会在综合顶层之前被综合一次,这样在顶层的设计迭代过程中,OOC 模块就不必跟随顶层模块而一次次产生相同结果的多余综合了,所以 OOC 流程减少了设计的周期,并消除了设计迭代,使可以保存和重用综合结果。

2)Number of jobs 和计算机编译时调用的 CPU 核的数量相关,利用较多的资源能够获得较快的编译速度。

OOC综合完毕后如图所示:
在这里插入图片描述
这时在"Source"窗口可以看到LIA IP核:
pic=400x在这里插入图片描述
因为没有把它例化到顶层的 HDL 代码中,所以在层次结构上它与顶层并排。下面将其例化到顶层的 HDL 代码中。在“Source”窗口中的“IP Sources”选项卡中双击 ILA IP 核的例化模板文本文件,找到例化模板的内容,如下图所示:
在这里插入图片描述

将上图红色方框中的模板代码复制并粘贴到 led.v 顶层 HDL 代码中,并将 ILA 的时钟和探针信号连接到顶层设计中,例化 ILA IP 核的代码如下:

module LED(input 	clk,input   rst_n,output 	led);reg [26:0] count;  //zedboard的时钟频率是100Mhz,也就是计数100 000000为1s
reg led;
always @ (posedge clk or negedge rst_n)beginif(!rst_n) //低电平复位	count <= 27'd0;else if(count < 27'd100_000000)count <=count + 1'd1;elsecount <= 27'd0;
endalways@(posedge clk or negedge rst_n)beginif(!rst_n)led <= 1'b0;else if(count == 27'd99_999999)led <= !led;
endila_0 u_ila_0 (.clk(clk), // input wire clk.probe0(rst_n), // input wire [0:0]  probe0  .probe1(led), // input wire [0:0]  probe1 .probe2(count) // input wire [26:0]  probe2
);

将顶层时钟 clk 连接到 ILA 的采样时钟上,probe0 探针连接到了rst_n信号;probe1 探针连接到了led信号;probe2 探针连接到了 count信号。代码修改完成后如下图所示:
在这里插入图片描述

保存源文件之就可以直接综合并实现设计,最后生成比特流,然后将比特流下载到FPGA中,并对信号进行在线观察。至此,我们就成功地使用“HDL实例化调试探针”方法将ILA IP核添加到了设计中。

观察调试信号

生成比特流之后,我们打开 Hardware Manager,连接到开发板并下载比特流,如下图所示:
在这里插入图片描述

在弹出的窗口中,Vivado 会自动识别比特流文件和具有调试探针信息的.ltx 文件,如下图所示:
pic=400x在这里插入图片描述
.ltx 文件存储了调试探针的信息,用来传递给 Vivado IDE,它是从我们的设计中被提取出来的。调试探测文件是在实现过程中自动创建的,并位于和比特流文件相同的目录下。若实现后的设计中包含了 ILA IP 核,则在下载比特流时,Vivado 会自动识别出.ltx 文件。直接点击“Program”,此时 Vivado 会自动打开 ILA 的调试窗口:
在这里插入图片描述
如果有时候 ILA 的采样波形窗口界面没有自动弹出,可以点击左侧 hardware 窗口中带 ila 特征的硬件选择按钮,如本例中点击 hw_ila_1 以重新启动 ILA 采样波形。
pic=400x在这里插入图片描述
如果窗口中显示的信号不全,点击加号,将所有的探针信号添加到波形窗口中:
在这里插入图片描述

信号添加完成后,开始进行触发动作。在波形窗口中有 4 个触发动作,如下图所示:在这里插入图片描述
从左至右依次是:循环触发、开始触发、立即触发、停止触发。

(1)循环触发,它和“开始触发”按钮联合在一起使用。若打开了此选项,再点击了“开始触发”按钮后,会不断地对触发条件进行检测,直到用户点击了“停止触发”按钮,波形将不再更新。如果探针一直没有检测到触发条件,那么触发操作一直在进行,直到点击停止触发按钮,这次触发操作才会结束。
(2)开始触发,点击之后 ILA 就会开始进行触发操作。点击该按钮后,ila 探针自动寻找触发条件,当探针检测到触发条件后,会将 RAM 中存储的探针值数据上传到 Vivado,Vivado 上显示的波形发生改变,一次触发操作完成;如果探针一直没有检测到触发条件,那么触发操作一直在进行,直到点击停止触发按钮,这次触发操作才会结束。
(3)立即触发,立即将当前 RAM 中的数据上传到 Vivado,而不管触发条件是否得到满足。
(4)停止触发,停止当前正在进行的触发活动。

点击开始触发采集信号的按钮,可以观察到此时信号的波形:
在这里插入图片描述
采集到信号后,可以点击上图中的放大和缩小的图标:在这里插入图片描述
波形默认十六进制,右击信号选择“Radix”→“UnsignedDecimal”,即可切换到无符号的十进制:在这里插入图片描述
接下来介绍 ILA Croe 的状态控制和显示窗口:pic=400x在这里插入图片描述
1)Core status:由 5 个空心圆表示,实心绿色点在第一个,表示 ILA 开始运行;实心绿色点在最后,表示 ILA 运行结束;实心绿色点在中间的三个圆,表示 ILA 正在运行中。
2)indow sample 0 of 4096:已采集的点数占总采集点数的关系,与设置的采样深度一致;由图可知采样结束时我们已采集的点数是 4096个。

在“Trigger Setup”窗口中添加触发条件,点击“+”号,将信号添加进来,触发方式有很多种选择,选择好一种触发方式后点击“开始触发”。
在这里插入图片描述

调试结束

在线调试操作完成后需要删除在线调试的 ILA IP 核,可以进行如下图操作,首先删除在线调试的 ILA IP 核:
pic=400x在这里插入图片描述
需要勾选此选项,从磁盘中删除该 IP 核,然后点击“OK”,删除 ILA IP 完成。
pic=400x在这里插入图片描述

接下来再删除或者注释掉代码中的 ILA IP 核例化部分的代码,LED.v 的代码修改后需要重新保存:
在这里插入图片描述
至此,整个流程结束。

这篇关于Vivado使用IP核创建ILA调试环境的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/724025

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

C++ Primer 多维数组的使用

《C++Primer多维数组的使用》本文主要介绍了多维数组在C++语言中的定义、初始化、下标引用以及使用范围for语句处理多维数组的方法,具有一定的参考价值,感兴趣的可以了解一下... 目录多维数组多维数组的初始化多维数组的下标引用使用范围for语句处理多维数组指针和多维数组多维数组严格来说,C++语言没