本文以4個led燈閃爍,來介紹 SignalTap II 的使用。
一、Verilog案例
led燈以1秒的時間循環左移,代碼如下:
1 module led 2 //========================< 參數 >========================================== 3 #( 4 parameter TIME = 26'd5000_0000 //1s 5 ) 6 //========================< 端口 >========================================== 7 ( 8 input wire clk , //時鍾,50Mhz 9 input wire rst_n , //復位,低電平有效 10 output reg [ 3:0] led //4位led燈 11 ); 12 //========================< 信號 >========================================== 13 reg [25:0] cnt ; 14 wire add_cnt /*synthesis keep*/ ; 15 wire end_cnt /*synthesis keep*/ ; 16 17 //========================================================================== 18 //== 0.2秒計數 19 //========================================================================== 20 always @(posedge clk or negedge rst_n) begin 21 if(!rst_n) 22 cnt <= 'd0; 23 else if(add_cnt)begin 24 if(end_cnt) 25 cnt <= 'd0; 26 else 27 cnt <= cnt + 1'b1; 28 end 29 end 30 31 assign add_cnt = 1'b1; 32 assign end_cnt = add_cnt && cnt== TIME-1'b1; 33 34 //========================================================================== 35 //== led燈循環左移 36 //========================================================================== 37 always @(posedge clk or negedge rst_n) begin 38 if(!rst_n) begin 39 led <= 4'b1110; 40 end 41 else if(end_cnt) begin 42 led[3:0] <= {led[2:0],led[3]}; //右移:{led[0],led[3:1]}; 43 end 44 end 45 46 47 endmodule
二、SignalTap II 的使用
1、選擇 File > New 打開 SignalTap II 窗口,選擇 SignalTapII Logic Analyzer File 並單擊OK。

2、SignalTap II界面如下圖所示,保存文件並命名為 led.stp,接下來彈出的兩個對話框分別點擊 OK 和 Yes。

3,添加待觀察信號。在 Setup 標簽頁中,雙擊空白處打開 Node Finder 窗口,在 Filter 區域中選擇SignalTap II:pre-synthesis,輸入信號名字后然后單擊 List 即可找到能被觀察到的節點。我們選中 led 和 key,然后單擊 ”>” 按鈕,最后單擊OK。


接着設置這些信號之間的邏輯關系與和或,下面則是對單個信號設置觸發條件,如這里將 end_cnt 的觸發條件設置為上升沿觸發,其他信號則為 Don't care。

4、添加時鍾信號。在 Signal Configuration 面板中的單擊 Clock 部分右邊的 ”…” 打開Node Finder窗口,在 Filter 處選擇SignalTap II:pre-synthesis。輸入時鍾名字后然后單擊 List 即可找到需要的時鍾信號。我們選中 clk,然后單擊 ”>” 按鈕,最后單擊OK。


5,設置采樣和觸發的相關信息。
采樣深度:值越大,所能觀察信號的時間范圍就越大,消耗的RAM資源也越多。此處選擇128。
采樣次數:不勾選則默認為1。如果選擇為 4 32,則SignalTap會連續累計到4次采樣成功后,顯示這4次的波形,每次波形深度為32。此處不勾選。
觸發方式:有 Sequential 和 State-based,此處選擇Sequential。
觸發位置:Pre為觸發點前的深度小於觸發點后的深度,Center為觸發點的前后深度相等,Post為觸發點前的深度大於觸發點后的深度。此處選擇Center。
觸發級數:默認為1,共可選擇1-10級觸發,此處選擇1級。

6,SignalTap II與板卡連接。首先保存這次的SignalTap設置,然后回到 Quartus 點擊編譯工程生成 sof 文件。之后在 SignalTap II 窗口右上方中的 Hardware 部分單擊Setup 選擇 USB-Blaster,最后點擊 SOF Manager 部分單擊“...”選擇 sof 文件,再點擊 ↓ 將該 sof 文件下載到板卡上。

7,點擊如下按鈕即可看到在 Data 處看到觸發后的波形。


8,刪除 SignalTap II。帶有 SignalTap 的工程編譯時間會變久,因此使用完后需要刪除工程中的 SignalTap II 文件,有以下兩種常用方法。
方法1:在Quartus II界面中選擇 Assignments > Settings > SignalTap II Logic Analyzer,把 Enable SignalTap II Logic Analyzer前面的勾去掉。

方法2:在 Quartus II 界面的 Files 點擊 .stp 文件,右鍵選擇 Remove File from Project,直接從工程中去除 SignalTap II 文件。
三、多次觸發
多次觸發即上面第5條說的采樣次數,如果選擇 4 32,那么連續滿足4次采樣條件后,SignalTap 就會顯示這4次的波形,每次深度是32。如下所示:


四、多級觸發
上文說到的多級觸發其實是一種高級的 SignalTap II 使用方法。和多次觸發有所區別,多次觸發是指同一個觸發條件,多次滿足后才顯示波形。而多級觸發是依次滿足一級、二級、三級....觸發條件后,波形才會顯示。SignalTap II 中最多支持10級觸發,其順序為從左到右。
例如現在有一個工程,兩個key按鍵分別控制兩個led燈的亮滅,SignalTap II 中多級觸發選擇為2,在觸發條件中的設置如下所示。那么在捕捉觸發時,只有先按下按鍵0再按下按鍵1這個條件被滿足,SignalTap II 中才會顯示波形。

五、信號丟失的解決辦法
除開端口信號外,程序內部定義的 wire 和 reg 信號有時會被 Quartus 編譯綜合時優化掉,導致在 SignalTap II 中添加信號時找不到。解決辦法是在待觀察的 wire 信號后的分號前加上 /*synthesis keep*/;對於 reg 信號則加 /*synthesis noprune*/ 或 /*synthesis preserve*/,如下所示:
wire [15:0] a /*synthesis keep*/; reg [15:0] b /*synthesis noprune*/; reg [15:0] c /*synthesis preserve*/;
兩者的不同之處在於:/*synthesis noprune*/ 是避免 Quartus II 優化掉沒 output 的reg,而 /*synthesis preserve*/ 避免 Quartus II 將 reg 優化為常數或者合並重復的 reg,若是想觀察整個模塊中的 reg 信號,則在module之后添加/*synthesis noprune*/。
module test(clk,rst,data)/*synthesis noprune*/ ;
好像......上面的方法有時候會失效,試試加載 wire/reg前......
六、SignalTapII失效的解決辦法
有時按照步驟,根據提示進行編譯,編譯完成后下載程序,點擊觸發仍然顯示需要編譯。再次編譯下載點擊觸發又說要編譯,怎么回事?
原因:該 SignalTap 文件其實已經被工程移除的,也可能是自己在文件夾里刪除了 .stp 文件。
辦法:在該 Signaltap 頁面中 save as,另保存一下即可。
