本篇内容包括两部分:
1、介绍一下Signal Tap如何抓取波形。
2、以刚做完的实验为例(实现四个数码管以1HZ的频率进行跳变,从“0000”~“EEEE”一共16个状态的循环跳变),观察SignalTap波形抓取结果,并分析一下实验中遇到的问题以及解决办法。实验代码和BDF原理图会在篇末给出。
1 SignalTap如何抓取波形
- 编译无误且programming到板子上结果正确后,点击File→New…→SignalTap II Logic Analyzer File→OK
下面逐一对SignalTap页面进行功能及其相应的配置方法介绍。 - ①在setup页面的右上角 Hardware那栏点击 setup… ,在弹出的框框里Current selected hardware 的下拉菜单中选择USB-Blaster→Close
②Device 那栏会显示你的芯片型号,点击Scan Chain会自动扫描。如图显示的是我板子的型号EP3C16。
③在SOF Manager 那一栏点击**…** 按键,在弹出的框框里选择生成的 .sof 文件 →打开 →点击左侧带有箭头的蓝色小图标 进行烧录。
- Signal Configuration板块:
①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
①Trigger flow control(触发流程控制)有两个选项:“Sequential”(顺序的)、“State-based”(基于状态的)
②Trigger position(触发位置):有三个选项:“Pre trigger position”(触发位置在前面)、Center trigger position(触发位置在中间)、Post trigger position(触发位置在后面)
③Trigger Conditions(触发条件)(这个还不太会用……以后写)
- 在 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”】
- “红色部分”会提示你此时应该进行编译。
- 回到project,点击紫色小箭头进行编译。
- 编译时会弹出框框让你保存SignalTap文件,自己给它命名并保存就好。
- 编译完成后回到SignalTap文件,此刻红色提示内容显示让你把程序下载到板子上。
- 回到project中,programming,把程序下载到板子。
- 再次回到SignalTap,会看到提示Ready to acquire。在抓取波形前要先点击SOF Manager 那里的蓝色小按钮,把程序烧录到板子里。接着可以点击带有🔍的红色小三角(如下图中橙色框框所示),它表示单次运行,抓取到的是静态波形;也可以点击带有旋转箭头的红色小三角(如下图中蓝色框框所示),它表示连续运行,抓取到的是动态波形。(下图中紫色框框里的是暂停 按钮,当开始抓取波形时,暂停按钮会变成黑色的。如需暂停抓取波形,点击它就好)
上图中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代码(在原时钟模块添加这段代码)
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
在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板子结果
--------------------------------- 完 ---------------------------------