0.FPGA也能片上調(diào)試嗎?
FPGA與STM32等嵌入式開發(fā)最大的一個(gè)優(yōu)點(diǎn)就是,可以在時(shí)序仿真階段驗(yàn)證超過(guò)90%的功能,發(fā)現(xiàn)90%的問(wèn)題。當(dāng)所有的仿真沒(méi)問(wèn)題了,才能進(jìn)行最后一步:板級(jí)調(diào)試。如果仿真都不對(duì),那就沒(méi)必要下載到芯片里了。
STM32等單片機(jī),使用J-Link或ST-Link等調(diào)試器,可以進(jìn)行在線調(diào)試,由于C代碼是順序執(zhí)行的,我們可以插入斷點(diǎn),讓程序停在我們需要的位置,或者是實(shí)時(shí)查看一些變量的數(shù)值,大大提高了我們Debug的速度,提高產(chǎn)品的開發(fā)效率。
對(duì)于FPGA來(lái)說(shuō),仿真畢竟是仿真,可以理解為理想條件,而最終我們的代碼是需要運(yùn)行在實(shí)際的FPGA芯片硬件上的。
所以也會(huì)遇到仿真正常,實(shí)際下載到板子里不正常的情況。這種現(xiàn)象有兩種原因:1.程序有BUG,2.硬件有問(wèn)題。比如實(shí)際程序中復(fù)位信號(hào)是低電平復(fù)位,而實(shí)際電路中設(shè)計(jì)的復(fù)位按鍵按下才是高電平,這樣按鍵未按下就會(huì)導(dǎo)致程序一直處于復(fù)位狀態(tài)。
當(dāng)然,這只是一種最簡(jiǎn)單的問(wèn)題點(diǎn),實(shí)際開發(fā)過(guò)程中,仿真與實(shí)際運(yùn)行不匹配的情況還有很多。那么如何才能以最快的速度找到問(wèn)題點(diǎn)呢?
早期的FPGA調(diào)試方法通常使用邏輯分析儀,連接到FPGA芯片的外部管腳上,如果想查看內(nèi)部信號(hào),還需要把這些信號(hào)定義成Output引出到外部管腳進(jìn)行了測(cè)量,如果是多位數(shù)據(jù),這樣就會(huì)占用大量的管腳,但是此類工具有個(gè)優(yōu)點(diǎn)就是支持多種協(xié)議解析,可以非常方便的查看協(xié)議的報(bào)文數(shù)據(jù)。
如果有一種工具能像單片機(jī)開發(fā)那樣,通過(guò)調(diào)試器JTAG接口實(shí)時(shí)獲取運(yùn)行過(guò)程中寄存器的數(shù)值就好了。有需求就有市場(chǎng),F(xiàn)PGA廠商也考慮到了開發(fā)者的這種需求,都在自家產(chǎn)品上加上了這個(gè)功能,那就是片上邏輯分析儀,就像在芯片內(nèi)裝了一個(gè)邏輯分析儀ELA(Embedded Logic Analyzer),可以實(shí)時(shí)監(jiān)測(cè)數(shù)據(jù)的變化,還可以設(shè)置觸發(fā)條件等!
FPGA領(lǐng)域幾大廠家提供嵌入式邏輯分析儀:
- Intel(原Altera)的SignalTap工具
- AMD(原Xilinx)的ChipScope工具
- Microchip(原Microsemi)的Identify工具
- Lattice的Reveal工具
這些工具都是嵌入式邏輯分析儀,大大提高了Debug速度。這類工具的原理通常是以預(yù)先設(shè)定的時(shí)鐘速率實(shí)時(shí)采樣FPGA的內(nèi)部信號(hào),并暫存于FPGA的內(nèi)部RAM中,當(dāng)滿足預(yù)設(shè)的觸發(fā)條件后,通過(guò)JTAG將存儲(chǔ)在片內(nèi)RAM中的數(shù)據(jù)傳輸至PC上,PC接收到數(shù)據(jù)后,通過(guò)上位機(jī)把數(shù)據(jù)展現(xiàn)出來(lái)。
以下是使用ChipScope工具抓取的鐵電存儲(chǔ)器FM25V05的SPI寫時(shí)序:
FM25V05寫時(shí)序
從FPGA學(xué)習(xí)流程來(lái)看,當(dāng)了解了流水燈、按鍵、UART等基本例程后,再學(xué)習(xí)I2C,SPI之前,就需要掌握片上邏輯分析儀的使用,非常有利于代碼的調(diào)試。
我個(gè)人使用過(guò)Xilinx和Microsemi的工具,還是挺好用的。
Microsemi的identify使用方法可以到CSDN文章查看:
https://blog.csdn.net/whik1194/article/details/107074187
本文主要介紹Xilinx ISE開發(fā)環(huán)境下ChipScope工具的使用。
1.Xilinx ChipScope簡(jiǎn)介
Xilinx的FPGA片內(nèi)邏輯分析儀被稱為ChipScope,通過(guò)插入IP核的方式實(shí)現(xiàn),主要包括3大IP核。
- ICON
ICON(integrated controller),主要負(fù)責(zé)與JTAG口的通訊,最大支持連接15個(gè)Core,這里的Core可以是ILA或VIO。
- ILA
ILA(integrated logic analyzer),嵌入式邏輯分析儀,可以抓取內(nèi)部的任何信號(hào),通過(guò)設(shè)置觸發(fā)條件的方式,抓取一段時(shí)間的波形,時(shí)間長(zhǎng)度取決于FPGA RAM資源大小。
- VIO
VIO(virtual input/output),即輸入輸出,可以實(shí)時(shí)監(jiān)控FPGA內(nèi)部信號(hào),并提供驅(qū)動(dòng)信號(hào)給FPGA模塊,類似于單片機(jī)調(diào)試中的變量值查看。
- ATC2
ATC2(Agilent trace core),是屬于特殊定制的調(diào)試IP核,需要配合新一代的Agilent邏輯分析儀一起使用,這個(gè)很少使用。
下面這張圖是來(lái)自Xilinx官方文檔:chipscope_pro_sw_cores_ug029.pdf
的一張圖片,關(guān)于ChipScope官方的使用指南可以查看這篇文檔,介紹了ChipScope工具的整體框圖。
ChipScope系統(tǒng)框圖
既然是邏輯分析儀,就要涉及到邏輯分析儀最重要的兩個(gè)參數(shù):采樣頻率和采樣深度,ILA的采樣頻率取決于輸入時(shí)鐘信號(hào)的頻率,采樣深度取決于FPGA的RAM大小。
2.示例工程創(chuàng)建
下面以Xilinx Spartan-6 XC6SLX9為例,演示ChipScope的使用,ILA抓取cnt實(shí)時(shí)數(shù)據(jù)。VIO實(shí)現(xiàn)在上位機(jī)控制LED亮滅,或選擇閃爍頻率。led1通過(guò)VIO來(lái)選擇4檔閃爍頻率,led2通過(guò)VIO給的觸發(fā)信號(hào)上升沿進(jìn)行翻轉(zhuǎn),led3與VIO輸出高低保持一致。
首先創(chuàng)建一個(gè)基于XC6SLX9的ISE基本工程,并新建源文件。
以下代碼還未添加ChipScope:
moduletop( //Inputs inputclk,//50MHz inputrst_n, //Outputs outputregled1,//通過(guò)VIO來(lái)選擇4種閃爍頻率 outputregled2,//通過(guò)VIO來(lái)控制 outputled3//通過(guò)VIO來(lái)控制 ); wire[1:0]level;//來(lái)自VIO wiretrig;//來(lái)自VIO,按鍵產(chǎn)生高脈沖信號(hào) wiretrig_rise=(trig_reg==2'b01); reg[1:0]trig_reg; reg[26:0]cnt;//在ILA中查看數(shù)據(jù)變化 always@(posedgeclk)begin if(!rst_n) trig_reg<='h0; else trig_reg<=?{trig_reg[0],?trig}; end always?@?(posedge?clk)?begin ????if(!rst_n)? ????????cnt?<=?'d0; else cnt<=?cnt?+?1; end always@(posedgeclk)begin if(!rst_n) led1<='d0; elsebegin //level來(lái)自VIO case(level) 0:led1<=?cnt[26]; ????????????1:??led1?<=?cnt[25]; ????????????2:??led1?<=?cnt[24]; ????????????3:??led1?<=?cnt[23]; ????????endcase ????end end always?@?(posedge?clk)?begin ????if(!rst_n) ????????led2?<=?0; ????else?if(trig_rise)??????//trig上升沿翻轉(zhuǎn) ????????led2?<=?!led2; end endmodule
3.添加ChipScope ICON IP核
添加一個(gè)IP核源文件,保存在chipscope文件夾下。
添加ICON
選擇ICON IP核,以下添加VIO和ILA核是一樣的操作。
選擇ICON
添加之后進(jìn)入配置界面,因?yàn)槲覀冞B接了ILA和VIO兩個(gè)IP核,這里控制端口需要兩個(gè):
配置端口
查看例化模板:
iconYourInstanceName( .CONTROL0(CONTROL0),//INOUTBUS[35:0] .CONTROL1(CONTROL1)//INOUTBUS[35:0] );
4.添加ChipScope ILA IP核
添加ILA
選擇采樣深度,數(shù)值越大,占用FPGA RAM資源越多,采樣時(shí)間越長(zhǎng)。
設(shè)置采樣深度
選擇采集通道,這里選擇32個(gè)通道。
選擇觸發(fā)通道
等待生成完成,查看例化模板:
ilaYourInstanceName( .CONTROL(CONTROL),//INOUTBUS[35:0] .CLK(CLK),//IN .TRIG0(TRIG0)//INBUS[31:0] );
5.添加ChipScope VIO IP核
同樣的方式添加VIO核:
添加VIO
選擇32路輸入,用于監(jiān)測(cè)cnt的值,4路輸出,用于控制LED。
配置輸入輸出通道
設(shè)置為異步輸入32位,輸出4位。
6.將ChipScope的3個(gè)IP核添加到頂層模塊
moduletop( //Inputs inputclk,//50MHz inputrst_n, //Outputs outputregled1,//通過(guò)VIO來(lái)選擇4種閃爍頻率 outputregled2,//通過(guò)VIO來(lái)控制 outputled3//通過(guò)VIO來(lái)控制 ); wire[1:0]level;//來(lái)自VIO wiretrig;//來(lái)自VIO,按鍵產(chǎn)生高脈沖信號(hào) wiretrig_rise=(trig_reg==2'b01); reg[1:0]trig_reg; reg[26:0]cnt;//在ILA中查看數(shù)據(jù)變化 always@(posedgeclk)begin if(!rst_n) trig_reg<='h0; else trig_reg<=?{trig_reg[0],?trig}; end always?@?(posedge?clk)?begin ????if(!rst_n)? ????????cnt?<=?'d0; else cnt<=?cnt?+?1; end always@(posedgeclk)begin if(!rst_n) led1<='d0; elsebegin //level來(lái)自VIO case(level) 0:led1<=?cnt[26]; ????????????1:??led1?<=?cnt[25]; ????????????2:??led1?<=?cnt[24]; ????????????3:??led1?<=?cnt[23]; ????????endcase ????end end always?@?(posedge?clk)?begin ????if(!rst_n) ????????led2?<=?0; ????else?if(trig_rise)??????//trig上升沿翻轉(zhuǎn) ????????led2?<=?!led2; end /*?Xilinx?ChipScope?Config?*/ wire?[35:0]?CONTROL0; wire?[35:0]?CONTROL1; wire?[31:0]?TRIG0; wire?[31:0]?ASYNC_IN; wire?[3:0]?ASYNC_OUT; assign?ASYNC_IN[26:0]?=?cnt[26:0]; assign?level?=?ASYNC_OUT[1:0]; assign?trig??=?ASYNC_OUT[2]; assign?led3??=?ASYNC_OUT[3]; assign?TRIG0[26:0]?=?cnt[26:0]; assign?TRIG0[28:27]?=?level[1:0]; assign?TRIG0[29]?=?led1; assign?TRIG0[30]?=?led2; assign?TRIG0[31]?=?led3; icon?icon_ut0( ????.CONTROL0(CONTROL0[35:0]), ????.CONTROL1(CONTROL1[35:0]) ); ila?ila_ut0( ????.CONTROL(CONTROL0[35:0]),? ????.CLK(clk),? ????.TRIG0(TRIG0[31:0]) ); vio?vio_ut0( ????.CONTROL(CONTROL1[35:0]), ????.ASYNC_IN(ASYNC_IN[31:0]), ????.ASYNC_OUT(ASYNC_OUT[3:0]) ); endmodule
7.編譯下載
管腳分配,編譯通過(guò),生成bit文件,打開ChipScope,下載bit文件。
ChipScope
下載Bit文件
選擇bit文件
對(duì)信號(hào)進(jìn)行重新命名,設(shè)置觸發(fā)信號(hào),或者控制VIO輸出狀態(tài)。
設(shè)置觸發(fā)方式
trig設(shè)置成PushButton類型,并設(shè)置為高脈沖。
led3設(shè)置成ToggleButton類型,即按一下狀態(tài)翻轉(zhuǎn)一次。
VIO配置
8.總結(jié)
單片機(jī)在線調(diào)試可以設(shè)置斷點(diǎn),讓程序停下,F(xiàn)PGA只要時(shí)鐘信號(hào)存在,就會(huì)一直運(yùn)行下去,所以無(wú)法人為的設(shè)置斷點(diǎn),中止代碼的運(yùn)行。
任何事物都不可能達(dá)到十全十美,使用管腳外接的邏輯分析儀不會(huì)占用任何的邏輯資源,可以通過(guò)邏輯分析儀解析協(xié)議的報(bào)文,缺點(diǎn)是不能查看內(nèi)部信號(hào);使用片內(nèi)邏輯分析儀的優(yōu)點(diǎn)是可以實(shí)時(shí)查看內(nèi)部信號(hào),設(shè)置觸發(fā)條件,缺點(diǎn)是會(huì)占用FPGA的邏輯資源,比如RAM等。
Xilinx新一代的集成開發(fā)工具Vivado最低支持Spartan-7系列的FPGA芯片,由于手頭只有Spartan-6系列的開發(fā)板,所以無(wú)法演示在Vivado環(huán)境下的ChipScope使用,基本上都大同小異,使用方法類似,畢竟是同一家的調(diào)試工具。
9.參考資料
Xilinx官方文檔:chipscope_pro_sw_cores_ug029.pdf
審核編輯 :李倩
-
FPGA
+關(guān)注
關(guān)注
1629文章
21729瀏覽量
602986 -
芯片
+關(guān)注
關(guān)注
455文章
50714瀏覽量
423138 -
STM32
+關(guān)注
關(guān)注
2270文章
10895瀏覽量
355729
原文標(biāo)題:FPGA如何進(jìn)行片上調(diào)試?
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論