ad604

Vivado Logic Analyzer Advanced

1
阅读(5435)
本文基于Vivado 2014.2。
阅读前请参考博文。

http://blog.chinaaet.com/detail/37239

http://blog.chinaaet.com/detail/37242

http://blog.chinaaet.com/detail/37264

http://blog.chinaaet.com/detail/37269


通过前文对ChipScope和Vivado Logic Analyzer的对比,可以发现ChipScope比Vivado Logic Analyzer的basic功能要强大。ChipScope中主要依靠状态,通过状态的组合可以构成需要的触发条件,同时利用状态的前后组合,完成状态机的触发功能。同时,ChipScope提供的计数器,在一定程度上也方便了使用。
对于这么强大的功能,Vivado Logic Analyzer怎么会缺失呢?Vivado Logic Analyzer提供了Advanced,完善Vivado Logic Analyzer的高级触发条件功能,本文将讨论Advanced这个模式。
首先,请注意,Advanced的功能,只针对触发条件的设置。关于捕获条件的设置,请参考前文。


在Vivado Logic Analyzer的界面中,参考下图将触发模式 设为Advanced。

这个时候,触发条件并不是像basic模式中,将相关信号添加到窗口中,然后编辑、组合,构成需要的触发条件。而是通过编写tsm文件来设计一个触发条件状态机。完成后加载该tsm文件即可构成需要的触发条件。


下面来看一下tsm特殊的语法
tsm文件只是一个后缀为.tsm的文本文件,任意的文本编辑器都可以编写tsm文件。
tsm最基本的语法为state来声明状态,Advanced模式与ChipScope一样,支持16个模式的触发状态机。
声明语法如下

state state2:
    trigger;
上面的语法声明了一个状态 state2,这个状态需要完成的事情是启动Vivado Logic Analyzer的触发。
既然有个16个状态机,那么单单一个状态机自然无法发挥作用,那么在状态机的切换用什么语句呢?
state state0:
    goto state1;

state state2:
    trigger;

请注意,不要丢失state语句后的冒号和state里面语句的分号。同时,每个状态中最后一个执行的语句必须是trigger或者goto语句。


下面,如何添加相关信号呢?直接书写接口。但是如何进行判断呢?使用条件语句if。
在tsm语法中,如已完成的部分,没有使用if语句,即为1分支语句;使用if else 为二分支语句;使用if elseif else语句,为三分支语句。根据Xilinx的文档,目前只支持最多的三分支语句。这样如果使用if,else一定是必须的。而每个条件分支中,结尾的也必定是trigger或者goto语句。


state state0:
    goto state1;
    
state state1:
    if (startup_counter == 8'h04) then
        goto state2;
    elseif (startup_counter == 8'h05) then
        goto state1;
    else
        goto state1;
    endif
  
state state2:
   trigger;
按照软件顺序执行的方式,可以很简单的读懂这段代码的含义。
需要注意的是,条件语句不能嵌套,if中不能存在另一个if。


通过状态的组合,Vivado Logic Analyer已经可以实现状态机触发。那么另一个计数器功能,Advanced模式自然也不会缺失。
Advance中有四个计数器可以使用,通过tsm的自由书写,counter的作用可以更加灵活,而不单单是ChipScope中的几个固定用法。
这里,将tsm修改为startup_counter连续出现16次04才进行触发。


state state0:
    reset_counter $counter0;
    goto state1;
    
state state1:
    if ((startup_counter == 8'h04) && ($counter0 == 16'u16)) then
        goto state2;
    elseif (startup_counter == 8'h04) then
        increment_counter $counter0;
        goto state1;
    else
        goto state1;
    endif
    
state state2:
   trigger;
新的代码有新的注意事项
1.increment_counter和reset_counter 控制计数器的两个命令
2.计数器的判断只有两个选择 等于== 和 不等于!=
3.计数器的当前计数状态,是无法观察到的
4.在数值比较的时候,只有三种数据格式可以选择: b(二进制)、h(十六进制)和u(无符号数), 构成数值格式与verilog相同,为<bit_width>'<radix><value>
5.在if的括号中,用括号和 || && 配合 == != > < >= <=来构成相关的判断条件,暂时没有发现这些组合有什么限制。

最后,再添加一个功能 flag。
从Advanced的界面就能看到四个可用的flag,便于设计的观察。



修改代码如下

state state0:
    clear_flag $flag0;
    clear_flag $flag1;
    clear_flag $flag2;
    clear_flag $flag3;
    reset_counter $counter0;
    goto state1;

state state1:
    if ((startup_counter == 8'h04) && ($counter0 == 16'u16)) then
        set_flag $flag0;
        goto state2;
    elseif (startup_counter == 8'h05) then
        set_flag $flag1;
        increment_counter $counter0;
        goto state1;
    else
        set_flag $flag3;
        goto state1;
    endif
  
state state2:
    set_flag $flag2;
    trigger;
修改到这里,已经完成了一个包含主要功能的tsm实例。
把tsm添加到设计中后,运行编译后,即可开始触发信号。

tsm的使用有如下两个问题
1.tsm语法很奇怪,部分像tcl,部分像verilog,同时本质是软件顺序执行的思想,与HDL并行的思想有很大出入,所以,掌握tsm是需要下功夫的。
2.tsm目前还有诸多的使用限制,希望在即将发布的Vivado 2014.3中可以有更多的更新。

尽管tsm有一些不足和困难,但是软件的思想赋予了tsm更多的灵活性, 从目前版本支持的功能来看,远胜过ChipScope。同时,新加入的flag功能也大大方便了Vivado Logic Analyzer的使用。

另外,ChipScope还有两项特殊的功能,目前Vivado还不支持:标签与启动触发。
由于这是Vivado的专场,就不描述这两个特殊的功能了。

最后,关于Vivado一个让我耿耿于怀的ICON缺失,也应该抽空给个交代了。
预告一下,Vivado应该可以搬回一局。