FPGA|Signal Tap抓取波形

本篇内容包括两部分:
1、介绍一下Signal Tap如何抓取波形。
2、以刚做完的实验为例(实现四个数码管以1HZ的频率进行跳变,从“0000”~“EEEE”一共16个状态的循环跳变),观察SignalTap波形抓取结果,并分析一下实验中遇到的问题以及解决办法。实验代码和BDF原理图会在篇末给出。


1 SignalTap如何抓取波形

  1. 编译无误且programming到板子上结果正确后,点击File→New…→SignalTap II Logic Analyzer File→OK
    FPGA|Signal Tap抓取波形_第1张图片
    下面逐一对SignalTap页面进行功能及其相应的配置方法介绍。
  2. ①在setup页面的右上角 Hardware那栏点击 setup… ,在弹出的框框里Current selected hardware 的下拉菜单中选择USB-Blaster→Close
    Device 那栏会显示你的芯片型号,点击Scan Chain会自动扫描。如图显示的是我板子的型号EP3C16。
    ③在SOF Manager 那一栏点击**…** 按键,在弹出的框框里选择生成的 .sof 文件 →打开 →点击左侧带有箭头的蓝色小图标 进行烧录。
    FPGA|Signal Tap抓取波形_第2张图片
  3. Signal Configuration板块:
    Clock:点击右侧的 按钮 在弹出框框里 Filter的下拉菜单里选择Design Entry(all name)→ 点击list,可以看到 Nodes Found下面的方框□里列出了project里所有的管脚→选中clk(也就是我们定义的时钟)→ 点击(位于Nodes Found和Selected Nodes两栏中间那里),在Selected Nodes里会看到刚刚选择的clk →OKFPGA|Signal Tap抓取波形_第3张图片
    Sample depth 表示采样深度(从0~128k),表示采取多少个样点,可以在下拉菜单里进行设置。
    FPGA|Signal Tap抓取波形_第4张图片
    segmented(分段采样模式:如果想要通过segmented触发-捕获模式进行波形抓取,可以勾选上。在它的下拉菜单里有很多选项,这里以其中一个为例进行解释,如2 256sample segment的含义是分成2段,每段采样256个样本FPGA|Signal Tap抓取波形_第5张图片
    ③也可以选择storage qualifier → type (循环采样模式,包括多种方式:continuous(连续采样)、……。一般选择continuous。
    FPGA|Signal Tap抓取波形_第6张图片
  4. Trigger
    Trigger flow control(触发流程控制有两个选项:“Sequential”(顺序的)、“State-based”(基于状态的在这里插入图片描述
    Trigger position(触发位置
    :有三个选项:“Pre trigger position”(触发位置在前面)、Center trigger position(触发位置在中间)、Post trigger position(触发位置在后面
    FPGA|Signal Tap抓取波形_第7张图片
    Trigger Conditions(触发条件(这个还不太会用……以后写)
    FPGA|Signal Tap抓取波形_第8张图片
  5. trigger一栏 双击 ,在弹出框里,Filter选择Design Enty(all names)→ 点击 list→Nodes Found里选择想要观察的引脚 点击 ,在Selected Nodes里面会看到刚刚选中的引脚 →OK。这时就会在这个trigger下的框里看到刚刚选出来的引脚。选中想要观察的引脚 鼠标️停留在 Trigger Condition→ 右键,会出现几个选项 “Don’t care”、“Low”(低电平时触发)、“Falling Edge”(下降沿触发)、“Rising Edge”(上升沿触发)、“High”(高电平时触发)、“Either Edge”(上升沿和下降沿都触发 ,可以选择其中的一种。
    【本实验想要观察OUT[6…0],选中这7个输出,鼠标️停留在Trigger Condition 右键,选择“Either Edge”】
    FPGA|Signal Tap抓取波形_第9张图片
  6. “红色部分”会提示你此时应该进行编译。
    FPGA|Signal Tap抓取波形_第10张图片
  7. 回到project,点击紫色小箭头进行编译。在这里插入图片描述
  8. 编译时会弹出框框让你保存SignalTap文件,自己给它命名并保存就好。
  9. 编译完成后回到SignalTap文件,此刻红色提示内容显示让你把程序下载到板子上。
    FPGA|Signal Tap抓取波形_第11张图片
  10. 回到project中,programming,把程序下载到板子。在这里插入图片描述
  11. 再次回到SignalTap,会看到提示Ready to acquire。在抓取波形前要先点击SOF Manager 那里的蓝色小按钮,把程序烧录到板子里。接着可以点击带有的红色小三角如下图中橙色框框所示),它表示单次运行,抓取到的是静态波形;也可以点击带有旋转箭头的红色小三角如下图中蓝色框框所示),它表示连续运行,抓取到的是动态波形。(下图中紫色框框里的是暂停 按钮,当开始抓取波形时,暂停按钮会变成黑色的。如需暂停抓取波形,点击它就好)
    FPGA|Signal Tap抓取波形_第12张图片
    上图中Status状态分为:Not running(未运行)、Waiting for trigger(等待触发)、Acquiring post-trigger data(正在捕获data)、offloading acquire data(导出捕获到的data

2.1 问题与解答

问题:当笔者点红色的小三角抓取波形的时候,发现没有波形,此时的Status 是绿色的Waiting for trigger,这是为什么呢?应该如何解决?
答:waiting for trigger的意思是没有达到触发条件。比如说把OUT设为上升沿触发,那么只有当OUT出现上升沿时(比如由0变为1),SignalTap才会开始波形抓取,其余时间都是处于waiting for trigger状态,也就是陷入僵局。
②因为在本实验的SignalTap中笔者添加了一组七段数码管的管脚OUT1[6…0],将它们trigger 设置的是Either Edge。那么只有当7个输出同时出现上升沿(0→1)或者同时出现下降沿(1→0)时,SignalTap才会开始波形抓取,否则就会一直Waiting for trigger
③但经过分析发现,0→1→…→E→F变化时,7个输出并没有同时出现上升沿或下降沿,所以就会出现波形抓不出来的结果。
④为了验证笔者的猜想,现在把OUT1[0]trigger变为Rising Edge,把OUT1[6…1]变为Don’t care。点击带有旋转箭头的红色小三角进行波形抓取,发现只有当OUT1[0]从0变为1时,state为抓取数据的状态(如下图所示Acquiring post-trigger data、offloading acquired data),同时在下边的大框里可以看到抓出来的波形。其余时间都是waiting for trigger
FPGA|Signal Tap抓取波形_第13张图片
FPGA|Signal Tap抓取波形_第14张图片
因此解决办法为:把7个输出的trigger全部改为Don’t care,也就是随即抓波形,不用等触发条件到才抓取。
FPGA|Signal Tap抓取波形_第15张图片
点击红色小箭头抓取波形,成功!

2.2 波形抓取结果分析

如图所示是笔者抓到的一个波形,由逻辑值OUT1=7’b 1000000,可以知道抓到的这个是**“0”**的波形。每次点“单次运行”红色的小三角,都会抓到一个波形。点“连续运行”红色小三角就会看到波形的动态变化过程。FPGA|Signal Tap抓取波形_第16张图片

✨ 笔者想把0~F的波形显示在一个页面上,直观地看波形的变化,但是试了好多次都没有成功

以下是试过两种方法:
①增加采样点,即增加sample depth的值
②更改时间轴范围(如下图)FPGA|Signal Tap抓取波形_第17张图片

解决方法:

SignalTap用50MHz的采样频率太大了,应该把时钟频率设置为信号频率的十倍左右。本实验信号频率是1Hz,所以把时钟频率设置为10Hz。具体方法就是编写一个分频器,生成频率为10Hz的CLK1信号,把它作为SignalTap的时钟。
生成10HZ的CLK1代码(在原时钟模块添加这段代码)

Module clk(
    CNT,
    CLK1);
output [32-1:0] CNT;
output CLK1;

reg [32-1:0] CNT;
reg CLK1;

always @(posedge CLK) begin
  if(CNT >= MAX)    
  CNT <= 0;  
  else     
  CNT <= CNT + 1'b1;
  end
  
always @(CNT) begin  
if (CNT == MAX)    
CLK1 = 1'b1;  
else    
CLK1 = 1'b0;
end

在BDF中引出CLK1
FPGA|Signal Tap抓取波形_第18张图片
在SignalTap中clk里添加CLK1,编译后进行波形抓取
在这里插入图片描述
就可以清楚地看到波形的变化了。图中两个黑色竖线中间的16个状态是一个周期。


附上“代码”和BDF原理图

代码

module clk(
  CLK   ,   // clock
  CNTVAL,   // counter value
  OV    );  // overflow
input CLK;
output [32-1:0] CNTVAL;
output OV;
parameter MAX_VAL = 500_000;
reg [32-1:0] CNTVAL;
reg OV;

always @ (posedge CLK) begin
  if(CNTVAL >= MAX_VAL)
    CNTVAL <= 0;
  else
    CNTVAL <= CNTVAL + 1'b1;
end

always @ (CNTVAL) begin
  if(CNTVAL == MAX_VAL)
    OV = 1'b1;
  else
    OV = 1'b0;
end
endmodule
//
module cnt_en_0to1(
  CLK   ,   // clock
  CNTVAL,   // counter value
  EN    ,); 
input CLK;
input EN;
output [4-1:0] CNTVAL;

reg [4-1:0] CNTVAL;
reg OV;

always @ (posedge CLK) begin
  if(EN) begin  // work enable
    if(CNTVAL >= 15)
      CNTVAL <= 0;
    else
      CNTVAL <= CNTVAL + 1'b1;
  end
  else
    CNTVAL <= CNTVAL ;  // hold same value
end
endmodule

module dec_4to7(
    IN  ,
    OUT1,
    OUT2,
    OUT3,
    OUT4);
input  [4-1:0]IN;
output [7-1:0] OUT1 ;
output [7-1:0] OUT2 ;
output [7-1:0] OUT3 ;
output [7-1:0] OUT4 ;

reg [7-1:0] OUT1 ;
reg [7-1:0] OUT2 ;
reg [7-1:0] OUT3 ;
reg [7-1:0] OUT4 ;

always @ (IN) begin
  case(IN)
    4'b 0000: OUT1 = 7'b 1000000;
    4'b 0001: OUT1 = 7'b 1111001;
    4'b 0010: OUT1 = 7'b 0100100;
    4'b 0011: OUT1 = 7'b 0110000;
    4'b 0100: OUT1 = 7'b 0011001;
    4'b 0101: OUT1 = 7'b 0010010;
    4'b 0110: OUT1 = 7'b 0000010;
    4'b 0111: OUT1 = 7'b 1111000;
    4'b 1000: OUT1 = 7'b 0000000;
    4'b 1001: OUT1 = 7'b 0010000;
    4'b 1010: OUT1 = 7'b 0001000;
    4'b 1011: OUT1 = 7'b 0000000;
    4'b 1100: OUT1 = 7'b 1000110;
    4'b 1101: OUT1 = 7'b 1000000;
    4'b 1110: OUT1 = 7'b 0000110;
    4'b 1111: OUT1 = 7'b 0001110;
  endcase
  case(IN)
    4'b0000: OUT2 = 7'b 1000000;
    4'b0001: OUT2 = 7'b 1111001;
    4'b0010: OUT2 = 7'b 0100100;
    4'b0011: OUT2 = 7'b 0110000;
    4'b0100: OUT2 = 7'b 0011001;
    4'b0101: OUT2 = 7'b 0010010;
    4'b0110: OUT2 = 7'b 0000010;
    4'b0111: OUT2 = 7'b 1111000;
    4'b1000: OUT2 = 7'b 0000000;
    4'b1001: OUT2 = 7'b 0010000;
    4'b1010: OUT2 = 7'b 0001000;
    4'b1011: OUT2 = 7'b 0000000;
    4'b1100: OUT2 = 7'b 1000110;
    4'b1101: OUT2 = 7'b 1000000;
    4'b1110: OUT2 = 7'b 0000110;
    4'b1111: OUT2 = 7'b 0001110;
  endcase
  case(IN)
    4'b0000: OUT3 = 7'b 1000000;
    4'b0001: OUT3 = 7'b 1111001;
    4'b0010: OUT3 = 7'b 0100100;
    4'b0011: OUT3 = 7'b 0110000;
    4'b0100: OUT3 = 7'b 0011001;
    4'b0101: OUT3 = 7'b 0010010;
    4'b0110: OUT3 = 7'b 0000010;
    4'b0111: OUT3 = 7'b 1111000;
    4'b1000: OUT3 = 7'b 0000000;
    4'b1001: OUT3 = 7'b 0010000;
    4'b1010: OUT3 = 7'b 0001000;
    4'b1011: OUT3 = 7'b 0000000;
    4'b1100: OUT3 = 7'b 1000110;
    4'b1101: OUT3 = 7'b 1000000;
    4'b1110: OUT3 = 7'b 0000110;
    4'b1111: OUT3 = 7'b 0001110;
  endcase
  case(IN)
    4'b0000: OUT4 = 7'b 1000000;
    4'b0001: OUT4 = 7'b 1111001;
    4'b0010: OUT4 = 7'b 0100100;
    4'b0011: OUT4 = 7'b 0110000;
    4'b0100: OUT4 = 7'b 0011001;
    4'b0101: OUT4 = 7'b 0010010;
    4'b0110: OUT4 = 7'b 0000010;
    4'b0111: OUT4 = 7'b 1111000;
    4'b1000: OUT4 = 7'b 0000000;
    4'b1001: OUT4 = 7'b 0010000;
    4'b1010: OUT4 = 7'b 0001000;
    4'b1011: OUT4 = 7'b 0000000;
    4'b1100: OUT4 = 7'b 1000110;
    4'b1101: OUT4 = 7'b 1000000;
    4'b1110: OUT4 = 7'b 0000110;
    4'b1111: OUT4 = 7'b 0001110;
  endcase
end
endmodule

BDF原理图
FPGA|Signal Tap抓取波形_第19张图片
fpga板子结果
FPGA|Signal Tap抓取波形_第20张图片
FPGA|Signal Tap抓取波形_第21张图片

--------------------------------- 完 ---------------------------------

你可能感兴趣的:(FPGA)