在之前的設計開發時,利用modelsim得出中間某單元的數據,并且輸入也是設計者在testbench中自己給出的。但是,實際應用時,外部輸入的信號不一定和我們在testbench中所描述輸入的信號相同,就有可能導致RTL仿真成功,但是下板測試失敗。
signal tap logic analyzer 采集并顯示FPGA設計中的實時信號行為,從而無需額外的I/O管腳或者外部實驗室設備即可檢查正常器件操作期間內部信號的行為。
在數據獲取期間,器件中的存儲器模塊存儲采集的數據,然后通過JTAG通信電纜將數據傳輸到邏輯分析儀。
下圖為signal tap logic analyzer的任務流程。
設計要求
利用邏輯分析儀測量出電腦發送UART(波特率為115200時)是每bit時間寬度。
設計分析
在UART協議中規定了每bit的時間寬度應該是1秒鐘除以波特率,但是在實際電路中相同標號的兩個晶振也會有一定的誤差。我們可以利用邏輯分析儀(也就是利用FPGA的時鐘)去測量一下PC發送UART時的bit時間寬度。
由于波特率為115200,在采樣時,一般采用16倍頻采樣。此時采樣頻率比較高,由基礎的50MHz的時鐘不能夠做出精確的16倍頻,由此也會帶來一定的誤差。
利用邏輯分析儀就可以看到在上述兩個都有誤差的情況,真實采樣的偏差,以及偏差對我們的設計是否有影響。
設計實現
將_9_uart_drive 復制一份,命名為_10_uart_drive_signal_tap。然后打開此工程,將波特率修改為115200。
點擊tools -> signal tap logic analyzer。
在右側窗口signal configuration中,首先需要指定一個采樣時鐘信號。
邏輯分析儀在采樣時鐘的每個上升沿進行數據采樣。邏輯分析儀不支持在采樣時鐘的下降沿進行數據采樣。設計中的任何信號都可以用作采樣時鐘。但是,為了獲得最佳的數據采樣結果,請使用與被測信號同步的全局時鐘。
在本設計中,所有的信號都是由外部的clk信號進行驅動的,所以此采樣時鐘,選擇為clk。點擊clock對話框后面的三個點。將filter選擇為pin:all,點擊list,在matching nodes中選擇clk,點擊“大于”,在nodes found中出現clk,然后點擊ok。
配置完采樣時鐘信號后,需要配置采樣深度。
針對被采樣的數據中的每個信號,采樣深度指定了采樣和存儲的樣本的數量。在器件存儲器資源有限的情況下,由于所選的深度太大,設計可能無法編譯。此時需要降低采樣深度以減少資源使用。
采樣深度乘以采樣的間隔就確定了采樣的時間寬度。現在我們要做的是采樣一個UART的協議幀,一個協議幀共有12個bit。按照115200的波特率,采樣的時間寬度應該是104166ns,所以采樣深度應該是5208,在此選擇采樣深度為8K。
當確定好采樣深度后,可以指定邏輯分析儀在觸發事件之前和之后 采樣的數據量。
邏輯分析儀提供三種選擇。Pre表示12%的存儲深度用作觸發事件之前,88%的存儲深度用作觸發事件之后;Center表示50%的存儲深度用作觸發事件之前,50%的存儲深度用作觸發事件之后;Post表示88%的存儲深度用作觸發事件之前,12%的存儲深度用作觸發事件之后。
在此選擇Pre。
配置好這些信息后,開始添加需要觀測的信號。
在setup界面,在空白界面雙擊,添加想要觀測的信號。
需要觀測的信號有uart_txd、uart_rxd、cap_cnt。
uart_txd和uart_rxd為端口信號,選擇filter時,選擇PIN:all即可,cap_cnt為內部信號,選擇filter時,選擇signal tap :pre-synthesis。
將uart_rxd的下降沿設置為觸發條件。
在uart_rxd的trigger conditions的位置,右擊,選擇falling edge。
點擊保存,保存到qprj,命名為stp1.stp。
使能邏輯分析儀。點擊Yes。
回到quartus界面,進行綜合分析并形成配置文件。
在工程向導的結構界面,可以看到在結構中出現了兩個未知的組件。這兩個就是邏輯分析儀。
在報告中,可以看到使用的邏輯資源和存儲器資源增多。
回到signal tap界面,并且連接PC和開發板。
在hardware中,選擇USB – blaster。
點擊sof manager后面的三個小點,選擇生成的sof文件,然后點擊下載。
點擊運行分析。
此時邏輯分析儀就在等待被觸發。
觸發條件為uart_rxd的下降沿,打開串口助手,配置好后,發送一個數據11。
發送之后,邏輯分析儀中出現了波形。因為發送為11,發送數據從低位開始,故而第一個數據應該為1。所以第一端低電平為起始位,可以通過采樣的數字標號,確定它的時間寬度。
左鍵是放大,右鍵是縮小。
左側為0,因為利用下降沿作為觸發條件。放大左側數字為434。
所以起始位的時間寬度為434x20ns,即8680ns。按照波特率為115200計算,每一個bit的時間寬度應該是8680.5556ns。這就證明PC發過來的bit的時間寬度和我們所預想的是一致的。
可以用此方法測量其他的bit的寬度,有的bit的寬度要比8680ns要少,有的bit的寬度要比8680ns要多,但是偏差不多。
由于真正的寬度和我們認為的寬度有一定的區別。但是設計是按照每個bit的寬度都是20ns的整數倍,所以在采樣時,就會有偏差。通過cap_cnt可以看出來,并且隨著采樣的越長,誤差累計就會越大。
在數據的第一個bit時,cap_cnt等于7,馬上要變為8。按照cap_cnt的計數規律是波特率的16倍頻設計,所以后面所有的bit起始時,都應該是16 *N + 7,并且馬上要變為16 * N + 8。但是真實的時間寬度和預想的時間寬度有一定的偏差。
在最后的校驗位的起始時,cap_cnt的數據按照16倍頻采樣來說,應該是135,然后快變為136才對。但是此時已經等于136,并且馬上變137。
我們是按照cap_cnt去進行采樣的(在cap_cnt變化的位置采樣)。
因為有誤差,所以規定UART的協議幀的長度不能夠過長。即中間的數據位的個數不能隨意增加。
上述分析步驟的數字只是筆者的測驗結果,不同的PC和開發板測試時,可能會得到不同的結果。
邏輯分析儀總結
利用邏輯分析儀可以直接查看到開發板內部運行的波形。所以在很多時候,都是利用邏輯分析儀進行板級測試作為最終結果。
如果不需要工程中的邏輯分析儀,可以打開assignments -> settings –> signal tap logic analyzer,將使能的對勾去掉,然后重新編譯就可以了。
審核編輯:劉清
評論
查看更多