FPGA|Signal Tap抓取波形
本篇内容包括两部分:
1、介绍一下Signal Tap如何抓取波形。
2、以刚做完的实验为例(实现四个数码管以1HZ的频率进行跳变,从“0000”~“EEEE”一共16个状态的循环跳变),观察SignalTap波形抓取结果,并分析一下实验中遇到的问题以及解决办法。实验代码和BDF原理图会在篇末给出。
1 SignalTap如何抓取波形
下面逐一对SignalTap页面进行功能及其相应的配置方法介绍。
②Device 那栏会显示你的芯片型号,点击Scan Chain会自动扫描。如图显示的是我板子的型号EP3C16。
③在SOF Manager 那一栏点击**…** 按键,在弹出的框框里选择生成的 .sof 文件 →打开 →点击左侧带有箭头的蓝色小图标 进行烧录。
①Clock:点击右侧的 … 按钮 → 在弹出框框里 Filter的下拉菜单里选择Design Entry(all name)→ 点击list,可以看到 Nodes Found下面的方框□里列出了project里所有的管脚→选中clk(也就是我们定义的时钟)→ 点击>(位于Nodes Found和Selected Nodes两栏中间那里),在Selected Nodes里会看到刚刚选择的clk →OK
②Sample depth 表示采样深度(从0~128k),表示采取多少个样点,可以在下拉菜单里进行设置。
segmented(分段采样模式):如果想要通过segmented触发-捕获模式进行波形抓取,可以勾选上。在它的下拉菜单里有很多选项,这里以其中一个为例进行解释,如2 256sample segment的含义是分成2段,每段采样256个样本。
③也可以选择storage qualifier → type (循环采样模式),包括多种方式:continuous(连续采样)、……。一般选择continuous。
①Trigger flow control(触发流程控制)有两个选项:“Sequential”(顺序的)、“State-based”(基于状态的)
②Trigger position(触发位置):有三个选项:“Pre trigger position”(触发位置在前面)、Center trigger position(触发位置在中间)、Post trigger position(触发位置在后面)
③Trigger Conditions(触发条件)(这个还不太会用……以后写)
【本实验想要观察OUT[6…0],选中这7个输出,鼠标🖱️停留在Trigger Condition 右键,选择“Either Edge”】
上图中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。
因此解决办法为:把7个输出的trigger全部改为Don’t care,也就是随即抓波形,不用等触发条件到才抓取。
点击红色小箭头抓取波形,成功!
2.2 波形抓取结果分析
如图所示是笔者抓到的一个波形,由逻辑值OUT1=7’b 1000000,可以知道抓到的这个是**“0”**的波形。每次点“单次运行”红色的小三角,都会抓到一个波形。点“连续运行”红色小三角就会看到波形的动态变化过程。
✨ 笔者想把0~F的波形显示在一个页面上,直观地看波形的变化,但是试了好多次都没有成功
以下是试过两种方法:
①增加采样点,即增加sample depth的值
②更改时间轴范围(如下图)
解决方法:
SignalTap用50MHz的采样频率太大了,应该把时钟频率设置为信号频率的十倍左右。本实验信号频率是1Hz,所以把时钟频率设置为10Hz。具体方法就是编写一个分频器,生成频率为10Hz的CLK1信号,把它作为SignalTap的时钟。
生成10HZ的CLK1代码(在原时钟模块添加这段代码)
在BDF中引出CLK1
在SignalTap中clk里添加CLK1,编译后进行波形抓取
就可以清楚地看到波形的变化了。图中两个黑色竖线中间的16个状态是一个周期。
附上“代码”和BDF原理图
代码
module clk(CLK , // clockCNTVAL, // counter valueOV ); // 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) beginif(CNTVAL >= MAX_VAL)CNTVAL <= 0;elseCNTVAL <= CNTVAL + 1'b1; endalways @ (CNTVAL) beginif(CNTVAL == MAX_VAL)OV = 1'b1;elseOV = 1'b0; end endmodule // module cnt_en_0to1(CLK , // clockCNTVAL, // counter valueEN ,); input CLK; input EN; output [4-1:0] CNTVAL;reg [4-1:0] CNTVAL; reg OV;always @ (posedge CLK) beginif(EN) begin // work enableif(CNTVAL >= 15)CNTVAL <= 0;elseCNTVAL <= CNTVAL + 1'b1;endelseCNTVAL <= 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) begincase(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;endcasecase(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;endcasecase(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;endcasecase(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 endmoduleBDF原理图
fpga板子结果
--------------------------------- 完 ---------------------------------
总结
以上是生活随笔为你收集整理的FPGA|Signal Tap抓取波形的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 【xmind使用】黄金猪头样例
- 下一篇: app渗透测试抓不到数据包怎么办?