【設計經驗】2、ChipScope使用教程

來源:互聯網
上載者:User

標籤:import   過程   指定   rom   關注   完全   macro   查看   滑鼠   

一、軟體與硬體平台

       軟體平台:

    作業系統:Windows 8.1

    開發套件:ISE14.7

       硬體平台:

              FPGA型號:XC6S45X-CSG324

二、ChipScope介紹

  ChipScope是Xilinx提供的一個校正FPGA設計的工具。它的本質是一個虛擬邏輯分析儀,能調用FPGA內部的邏輯資源對代碼中的各個變數進行抓取分析。與ModelSim等一些其他的FPGA模擬工具不同的是,ChipScope可以直接反映代碼在實際硬體上的執行情況,從而能夠更加有效定位設計中的問題。

三、目標任務

       本文會以一個4-bit的計數器為例來給大家示範如何使用ChipScope來校正這個計數器的功能。對於一個4-bit的計數器來說,計數器的最低位bit0是時鐘訊號的2分頻,bit1是時鐘訊號的4分頻,bit2是時鐘訊號的8分頻,最高位bit3是時鐘訊號的16分頻。接下來,我們就利用ChipScope來驗證這個邏輯的正確性。

       我的開發板上有四個LED燈和四個按鍵,所以我會把計數器的4-bit分別綁定到四個LED燈上面,然後在邏輯裡面設計一個非同步複位按鈕用來複位這個計數器,同時設計這個非同步複位還有一個目的就是用來設定初始的觸發條件,這一點後面會詳細介紹。

四、待測代碼
module led_top(input                I_clk            ,input                I_rst_n          ,output  reg [3:0]    O_led_out    );                               always @(posedge I_clk or negedge I_rst_n)begin       if(!I_rst_n)         O_led_out <=      4‘d0 ;       else         O_led_out <= O_led_out + 1‘b1 ;end  endmodule

寫好待測代碼,並添加物理約束檔案綁定好管腳,我的開發板上的約束檔案如下

##NET I_clk LOC = V10 | TNM_NET = sys_clk_pin | IOSTANDARD = "LVCMOS33";TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz;####NET I_rst_n           LOC = N4 | IOSTANDARD = "LVCMOS15"; ## SW2 pushbutton##########LED Pin define#####################NET O_led_out<0>    LOC = V5 | IOSTANDARD = "LVCMOS33";       ## LED1NET O_led_out<1>    LOC = R3 | IOSTANDARD = "LVCMOS33";       ## LED2NET O_led_out<2>    LOC = T3 | IOSTANDARD = "LVCMOS33";       ## LED3NET O_led_out<3>    LOC = T4 | IOSTANDARD = "LVCMOS33";       ## LED4
五、ChipScope使用完整流程

1、利用上面的待測代碼和約束檔案在ISE14.7中建立一個新工程。然後點擊Synthesize-XST把整個工程綜合一遍。

 

2、選中頂層模組名led_top,然後滑鼠右鍵選擇New Source選項,在彈出的New Source Wizard介面中選擇第二個ChipScope Definition and Connection File選項,並取名字ChipScope_LED(名字可以隨便取),然後點擊Next

 

3、點擊Next以後在彈出的一下對話方塊中點擊Finish

 

4、Finish點擊完畢以後,等一段時間,工程的層次目錄就多出來了一個尾碼為.cdc的ChipScope檔案

 

5、雙擊ChipScope_LED.cdc檔案,會彈出下面的介面,使用預設的設定保證Use SRLs和Use RPMs處於選中狀態

 

  Use SRLs(SRL = Shift Register LUT)選項使編譯器用移位寄存器的尋找表(Shift Register LUTs)代替觸發器(flip flops)和乘法器,因此它能有效減少FPGA內部資源,提高ChipScope效能

  Use RPMs(RPM = Relationally Placed Macros)包含RLOC約束,RLOC定義了潛在設計原語的順序與結構。Use RPMs讓編譯器用FMAP,HMAP,ROM,RAM等相關聯的宏模組,使邏輯塊布局的更加合理,可以有效提高速度與效能,並節省FPGA資源

6、上一步選擇完並點擊Next後彈出如下介面,這個介面保持預設設定

 

7、繼續點擊Next彈出如下介面。在這個介面中選擇觸發連接埠(Trigger Ports)的數目和它們各自的寬度(Trigger Width),

 

  說明:

  a、這裡建議先把觸發寬度(Trigger Width)選擇為最大值256,後面等訊號添加完畢以後在回來修改為訊號的總寬度。這麼做是因為在一個比較複雜的設計中,你事先根本不知道自己要抓多少訊號,所以等你把要抓的訊號都設定好了以後在回來修改這個參數是比較好的選擇。

  b、Match Type的類型一共有6種,每種支援的實值型別與功能見下表

Match Type

Bit Values

Functions

Basic

0,1,X

=,<>

Basic w/edges

0,1,X,R,F,B,N

=,<>

Extended

0,1,X

=,<>,>,>=,<,<=

Extended w/edges

0,1,X,R,F,B,N

=,<>,>,>=,<,<=

Range

0,1,X

=,<>,>,>=,<,<=,in range,not in range

Range w/edges

0,1,X,R,F,B,N

=,<>,>,>=,<,<=,in range,not in range

  表中各參數的含義如下:

參數

含義

0

低電平

1

高電平

X

不定值

R

上升沿(Rising)

F

下降沿(Falling)

B

雙邊沿(Both Edge)

N

非邊沿(No Edge)

=

等於

<> 

不等於

小於

<=

小於等於

大於

>=

大於等於

in range

在某個範圍內

not in range

不在某個範圍內

 

 

  由於本例比較簡單,所以Match Type選擇為Basic就可以了

  c、Enable Trigger Sequencer選項指定了觸發隊列的級數,這個值保持預設即可。觸發隊列的結構圖如所示

 

  d、Enable Storage Qualification選項可以通過使用者自訂的條件去過濾捕獲的資料,這個選項一般讓它預設選上

8、點擊Next進入Capture Parameter選項卡,這一頁在這個例子中保持預設參數即可

 

  說明:

  a、Data Depth指的是當觸發條件滿足以後,採樣的資料的個數。這個值設定的越大,那麼你得到的資訊就越多,但相應的佔用的FPGA內部的資源也越多。如果你想抓取UART和IIC的資料,由於UART和IIC協議的傳輸速度較慢,所以這個值必須設定大一點才能看到比較多的資訊,而對於SPI這種傳輸速度比較快的協議,這個值可以設定的小一些。

  b、Data Same As Trigger選項的意思是你抓取的訊號既可以觸發訊號,也可以作為資料訊號。這裡給大家一個建議,對於inout訊號(雙向訊號),最好選擇只作為資料訊號,不作為觸發訊號。

9、點擊Next,進入Net Connections選項頁

 

10、雙擊紅色的CLOCK PORT選項,在彈出的介面中按照1、2、3的順序把時鐘訊號連上

 

11、連好時鐘訊號以後點擊OK,返回到Net Connections介面,發現CLOCK PORT已經由紅色變成了黑色,說明時鐘設定成功,接著雙擊紅色的TRIGGER PORTS,在彈出的介面中設定要抓取的訊號

 

12、要抓取的訊號設定完畢以後點擊OK返回Net Connections選項頁,發現TRIGGER PORTS還是紅色的,這是因為我們先前設定的要抓取訊號的總寬度是256,而這裡我們只抓了5個訊號,所以需要返回Trigger Parameter頁把Trigger Width設定為5

 

13、設定正確的Trigger Width以後,在回到Net Connections選項頁可以發現TRIGGER PORTS已經變成黑色的了,然後點擊Return To Project Navigator

 

14、在彈出的Save Project對話方塊中選擇“是”

 

  至此,整個.cdc檔案的設定過程全部設定完畢。

15、接著雙擊Generate Programming File產生bit檔案

 

16、串連好開發板的Jtag線並上電。雙擊Analyze Design Using ChipScope開啟ChipScope介面如下所示

 

17、如果Jtag串連正常的話,會彈出下面的視窗,這個視窗表示找到了開發板使用的FPGA型號為XC6SLX45

 

18、點擊OK,左上方的P標籤變成了綠色,Jtag Chain多出了FPGA型號這個標籤

 

19、左鍵單擊選中DEV:0 MyDevice0 (XC6SLX45),然後右鍵快顯功能表欄,在功能表列中選擇Configure..

 

20、在彈出的介面中勾選Import Design-level CDC File和Auto-create Buses兩個選項

 

21、點擊OK,bit檔案就被下載到了開發板中,然後進入以下介面

 

22、雙擊Trigger Setup和Waveform分別開啟設定觸發的視窗和波形視窗

 

  觸發視窗中的Depth就是我們之前在.cdc檔案中設定要抓取的資料深度,Position這個參數預設情況是0,但是建議最好設定一個位移量,這裡我設定的是100,它表示的是把觸發條件滿足之前的100個資料和觸發條件滿足之後的924(1024-100)個資料顯示到波形視窗中,這樣我們就可以捕捉到在觸發之前的一部分資訊,更有助於問題的定位。Storage Qualification這個參數就是之前在.cdc檔案勾選了Enable Storage Qualification這個選項後才有的,一般選擇預設的All Data。

波形視窗是顯示要抓取的波形的視窗,這裡還沒開始抓取,所以顯示為空白。

23、點擊右上方的1號表徵圖,把Trigger Setup視窗放大,然後設定觸發條件為I_rst_n為R(R表示上升沿觸發),接著點擊3號表徵圖進入等待觸發狀態

 

24、等待觸發狀態

 

25、按一下開發板上I_rst_n訊號綁定的按鈕,使觸發條件滿足,波形視窗出現了抓到的波形

 

  中紅色的T尺規代表的觸發的起始位置,它的位置不能移動;綠色的O和藍色的X是兩個可移動尺規,他們兩個的絕對位置以及差值均顯示在波形視窗的右下角,有時候需要測量兩個關鍵點的差值就可以拖動這兩個尺規來直接得出結果

26、用滑鼠在波形視窗中畫一個矩形框可以把波形視窗放大,可以看到更多的波形細節

 

27、如果我想讓O_led_out為4’b0010的時候觸發,那麼修改觸發條件為如所示,然後點擊觸發按鈕

 

28、由於我們設定的O_led_out一直在自增,所以不需要按按鍵,等O_led_out為4’b0010觸發條件滿足就可以觸發了,觸發以後的波形如所示

 

  顯然觸發位置在O_led_out為4’b0010的位置,和之前設定的相同。

29、如果你想查看O_led_out匯流排每一個bit的波形情況,可以點擊一下訊號名前面的小表徵圖展開

 

30、如果你想看O_led_out匯流排的類比波形,那麼你可以雙擊Bus Plot標籤,在彈出的介面中選中O_led_out匯流排就可以了

 

30、更多的功能大家有空可以多多嘗試。至此ChipScope的教程就完畢了。

六、如何防止訊號被最佳化

在一個複雜的設計中,我們往往會抓大量的訊號,而ISE14.7編譯代碼的時候會把一些有相同邏輯的訊號給最佳化掉,這會導致我們在選擇訊號的時候找不到想要抓取的訊號,針對這種情況給大家提供兩個解決辦法。

方法一:

1、在你想要抓取的所有訊號前面加上(*KEEP = “TRUE”*)

       (*KEEP = "TRUE"*)reg [3:0] R_cnt;

 

2、選中Synthesize-XST,滑鼠右鍵在彈出的功能表列中選擇Process Properties...

 

3、在彈出的視窗中選擇-keep_hierarchy為Soft,(Yes和Soft的區別我暫時不清楚,但是我習慣於選擇Soft,希望有網友能提供答案以及來源,謝謝)

 

4、設定完畢以後重新綜合,然後重新在.cdc選擇要抓取的訊號

方法二:

上面一種方法根據我的經驗並不能100%的保證訊號不被綜合掉,所以還有另外一種方法是寫一段冗餘邏輯把訊號進行運算然後賦值給一個輸出,並把輸出引到頂層綁定一個閒置管腳,這種情況我的處理方法是:

假設要抓取的訊號是(*KEEP = "TRUE"*)reg [3:0] R_cnt;

1、定義1個輸出訊號O_test;

       Output O_test;

2、把要抓取的訊號各位相或然後賦值給O_test

       assign O_test = | R_cnt ;

       R_cnt前面的“|”表示把R_cnt的每一bit按位相或

3、把O_test引到頂層並在約束檔案中分配一個空餘管腳

通過這種增加冗餘邏輯的方式,R_cnt訊號一般不會被綜合掉,我自己在平時的使用中會先使用第一種方法,如果發現第一種方法還是把我想看的關鍵訊號綜合掉了的話就採用第二種方法。

七、採用例化ILA核的方式抓訊號

除了採用.cdc檔案抓取訊號以外,還有一種方式是採用例化ILA核的方式抓訊號的時序。這種方式的詳細操作流程如下:

1、添加一個新的ICON IP核

 

2、一般情況下保持所有的參數預設就可以了

 

3、再添加一個ILA 的IP核

 

4、在第一頁設定好相關的參數,這些參數的含義核.cdc檔案中參數的含義一模一樣,這裡不再過多解釋

 

5、第二頁主要是設定要抓取的訊號寬度,指的注意的是這裡可以設定大一點沒關係,因為這種方法不要求訊號寬度和要抓的訊號數目完全相同

 

6、產生這個兩個IP核以後,把這兩個IP核例化到代碼中

module led_top(input             I_clk            ,input             I_rst_n          ,output  reg [3:0] O_led_out    );                               always @(posedge I_clk or negedge I_rst_n)begin  if(!I_rst_n)    O_led_out <=      4‘d0 ;  else    O_led_out <= O_led_out + 1‘b1 ;end   wire [35:0]     CONTROL0;wire [7:0]      TRIG;icon icon_debug (    .CONTROL0(CONTROL0) // INOUT BUS [35:0]);ila ila_debug (    .CONTROL(CONTROL0), // INOUT BUS [35:0]    .CLK(I_clk),      // IN    .TRIG0(TRIG)      // IN BUS [7:0]);                                                  assign  TRIG[0]=I_rst_n;assign  TRIG[4:1]=O_led_out;   endmodule

 

  接下來就是產生bit檔案並用ChipScope抓取訊號了,和前一種方法一樣。

  這種方法和前一種方法的區別在於這種方法只能抓取一個.v檔案中的訊號,而且速度產生IP核的比較慢,進入ChipScope中以後還需要自己修改連接埠的名字,比較浪費時間;好處就是可以100%保證抓到想抓的訊號,所以對於邏輯不太複雜的單檔案代碼可以採用這種方式。不過我個人還是比較喜歡用.cdc檔案的方式來抓訊號。

八、總結

1、用ILA邏輯分析儀抓訊號有兩種方式:.cdc檔案方式(推薦)和例化ILA核方式

2、在cdc檔案中防止訊號被最佳化有兩種方式:keep_hierarchy選為Soft,增加冗餘邏輯

 

歡迎關注我的公眾號:FPGA之禪

【設計經驗】2、ChipScope使用教程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.