日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FPGA|Signal Tap抓取波形

發布時間:2024/3/24 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FPGA|Signal Tap抓取波形 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇內容包括兩部分:
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) beginif(CNT >= MAX) CNT <= 0; else CNT <= CNT + 1'b1;endalways @(CNT) begin if (CNT == MAX) CLK1 = 1'b1; else CLK1 = 1'b0; end

    在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 endmodule

    BDF原理圖

    fpga板子結果

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

    總結

    以上是生活随笔為你收集整理的FPGA|Signal Tap抓取波形的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。