模型功能
- 使用ILA观察信号
- 观察变量的转化
- 触发信号的设立
- ILA调试状态机的编写
- VIO的手动控制
模型框图
ila_0 u_ila_0(
.clk(clk),
.probe0(probe_0)
);
实现步骤
- ILA调试核的使用
- 直接调用该IP核,可以实现一个在线逻辑分析仪的功能
- ILA核的设置包括信号个数(对应位宽在第二页)、比较器个数、TRG输入输出、高级功能
- 其中比较器个数和高级功能为调试状态机提供条件
- 设置2比较时,只能进行两次同变量的比较,
- 观察变量的转化
- 通过wire可以将变量转化为方便观察的量,然后连接到多个probe
- 也可利用ila自定义端口进行转化
- 但是这种转化出来的变量只能用于等于判断,不能用于大小判断
- 所以最好使用probe对每个变量独立观测
- 变量的除法除了输入触发信号,还可以利用观测信号进行自触发
- 这个操作和示波器是一致的
- 触发信号的设置
- 使用专用触发信号
- 在这里选择触发类型
- 将输入的信号作为专用触发信号
- 如果要使用自触发,修改为默认的BASIC即可
- 至于高级模式,就是状态机触发
- 状态机触发的实现
- 官方的状态机触发例子,主要结构就是状态机不带case的写法,且每个if后面增加then,类似PYTHON的语法
- 基于上述修改一个
##################################################
#
# For info on creating trigger state machines:
# 1) In the main Vivado menu bar, select
# Window > Language Templates
# 2) In the Templates window, select
# Debug > Trigger State Machine
# 3) Refer to the entry 'Info' for an overview
# of the trigger state machine language.
#
# More information can be found in this document:
#
# Vivado Design Suite User Guide: Programming
# and Debugging (UG908)
#
##################################################
state S0:
if ( r_cnt == 32'h0000_0010 ) then
goto S1;
else
goto S0;
endif
state S1:
goto S2;
state S2:
goto S3;
state S3:
trigger;
- 编写完成后可以点击编译按钮,观察是否存在语法错误
- 从这个文件调试中发现以下的要点:
(1)位宽必须严格对应(和GUI设置自触发一样)
(2)不支持d十进制匹配,而是使用u代替,这里和verilog不一致
(3)trigger语句代表状态机结束,不能在进行其他逻辑
(4)一个变量只能出现一种形式的比较,也就是不能进行同信号的多种判断,这个可能是触发信号简化的结果 - 上述的文件等效于 r_cnt == 32'h0000_0010,但是触发延时了三个周期
- 当信号很多的时候,利用这个状态机可以实现触发条件的复杂联动,实现某些特殊的判断
- 状态负责进行新的判断扫描,直达获取到对应的条件,然后再按照跳转条件进行触发
- 如果真的需要实现硬件状态机,则需要将每个条件都通过独立的通道进行导入
- 这样才能实现真正的非即时断言的功能
- 从这个文件调试中发现以下的要点:
- VIO的手动控制
- 除了检测信号,xilinx提供了VIO进行虚拟信号的生成
- 主要是搭建一个简易的信号控制,可以用于无指令系统时的简易控制
- 这个使用比较简单,就不再展开
最终效果
- 延时3个周期后触发
调用接口
- 略
======== ======\\ ======= -
|| || \\ // \\ /-\
|| || || // // \\
|| || // || // \\
====== ======= || === ========
|| || || \\ // \\
|| || \\ || // \\
|| || \\ // // \\
|| || ======= // \\
作者:绿叶落秋风,专注FPGA技术分析和分享,转载请注明原文链接:https://www.cnblogs.com/electricdream/p/18106717,文中资源链接如下:
1. GITHUB开源仓库