一、軟件與硬件平臺(tái)
軟件平臺(tái):
操作系統(tǒng):Windows 8.1
開發(fā)套件:ISE14.7
硬件平臺(tái):
FPGA型號(hào):XC6SLX45-CSG324
二、ChipScope介紹
ChipScope是Xilinx提供的一個(gè)校驗(yàn)FPGA設(shè)計(jì)的工具。它的本質(zhì)是一個(gè)虛擬的邏輯分析儀,能調(diào)用FPGA內(nèi)部的邏輯資源對(duì)代碼中的各個(gè)變量進(jìn)行抓取分析。與ModelSim等一些其他的FPGA仿真工具不同的是,ChipScope可以直接反映代碼在實(shí)際硬件上的執(zhí)行情況,從而能夠更加有效的定位設(shè)計(jì)中的問題。
三、目標(biāo)任務(wù)
本文會(huì)以一個(gè)4-bit的計(jì)數(shù)器為例來給大家演示如何使用ChipScope來校驗(yàn)這個(gè)計(jì)數(shù)器的功能。對(duì)于一個(gè)4-bit的計(jì)數(shù)器來說,計(jì)數(shù)器的最低位bit0是時(shí)鐘信號(hào)的2分頻,bit1是時(shí)鐘信號(hào)的4分頻,bit2是時(shí)鐘信號(hào)的8分頻,最高位bit3是時(shí)鐘信號(hào)的16分頻。接下來,我們就利用ChipScope來驗(yàn)證這個(gè)邏輯的正確性。
我的開發(fā)板上有四個(gè)LED燈和四個(gè)按鍵,所以我會(huì)把計(jì)數(shù)器的4-bit分別綁定到四個(gè)LED燈上面,然后在邏輯里面設(shè)計(jì)一個(gè)異步復(fù)位按鈕用來復(fù)位這個(gè)計(jì)數(shù)器,同時(shí)設(shè)計(jì)這個(gè)異步復(fù)位還有一個(gè)目的就是用來設(shè)置初始的觸發(fā)條件,這一點(diǎn)后面會(huì)詳細(xì)介紹。
四、待測代碼
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
寫好待測代碼,并添加物理約束文件綁定好管腳,我的開發(fā)板上的約束文件如下
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 NET O_led_out<0> LOC = V5 | IOSTANDARD = "LVCMOS33"; ## LED1 NET O_led_out<1> LOC = R3 | IOSTANDARD = "LVCMOS33"; ## LED2 NET O_led_out<2> LOC = T3 | IOSTANDARD = "LVCMOS33"; ## LED3 NET O_led_out<3> LOC = T4 | IOSTANDARD = "LVCMOS33"; ## LED4
五、ChipScope使用完整流程
1、利用上面的待測代碼和約束文件在ISE14.7中建立一個(gè)新工程。然后點(diǎn)擊Synthesize-XST把整個(gè)工程綜合一遍。
2、選中頂層模塊名led_top,然后鼠標(biāo)右鍵選擇New Source選項(xiàng),在彈出的New Source Wizard界面中選擇第二個(gè)ChipScope Definition and Connection File選項(xiàng),并取名字ChipScope_LED(名字可以隨便取),然后點(diǎn)擊Next
3、點(diǎn)擊Next以后在彈出的一下對(duì)話框中點(diǎn)擊Finish
4、Finish點(diǎn)擊完畢以后,等一段時(shí)間,工程的層次目錄就多出來了一個(gè)后綴為.cdc的ChipScope文件
5、雙擊ChipScope_LED.cdc文件,會(huì)彈出下面的界面,使用默認(rèn)的設(shè)置保證Use SRLs和Use RPMs處于選中狀態(tài)
Use SRLs(SRL = Shift Register LUT)選項(xiàng)使編譯器用移位寄存器的查找表(Shift Register LUTs)代替觸發(fā)器(flip flops)和乘法器,因此它能有效的減少FPGA內(nèi)部資源,提高ChipScope性能
Use RPMs(RPM = Relationally Placed Macros)包含RLOC約束,RLOC定義了潛在設(shè)計(jì)原語的順序與結(jié)構(gòu)。Use RPMs讓編譯器用FMAP,HMAP,ROM,RAM等相關(guān)聯(lián)的宏模塊,使邏輯塊布局的更加合理,可以有效的提高速度與性能,并節(jié)省FPGA資源
6、上一步選擇完并點(diǎn)擊Next后彈出如下界面,這個(gè)界面保持默認(rèn)設(shè)置
7、繼續(xù)點(diǎn)擊Next彈出如下界面。在這個(gè)界面中選擇觸發(fā)端口(Trigger Ports)的數(shù)目和它們各自的寬度(Trigger Width),
說明:
a、這里建議先把觸發(fā)寬度(Trigger Width)選擇為最大值256,后面等信號(hào)添加完畢以后在回來修改為信號(hào)的總寬度。這么做是因?yàn)樵谝粋€(gè)比較復(fù)雜的設(shè)計(jì)中,你事先根本不知道自己要抓多少信號(hào),所以等你把要抓的信號(hào)都設(shè)置好了以后在回來修改這個(gè)參數(shù)是比較好的選擇。
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 |
表中各參數(shù)的含義如下:
參數(shù) | 含義 |
0 | 低電平 |
1 | 高電平 |
X | 不定值 |
R | 上升沿(Rising) |
F | 下降沿(Falling) |
B | 雙邊沿(Both Edge) |
N | 非邊沿(No Edge) |
= | 等于 |
<> | 不等于 |
小于 | |
<= | 小于等于 |
> | 大于 |
>= | 大于等于 |
in range | 在某個(gè)范圍內(nèi) |
not in range | 不在某個(gè)范圍內(nèi) |
由于本例比較簡單,所以Match Type選擇為Basic就可以了
c、Enable Trigger Sequencer選項(xiàng)指定了觸發(fā)隊(duì)列的級(jí)數(shù),這個(gè)值保持默認(rèn)即可。觸發(fā)隊(duì)列的結(jié)構(gòu)圖如下圖所示
d、Enable Storage Qualification選項(xiàng)可以通過用戶自定義的條件去過濾捕獲的數(shù)據(jù),這個(gè)選項(xiàng)一般讓它默認(rèn)選上
8、點(diǎn)擊Next進(jìn)入Capture Parameter選項(xiàng)卡,這一頁在這個(gè)例子中保持默認(rèn)參數(shù)即可
說明:
a、Data Depth指的是當(dāng)觸發(fā)條件滿足以后,采樣的數(shù)據(jù)的個(gè)數(shù)。這個(gè)值設(shè)置的越大,那么你得到的信息就越多,但相應(yīng)的占用的FPGA內(nèi)部的資源也越多。如果你想抓取UART和IIC的數(shù)據(jù),由于UART和IIC協(xié)議的傳輸速度較慢,所以這個(gè)值必須設(shè)置大一點(diǎn)才能看到比較多的信息,而對(duì)于SPI這種傳輸速度比較快的協(xié)議,這個(gè)值可以設(shè)置的小一些。
b、Data Same As Trigger選項(xiàng)的意思是你抓取的信號(hào)既可以觸發(fā)信號(hào),也可以作為數(shù)據(jù)信號(hào)。這里給大家一個(gè)建議,對(duì)于inout信號(hào)(雙向信號(hào)),最好選擇只作為數(shù)據(jù)信號(hào),不作為觸發(fā)信號(hào)。
9、點(diǎn)擊Next,進(jìn)入Net Connections選項(xiàng)頁
10、雙擊紅色的CLOCK PORT選項(xiàng),在彈出的界面中按照下圖1、2、3的順序把時(shí)鐘信號(hào)連上
11、連好時(shí)鐘信號(hào)以后點(diǎn)擊OK,返回到Net Connections界面,發(fā)現(xiàn)CLOCK PORT已經(jīng)由紅色變成了黑色,說明時(shí)鐘設(shè)置成功
12、接著雙擊紅色的TRIGGER PORTS,在彈出的界面中按照下圖1、2、3的順序設(shè)置要抓取的信號(hào)
13、要抓取的信號(hào)設(shè)置完畢以后點(diǎn)擊OK返回Net Connections選項(xiàng)頁,發(fā)現(xiàn)TRIGGER PORTS還是紅色的,這是因?yàn)槲覀兿惹霸O(shè)置的要抓取信號(hào)的總寬度是256,而這里我們只抓了5個(gè)信號(hào),所以需要返回Trigger Parameter頁把Trigger Width設(shè)置為5
14、設(shè)置正確的Trigger Width以后,在回到Net Connections選項(xiàng)頁可以發(fā)現(xiàn)TRIGGER PORTS已經(jīng)變成黑色的了,說明信號(hào)連接全部設(shè)置正確。然后點(diǎn)擊Return To Project Navigator
15、在彈出的Save Project對(duì)話框中選擇“是”
至此,整個(gè).cdc文件的設(shè)置過程全部設(shè)置完畢。
16、接著雙擊Generate Programming File生成bit文件
17、連接好開發(fā)板的Jtag線并上電。雙擊上張圖片最后一個(gè)選項(xiàng)Analyze Design Using ChipScope打開ChipScope界面如下所示
18、如果Jtag連接正常的話,會(huì)彈出下面的窗口,這個(gè)窗口表示找到了開發(fā)板使用的FPGA型號(hào)為XC6SLX45
19、點(diǎn)擊OK,左上角的P標(biāo)簽變成了綠色,Jtag Chain多出了FPGA型號(hào)這個(gè)標(biāo)簽
20、左鍵單擊選中DEV:0 MyDevice0 (XC6SLX45),然后右鍵彈出菜單欄,在菜單欄中選擇Configure..
21、在彈出的界面中勾選Import Design-level CDC File和Auto-create Buses兩個(gè)選項(xiàng)
22、點(diǎn)擊OK,bit文件就被下載到了開發(fā)板中,然后進(jìn)入以下界面
23、雙擊Trigger Setup和Waveform分別打開設(shè)置觸發(fā)的窗口和波形窗口
觸發(fā)窗口中的Depth就是我們之前在.cdc文件中設(shè)置要抓取的數(shù)據(jù)深度,Position這個(gè)參數(shù)默認(rèn)情況是0,但是建議最好設(shè)置一個(gè)偏移量,這里我設(shè)置的是100,它表示的是把觸發(fā)條件滿足之前的100個(gè)數(shù)據(jù)和觸發(fā)條件滿足之后的924(1024-100)個(gè)數(shù)據(jù)顯示到波形窗口中,這樣我們就可以捕捉到在觸發(fā)之前的一部分信息,更有助于問題的定位。Storage Qualification這個(gè)參數(shù)就是之前在.cdc文件勾選了Enable Storage Qualification這個(gè)選項(xiàng)后才有的,一般選擇默認(rèn)的All Data。
波形窗口是顯示要抓取的波形的窗口,這里還沒開始抓取,所以顯示為空。
24、點(diǎn)擊右上角的1號(hào)圖標(biāo),把Trigger Setup窗口放大,然后設(shè)置觸發(fā)條件為I_rst_n為R(R表示上升沿觸發(fā)),接著點(diǎn)擊3號(hào)圖標(biāo)進(jìn)入等待觸發(fā)狀態(tài)
25、等待觸發(fā)狀態(tài)
26、按一下開發(fā)板上I_rst_n信號(hào)綁定的按鈕,使觸發(fā)條件滿足,波形窗口出現(xiàn)了抓到的波形
上圖中紅色的T標(biāo)尺代表的觸發(fā)的起始位置,它的位置不能移動(dòng);綠色的O和藍(lán)色的X是兩個(gè)可移動(dòng)標(biāo)尺,他們兩個(gè)的絕對(duì)位置以及差值均顯示在波形窗口的右下角,有時(shí)候需要測量兩個(gè)關(guān)鍵點(diǎn)的差值就可以拖動(dòng)這兩個(gè)標(biāo)尺來直接得出結(jié)果
27、按住鼠標(biāo)左鍵在波形窗口中畫一個(gè)矩形框可以把波形窗口放大,可以看到更多的波形細(xì)節(jié)
28、如果我想讓O_led_out為4’b0010的時(shí)候觸發(fā),那么修改觸發(fā)條件為如下圖所示,然后點(diǎn)擊觸發(fā)按鈕
29、由于我們?cè)O(shè)置的O_led_out一直在自增,所以不需要按按鍵,等O_led_out為4’b0010觸發(fā)條件滿足就可以觸發(fā)了,觸發(fā)以后的波形如下圖所示
顯然觸發(fā)位置在O_led_out為4’b0010的位置,和之前設(shè)置的相同。
30、如果你想查看O_led_out總線每一個(gè)bit的波形情況,可以點(diǎn)擊一下信號(hào)名前面的小圖標(biāo)展開
31、如果你想看O_led_out總線的模擬波形,那么你可以雙擊Bus Plot標(biāo)簽,在彈出的界面中選中O_led_out總線就可以了
32、更多的功能大家有空可以多多嘗試。至此ChipScope的教程就完畢了。
六、如何防止信號(hào)被優(yōu)化
在一個(gè)復(fù)雜的設(shè)計(jì)中,我們往往會(huì)抓大量的信號(hào),而ISE14.7編譯代碼的時(shí)候會(huì)把一些有相同邏輯的信號(hào)給優(yōu)化掉,這會(huì)導(dǎo)致我們?cè)谶x擇信號(hào)的時(shí)候找不到想要抓取的信號(hào),針對(duì)這種情況給大家提供兩個(gè)解決辦法。
方法一:
1、在你想要抓取的所有信號(hào)前面加上(*KEEP = “TRUE”*)
(*KEEP = "TRUE"*)reg [3:0] R_cnt;
2、選中Synthesize-XST,鼠標(biāo)右鍵在彈出的菜單欄中選擇Process Properties...
3、在彈出的窗口中選擇-keep_hierarchy為Soft,(Yes和Soft的區(qū)別我暫時(shí)不清楚,但是我習(xí)慣于選擇Soft,希望有網(wǎng)友能提供答案以及來源,謝謝)
4、設(shè)置完畢以后重新綜合,然后重新在.cdc選擇要抓取的信號(hào)
方法二:
上面一種方法根據(jù)我的經(jīng)驗(yàn)并不能100%的保證信號(hào)不被綜合掉,所以還有另外一種方法是寫一段冗余邏輯把信號(hào)進(jìn)行運(yùn)算然后賦值給一個(gè)輸出,并把輸出引到頂層綁定一個(gè)空閑的管腳,這種情況我的處理方法是:
假設(shè)要抓取的信號(hào)是(*KEEP = "TRUE"*)reg [3:0] R_cnt;
1、定義1個(gè)輸出信號(hào)O_test;
Output O_test;
2、把要抓取的信號(hào)各位相或然后賦值給O_test
assign O_test = | R_cnt ;
R_cnt前面的“|”表示把R_cnt的每一bit按位相或,這行代碼和
assign O_test = R_cnt[0] | R_cnt[1] | R_cnt[2] ;
綜合出來的邏輯是一模一樣的
3、把O_test引到頂層并在約束文件中分配一個(gè)空余管腳
通過這種增加冗余邏輯的方式,R_cnt信號(hào)一般不會(huì)被綜合掉,我自己在平時(shí)的使用中會(huì)先使用第一種方法,如果發(fā)現(xiàn)第一種方法還是把我想看的關(guān)鍵信號(hào)綜合掉了的話就采用第二種方法。
七、采用例化ILA核的方式抓信號(hào)
除了采用.cdc文件抓取信號(hào)以外,還有一種方式是采用例化ILA核的方式抓信號(hào)的時(shí)序。這種方式的詳細(xì)操作流程如下:
1、添加一個(gè)新的ICON IP核
2、一般情況下保持所有的參數(shù)默認(rèn)就可以了
3、再添加一個(gè)ILA 的IP核
4、在第一頁設(shè)置好相關(guān)的參數(shù),這些參數(shù)的含義核.cdc文件中參數(shù)的含義一模一樣,這里不再過多解釋
5、第二頁主要是設(shè)置要抓取的信號(hào)寬度,值得注意的是這里可以設(shè)置大一點(diǎn)沒關(guān)系,因?yàn)檫@種方法不要求信號(hào)寬度和要抓的信號(hào)數(shù)目完全相同
6、生成這個(gè)兩個(gè)IP核以后,把這兩個(gè)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抓取信號(hào)了,和前一種方法一樣。
這種方法和前一種方法的區(qū)別在于這種方法只能抓取一個(gè).v文件中的信號(hào),而且速度生成IP核的比較慢,進(jìn)入ChipScope中以后還需要自己修改端口的名字,比較浪費(fèi)時(shí)間;好處就是可以100%保證抓到想抓的信號(hào),所以對(duì)于邏輯不太復(fù)雜的單文件代碼可以采用這種方式。不過我個(gè)人還是比較喜歡用.cdc文件的方式來抓信號(hào)。
八、總結(jié)
1、用ILA邏輯分析儀抓信號(hào)有兩種方式:.cdc文件方式(推薦)和例化ILA核方式
2、在cdc文件中防止信號(hào)被優(yōu)化有兩種方式:keep_hierarchy選為Soft,增加冗余邏輯
審核編輯:劉清
-
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
26449 -
led燈
+關(guān)注
關(guān)注
22文章
1592瀏覽量
107663 -
ROM
+關(guān)注
關(guān)注
4文章
549瀏覽量
85576 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2248瀏覽量
94185
原文標(biāo)題:【設(shè)計(jì)經(jīng)驗(yàn)】2、ISE中ChipScope使用教程
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論