Vivado ILA Capture Control 模式与 Advanced Trigger的功能使用以及TSM(触发状态机)的编写

文章目录

  • 一、前言
  • 二、ILA的基本功能使用以及局限性
    • 2.1 ILA的调用
    • 2.2 ILA波形窗口观察
    • 2.3 ILA基本功能的局限性:如何观测低频的数据?
  • 二、Capture Control 功能介绍
  • 三、Advanced Trigger功能以及TSM编写
    • 3.1 触发状态机的写法
    • 3.2 设置Advanced Trigger
    • 3.3 编写触发状态机(TSM)
    • 3.4 下载程序后,加载TSM文件并且编译
  • 四、总结


一、前言

  在XILINX FPGA开发中,我们经常使用逻辑分析仪(ILA)对工程进行debug调试。绝大部分情况ILA的基本功能就可以满足大部分人的使用;但是存在少数情况使用基本的ILA无法捕捉到我们想要观看的波形,所以就有了ILA高级捕获的功能:Capture Control 与Advanced Trigger。

二、ILA的基本功能使用以及局限性

2.1 ILA的调用

  大家经常用的ILA(Integrated Logic Analyzer)有三种配置方式:

  1. 创建ILA核并且例化到所要测试的模块里
    在这里插入图片描述
    在这里插入图片描述
      按照步骤生成ILA后,例化到程序模块,把对应的信号连接上对应探针端口即可。

  2. 使用标记语句对信号进行标记 (* MARK_DEBUG=“true” *)
      在程序模块,在想要观测的信号前面加上这语句然后综合。
    在这里插入图片描述
      综合完成后,打开综合设计(Open Synthesized Design)
    在这里插入图片描述
      点击(Set Up Debug)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
       创建完记得保存约束文件,然后布局布线再生成bit流即可
    在这里插入图片描述

  3. 标记数据路径
       综合完成后,打开综合设计(Open Synthesized Design),在Netlist中选择想要观测的信号,单击右键选择(Mark Debug)
    在这里插入图片描述
      在最下方Debug窗口选择设置的信号,单击右键,创建ILA,步骤与其它方式一致,这里不在赘述。
    在这里插入图片描述
    在这里插入图片描述

2.2 ILA波形窗口观察

  在调用ILA并且生成bit流后下载程序,窗口会自动弹出ILA窗口。
在这里插入图片描述
在这里插入图片描述
  至此,已完成ILA的基本使用。

2.3 ILA基本功能的局限性:如何观测低频的数据?

  根据手册我们知道,连接ILA的时钟必须是一个“自由”的时钟,即上电就有的时钟,例如外部晶振。不能是从serdes恢复出来的时钟,自分频的时钟等等,否者下载程序会报错。ILA时钟频率也必须是JTAG时钟的2.5倍以上,JTAG也有最低的速率要求:
在这里插入图片描述
  因此,由上图JTAG时钟的列表可以找到,JTAG时钟最低可设置为125KHZ,所以理论上连接ILA的时钟最低也是312.5KHZ,但是对于ILA低于 20M 的采样时钟会不能正常工作。而且过低的JTAG时钟会导致下载程序时间非常长,默认的JTAG时钟为15M。通常在FPGA设计中,程序的时钟大多数都在几十兆甚至几百兆,如果我想看频率只有几十K的信号,用几十兆的时钟去采样,那么波形窗口将全是重复的点,达不到预期想要的效果。

  例如:我们用50M时钟要产生一个PWM信号,PWM周期为2s,如图所示:
在这里插入图片描述
  程序如下:

`timescale 1ns / 1ps

module breath_led#
(
    parameter                                           cnt_1us = 6'd50,
    parameter                                           cnt_1ms = 10'd1000,
    parameter                                           cnt_1s  = 10'd1000
)
(
    input                                               sys_clk ,
    input                                               sys_rstn    ,
    output  reg                                         pwm
);

   	reg             [5:0]                               cnt_us  ;	//1us计数器
   	reg             [9:0]                               cnt_ms  ;	//1ms计数器
    reg             [9:0]                               cnt_s   ;	//1秒计数器
    reg                                                 pwm_flag   ;//pwm输出flag
    reg                                                 cnt_1ms_done    ; //1ms计数完成信号


//1us计数器
always @(posedge sys_clk or negedge sys_rstn) begin
    if(sys_rstn == 1'b0)
        cnt_us <= 6'd0;
    else if(cnt_us == cnt_1us - 1)
        cnt_us <= 6'd0;
    else
        cnt_us <= cnt_us + 1'b1;
end

//1ms计数器
always @(posedge sys_clk or negedge sys_rstn) begin
    if(sys_rstn == 1'b0)
        cnt_ms <= 10'd0;
    else if((cnt_ms == cnt_1ms - 1) && (cnt_us == cnt_1us - 1))
        cnt_ms <= 10'd0;
    else if(cnt_us == cnt_1us - 1)begin
        cnt_ms <= cnt_ms + 1'b1;
        cnt_1ms_done <= 1'b1;
    end
    else begin
        cnt_ms <= cnt_ms;
        cnt_1ms_done <= 1'b0;
    end
end

//1s计数器
always @(posedge sys_clk or negedge sys_rstn) begin
    if(sys_rstn == 1'b0)
        cnt_s <= 10'd0;
    else if((cnt_s == cnt_1s -1)&&(cnt_ms == cnt_1ms - 1)&&(cnt_us == cnt_1us - 1))
        cnt_s <= 10'd0;
    else if((cnt_ms == cnt_1ms - 1)&&(cnt_us == cnt_1us - 1))
        cnt_s <= cnt_s + 1'b1;
    else
        cnt_s <= cnt_s;
end

//pwm_flag
always @(posedge sys_clk or negedge sys_rstn) begin
    if(sys_rstn == 1'b0)
        pwm_flag <= 1'b0;
    else if((cnt_s == cnt_1s -1)&&(cnt_ms == cnt_1ms - 1)&&(cnt_us == cnt_1us - 1))
        pwm_flag <= ~pwm_flag;
    else
        pwm_flag <= pwm_flag;
end

//输出pwm

always @(posedge sys_clk or negedge sys_rstn) begin
    if(sys_rstn == 1'b0)
        pwm<= 1;
    else if(((cnt_ms <= cnt_s) && (pwm_flag ==1'b0)) ||((cnt_ms >= cnt_s)&&(pwm_flag ==1'b1)))
        pwm<= 1'b0;
    else
        pwm<= 1'b1;
end

ila_0 u_ila (
	.clk(sys_clk), 
	.probe0(pwm)
);

endmodule

  设置ILA采样时钟为50M,如果我们想用观看完整波形的话,则需要2s/20ns=100000000个采样深度,显然这是不可能的。ILA抓取波形如下图所示:
在这里插入图片描述
  由debug波形图可以看出,我们将采样深度设置到65536,也只能抓取完整波形的局部图,因为PWM相对于采样时钟而言太是低频信号,采样时钟在抓取PWM波形时,基本上都是抓取的重复点,因此想要正确的抓出完整的低频信号,则必须打开Capture Control 选项。

二、Capture Control 功能介绍

  如图所示,打开ILA捕获模式:
在这里插入图片描述
  在没打开捕获模式时,当触发条件满足时,波形窗口会在用户设置的触发位置上显示出:触发条件前后的波形数据,总长度为用户设置的触发深度。
  在捕获模式下,用户可以设置特定的触发条件,当这些条件满足时,调试工具会捕获并记录指定的信号。这些条件可能包括特定的数据模式、信号的特定值或特定的时间间隔。一旦触发条件被满足,工具将开始捕获数据,并将其存储在内存或文件中以供后续分析。
  因此,我们想要显示总长度为2s的波形数据,可以设定捕获条件,例如捕获条件为:每计数完1ms就捕获一个数据,这样我们就能显示出完整的波形图:
在这里插入图片描述
  我们放大局部观看一下波形,可以看出每个周期的低电平都在增加,符合我们PWM的设计。
在这里插入图片描述

  此时我们显现出了我们想要观侧的PWM波形,其采样时间可以任意调节,因此采用capture control可以采样到低频的信号。

三、Advanced Trigger功能以及TSM编写

  在上面我们以及学会了ILA的高频和低频采样的使用,但是有些情况下依然不能满足我们的需求。例如:在高速串行系统中,我们想抓取第二帧的数据,其中第一帧和第二帧间隔时间不确定。我们只能设置触发帧头数据作为匹配条件,但是我们无法知道当前获取的是第几帧数据,因此就需要使用Advanced Trigger和编写触发状态机。

3.1 触发状态机的写法

  • 触发状态机包含多达16种状态;
  • 每种状态可包含1、2或3个条件分支;
  • 在触发器状态机程序中最多可以使用4个16比特计数器;$counter0, $counter1 , , ,$counter2, $counter3
  • 使用 g o t o goto goto 实现状态跳转
  • 控制计数器的命令有两条:increment_counter和reset_counter;
  • 触发使用trigger语句,每个状态中最后一个分支必须是goto或trigger语句;
  • 计数器的判断只有等于(==)和不等于(!=);
  • 在触发器状态机程序中最多可以使用4个flag来指示某些事件发生;$flag0, $flag1, $flag2, $flag3
  • 在进行数值比较的时候,只有三种数据格式可以选择:b,h和u,即二进制,十六进制,和无符号数;

3.2 设置Advanced Trigger

在这里插入图片描述

3.3 编写触发状态机(TSM)

  按照上图所示,打开ILA的高级触发选项,此时我们依然用上面的PWM测试程序,我们从程序可以知道,时钟频率50Mhz,时钟周期20ns,每计数20次为1us,每1us计数器计数1000次为1ms,每1ms计数器计数1000次为1s。此时我们想捕获第53ms里的第200us的位置,编写触发状态机程序(文件后缀为 .tsm)


#ILA TSM STATE
state tsm_state1:    //定义第一个状态机
    if(cnt_s == 10'u53)then //如果cnt_s为53,则跳转到状态二
        goto tsm_state2;
    else
        goto tsm_state1;
    endif

state tsm_state2:	//定义第二个状态机
    if(cnt_ms == 10'u200)then	//如果cnt_ms为200,则触发
        trigger;
    else
        goto tsm_state2;
    endif

3.4 下载程序后,加载TSM文件并且编译

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  编译触发状态机文件,然后启动触发
在这里插入图片描述

四、总结

  以上我们学会了ILA的所有功能的使用,只要把各种触发功能和怎么使用掌握了,在debug程序时才会更佳得心应手。


参考:
《UG908》
《UG936》
MicroZed Chronicles: Advanced ILA — the Trigger State Machine

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL中的ER图

1.首先学习如何设计数据&#xff0c;在此之前我们先学会画出我们的规划图 利用Axure RP 9 然后进行以后的操作。其实非常简单看看就会

NODE MCU (ESP8285-ESP8266)用Arduino lDE 2.3.2烧录系统后串口监控不打印问题

问题: Arduino lDE 2.3.2,集合DOIT ESP-Mx DevKit板子,烧录代码后,串口监视器 打印不出来调试数据 分析: Arduino lDE 2.3.2工具提示,不支持调试 板载flash按钮无需按下,即可烧录系统,由于烧录和调试共用串口,所以怀疑是Arduino lDE 2.3.2在烧录时设置了串口的配置…

Hello 算法10:搜索

https://www.hello-algo.com/chapter_searching/binary_search/ 二分查找法 给定一个长度为 n的数组 nums &#xff0c;元素按从小到大的顺序排列&#xff0c;数组不包含重复元素。请查找并返回元素 target 在该数组中的索引。若数组不包含该元素&#xff0c;则返回 -1 。 # 首…

Ubuntu 22.04 开机自动挂载webdav - 设置开机自启脚本 - 解决坚果云webdav无写入权限

效果图&#xff1a; 前言&#xff1a; 1&#xff09;亲测/etc/fstab的办法没有成功自动挂载&#xff0c;换成传统的rc.local可以解决&#xff1b; 2&#xff09;rc-local.service是系统自带的一个开机自启服务&#xff0c;但是在 ubuntu 20.04 上&#xff0c;该服务默认没有开…

基于物理原理的p-GaN HEMT动态导通电阻SPICE建模

来源&#xff1a;Physics-Based SPICE Modeling of Dynamic ON-State Resistance of p-GaN HEMTs&#xff08;TPEL 23年&#xff09; 摘要 这封快报介绍了一种新型基于物理学原理的SPICE建模方法&#xff0c;专门针对氮化镓基p型门极高电子迁移率晶体管&#xff08;p-GaN HEM…

route路由命令、ip route命令、default默认路由(0.0.0.0 )

文章目录 概述3. route语法3.1 查看路由表3.1 参数解释 3.2 添加路由记录3.2.1 添加到达单个目标主机的路由3.2.2 添加到达目标网络的路由3.2.3 添加默认路由 3.3 删除路由记录 4. ip route4.1 查看路由4.1.1 不带条件4.1.2 带条件4.1.3 字段解释4.1.3 字段解释 4.2 添加路由4.…

基于Springboot+Vue的Java项目-高校心理教育辅导系统开发实战(附演示视频+源码+LW)

大家好&#xff01;我是程序员一帆&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &am…

发布 Chrome/Edge浏览器extension扩展到应用商店

Chrom Extension发布流程 创建和发布自定义 Chrome 应用和扩展程序&#xff1a;https://support.google.com/chrome/a/answer/2714278?hlzh-Hans 在 Chrome 应用商店中发布&#xff1a;https://developer.chrome.com/docs/webstore/publish?hlzh-cn 注册开发者帐号&#…

Eclipse+Java+Swing实现图书信息管理系统-TXT存储信息

一、系统介绍 1.开发环境 操作系统&#xff1a;Win10 开发工具 &#xff1a;Eclipse2021 JDK版本&#xff1a;jdk1.8 存储方式&#xff1a;Txt文件存储 2.技术选型 JavaSwingTxt 3.功能模块 4.工程结构 5.系统功能 1.系统登录 管理员可以登录系统 2.查看图书 管理员…

软件无线电安全之HackRF One初探

HackRF介绍 HackRF是一款开源软件无线电&#xff08;SDR&#xff09;平台&#xff0c;由Great Scott Gadgets公司推出。它具有广泛的频率覆盖范围&#xff0c;从1 MHz到6 GHz&#xff0c;支持大部分常见的无线通信频段。采用软件定义无线电技术&#xff0c;HackRF提供了自定义…

vue快速入门(二十四)输入停顿再进行响应

注释很详细&#xff0c;直接上代码 上一篇 新增内容 使用侦听器监视数据变化情况使用clearTimeout与定时器实现停顿一段时间再操作内容 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"view…

【王道数据结构笔记】顺序表的动态分配代码分析

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

docker 安装 nginx + httpd + php-fpm

原文地址&#xff1a;http://www.taoluyuan.com/index.php/archives/30/#2 展示 1.安装 1.1安装docker 1.2安装nginx 1.3安装apache-httpd 1.4安装php-fpm 2.配置nginx反向代理 httpdphp-fmp 1.安装 1.1安装docker 移除旧的版本&#xff1a; sudo yum remove docker 安装…

redis-plus-plus的安装与使用

本文参考自 redis-plus-plus 官方文档 一、安装 因为redis-plus-plus是基于hiredis封装的&#xff0c;所以需要先安装hiredis&#xff1b; 第一步&#xff1a;安装hiredis # 使用git下载源代码 git clone https://github.com/redis/hiredis.git # 进入源代码主目录 cd hired…

ChatGPT在线网页版

ChatGPT镜像 今天在知乎看到一个问题&#xff1a;“平民不参与内测的话没有账号还有机会使用ChatGPT吗&#xff1f;” 从去年GPT大火到现在&#xff0c;关于GPT的消息铺天盖地&#xff0c;真要有心想要去用&#xff0c;途径很多&#xff0c;别的不说&#xff0c;国内GPT的镜像…

LangChain LangServe 学习笔记

LangChain LangServe 学习笔记 0. 引言1. LangServe 概述2. 特性3. 限制4. 安装5. 示例应用程序6. OpenAPI文档7. Python SDK 客户端8. Playground9. 聊天可运行页面 0. 引言 使用 LangServe 可以立即将您的LLM应用程序变成 API 服务器。 LangServe 使用 FastAPI 构建&#x…

5. Mysql的binlog介绍

参考&#xff1a;InnoDB学习&#xff08;三&#xff09;之BinLog 1. BinLog介绍 BinLog又称为二进制日志&#xff0c;是MySQL服务层的数据日志&#xff0c;MySQL所有的存储引擎都支持BinLog。 BinLog记录了MySQL中的数据更新和可能导致数据更新的事件&#xff0c;可以用于主从…

大数据深度学习:基于Tensorflow深度学习卷积神经网络CNN算法垃圾分类识别系统

文章目录 大数据深度学习&#xff1a;基于Tensorflow深度学习卷积神经网络CNN算法垃圾分类识别系统一、项目概述二、深度学习卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;简称CNN&#xff09;三、部分数据库架构四、系统实现系统模型部分核心代码模型训…

【C++】模板初阶——泛型编程、函数模板、类模板

1. 泛型编程 如何实现一个通用的交换函数呢&#xff1f; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left right;right temp; } void Swap(char& left…

双向链表的实现(详解)

目录 前言初始化双向链表的结构为双向链表的节点开辟空间头插尾插打印链表尾删头删查找指定位置之后的插入删除pos节点销毁双向链表 前言 链表的分类&#xff1a; 带头 不带头 单向 双向 循环 不循环 一共有 (2 * 2 * 2) 种链表 带头指的是&#xff1a;带有哨兵位节点 哨兵位&a…