賽靈思的FPGA有多種配置接口,如SPI,BPI,SeletMAP,Serial,JTAG等;如果從時(shí)鐘發(fā)送者的角度分,還可以分為主動(dòng)Master(即由FPGA自己發(fā)送配置時(shí)鐘信號(hào)CCLK)和被動(dòng)Slave(即由外部器件提供配置所需要的時(shí)鐘信號(hào));另外還可由板上穩(wěn)定晶振提供時(shí)鐘信號(hào),經(jīng)由FPGA的EMCCLK接口,再?gòu)腃CLK端口送出。
如此多的配置形式,一旦發(fā)生配置失敗怎么辦?大家都知道先要查看一下板子上FPGA的DONE管腳。但絕大多數(shù)情況下,DONE管腳此時(shí)會(huì)是低電平,只能證明配置確實(shí)失敗了。但是......
失敗的原因到底是什么呢?
調(diào)試到底應(yīng)該如何入手呢?
答案是:
第一步要做的,永遠(yuǎn)都是拉出FPGA的狀態(tài)字寄存器Status Register看,它能直接告訴你或者極大地輔助判斷失敗的原因!不管FPGA的型號(hào)是哪個(gè),不管用的下載工具是Vivado HW Manager還是ISE的iMPACT,不管軟件的版本如何,永遠(yuǎn)都是這個(gè)。
賽靈思 FPGA 的狀態(tài)字,在賽靈思所有器件系列中都基本保持一致的定義(個(gè)別位由于系列特性不同可能有細(xì)微區(qū)別,這些不是最重要的,不在我們今天討論的范圍內(nèi))。
以UltraScale/UltraScale+系列為例,我們看看UG570(官網(wǎng)查詢UG570)上對(duì)狀態(tài)字的完整定義:
表格里面已經(jīng)很清楚地解釋了每一個(gè)bit位代表的意義。下面學(xué)習(xí)如何讀出狀態(tài)字并從其具體值中判斷失敗原因。
我們先來(lái)讀一下一片未作配置的FPGA的狀態(tài)字看看。首先,用下載線連接好板子和電腦,板子上好電。打開(kāi)Vivado硬件管理器,掃描板子上的JTAG鏈 (Open target -Auto Connect), 板子上的JTAG鏈中的器件會(huì)顯示在Hardware窗口中:
鼠標(biāo)選中掃描出的FPGA器件,在下方的Hardware Device Properties窗口中,選擇Properties項(xiàng),會(huì)出現(xiàn)該FPGA的一系列屬性。找到其中的REGISTER分類,展開(kāi),第二個(gè)寄存器CONFIG_STATUS, 即是我們要討論的狀態(tài)字了。
注意FPGA此時(shí)的狀態(tài)是Not Programmed, 那么對(duì)應(yīng)的狀態(tài)字展開(kāi)如下:
這里可以看到的是一個(gè)配置前的狀態(tài)字的標(biāo)準(zhǔn)狀態(tài):
只有BIT02 PLL_LOCK, BIT03 DCI_MATCH, BIT11 INIT_B_INTERNAL, BIT12 INIT_B_PIN的值必須是1;
BIT08-10 MODE PINS,BIT21 SECURITY_STATUS, BIT25-26 BUS_WIDTH,BIT28 PUDC_B根據(jù)FPGA和板子具體的設(shè)定,可以為1或者0,其他都必須是0。
如果一上電,狀態(tài)字就表現(xiàn)出了非典型值,那么大概率硬件上就有錯(cuò)誤或者不合理的地方了。比較典型的幾個(gè)例子:
1. 狀態(tài)字全0
REGISTER.CONFIG_STATUS 00000000000000000000000000000000
這種情況,說(shuō)明FPGA被強(qiáng)行控制在全局復(fù)位狀態(tài)了。一般是硬件上PROGRAM_B管腳,或者INIT_B管腳被錯(cuò)誤的拉到了地上,兩個(gè)管腳上的有效電平為0.
非常偶爾的情況下,當(dāng)DONE管腳被錯(cuò)誤拉為0電平時(shí)也能出現(xiàn)此種狀態(tài)字。
2. 狀態(tài)字全1,或者一串1后面跟著一個(gè)到數(shù)個(gè)0(一般不超過(guò)4個(gè))
REGISTER.CONFIG_STATUS 11111111111111111111111111111111
REGISTER.CONFIG_STATUS 11111111111111111111111111111110
REGISTER.CONFIG_STATUS 11111111111111111111111111111100
這種一般是板子上設(shè)計(jì)的JTAG鏈里面不只一個(gè)FPGA器件,比如是Xilinx的FPGA和一個(gè)第三方的CPLD串聯(lián)等。
由于Vivado里面并沒(méi)有第三方器件的BSDL文件,那么在掃描整個(gè)JTAG鏈時(shí),它無(wú)法識(shí)別鏈中各器件的型號(hào)以及數(shù)目,所以往往從TDO管腳中移位出一串1來(lái)。如果Xilinx的FPGA位于鏈的末端(接近TDO的位置),那么有時(shí)可以識(shí)別出正確的FPGA型號(hào)。但是這種情況仍然無(wú)法正確進(jìn)行將要進(jìn)行的配置操作。另外很多例子中則是FPGA的型號(hào)也被識(shí)別錯(cuò)誤了。
解決方案如下:
https://www.xilinx.com/support/answers/61312.html
3. Unknown Device/Many Unknow Devices
此時(shí),不要說(shuō)狀態(tài)字無(wú)法檢測(cè)了,整個(gè)JTAG已經(jīng)無(wú)法正確掃描,Vivado里面無(wú)法識(shí)別出任何器件。這一般是板子上的JTAG接口的TDO或者鏈中最后一個(gè)器件的輸出管腳TDO,被短接到了地平面上。
除了上述典型情況,當(dāng)然還有很多一上電就無(wú)法繼續(xù)配置的情況,原因不勝枚舉。這種情況下請(qǐng)?jiān)敿?xì)描述你的JTAG鏈構(gòu)成,讀出當(dāng)前的狀體字(如何還能夠讀的話),在論壇上發(fā)貼問(wèn)問(wèn)賽靈思的專家吧:
如果狀態(tài)字正常,可以接下來(lái)進(jìn)行配置操作?;蛘呤窃谀愕呐渲檬『?,保留失敗現(xiàn)場(chǎng)再連接好板子和電腦繼續(xù)讀出狀態(tài)字。
如果你的板子已經(jīng)重新上下電了,那么當(dāng)時(shí)失敗的場(chǎng)景也就消失了。這也就是我們一再?gòu)?qiáng)調(diào)失敗后要保留現(xiàn)場(chǎng),板子上要保留JTAG接口的原因。當(dāng)然在設(shè)計(jì)成熟后,或者實(shí)驗(yàn)室調(diào)試工作結(jié)束后,可以去掉JTAG接口以期得到產(chǎn)品更高的安全性。
配置完成后,得到的狀態(tài)字如下:
REGISTER.CONFIG_STATUS00010010100100000111110111111100
注意其中的:
BIT02 PLL_LOCK, BIT03 DCI_MATCH,絕大多數(shù)情況已經(jīng)變?yōu)?;
BIT04 EOS,BIT05 GTS, BIT06 GWE, BIT07 GHITH,以及BIT11 INIT_BINTERNAL,BIT12 INIT_B_PIN,BIT13 DONE_INTERNAL, BIT14 DONE_PIN必然是1;
BIT18-20 STARTUP_STATTE應(yīng)該是100;
BIT25-26 BUS_WIDTH應(yīng)該是檢測(cè)出了正確的配置位寬,或者在serial的情況下,保持默認(rèn)的01值;
其他BIT01 DECRYPTOR, BIT09-10 MODE_PINS, BIT21-23 SECURITY_STATUS, BIT28 PUDC_B, BIT30CFGBVS_PIN, 根據(jù)你的使用,有可能是其他的0或者1組合。
RESERVED的不用管。
如果不是這種結(jié)果,那么就要看看出什么問(wèn)題了。
在一些相對(duì)簡(jiǎn)單,典型的情況下,只看某一位就可以直接得到想要的答案。
1. BIT00, CRC error 為 1
在不是狀態(tài)字全1的情況下CRC error位為1,說(shuō)明配置出現(xiàn)了CRC錯(cuò)誤。這是一種很常見(jiàn),但比較難修復(fù)的錯(cuò)誤,因?yàn)镃RC錯(cuò)誤的原因一般是因?yàn)榘遄由系男盘?hào)質(zhì)量(SI, Signal Integrity)不行,傳輸數(shù)據(jù)的過(guò)程中0/1電平判決錯(cuò)誤,導(dǎo)致配置數(shù)據(jù)寫(xiě)入失敗。
如何確定真的是SI問(wèn)題呢?看失敗概率。CRC錯(cuò)誤一般是隨機(jī)出錯(cuò)的,并不一定100%失?。ǔ前遄拥男盘?hào)差得沒(méi)法用了,這個(gè)一般不會(huì))。那么配置文件中01翻轉(zhuǎn)的次數(shù)越少,出錯(cuò)的概率越小。你可以生成一個(gè)只點(diǎn)亮板上一盞LED的小測(cè)試設(shè)計(jì),此時(shí)bit文件中有效數(shù)據(jù)(1)非常少,試著下載該bit看看,是不是配置失敗率降低了?如果是,那么基本可以確定了。
一旦出現(xiàn)這種情況,可以嘗試的辦法有:
1). 降低CCLK頻率;
2). 在CCLK的輸入端(以及輸出端),加入合適的端接電路;
3). 換用更高質(zhì)量的配置時(shí)鐘(比如使用質(zhì)量較好的晶振通過(guò)EMCCLK提供時(shí)鐘);
4). 改善數(shù)據(jù)鏈路的信號(hào)質(zhì)量,如果對(duì)待CCLK,同樣在數(shù)據(jù)通路上加入合適的端接匹配電路。
總而言之,要做的就是改善板上的信號(hào)質(zhì)量。如果板子SI實(shí)在太差,那只有改板,或者嘗試下其他配置方式了。
2. 其他位都正常,BIT13 DONE_INTERNAL也為1了,但是BIT14 DONE_PIN為0,F(xiàn)PGA不工作!
這種情況,其實(shí)配置數(shù)據(jù)已經(jīng)完整、正確的送入FPGA并且被接收了,但是FPGA的DONE管腳連接不正確,導(dǎo)致DONE沒(méi)有或者沒(méi)有在規(guī)定時(shí)間內(nèi)上拉到要求的電平,從而導(dǎo)致FPGA最終的啟動(dòng)失敗。
賽靈思的FPGA,一般要求DONE管腳上外加一個(gè)上拉電阻(330 ohm, 4.7K ohm等,不同系列要求不同,請(qǐng)參照對(duì)應(yīng)的Configuration User Guide)。如果這個(gè)上拉電阻沒(méi)有加,或者加的阻值過(guò)大或過(guò)小,那么DONE管腳無(wú)法在規(guī)定的時(shí)間里面達(dá)到高電平,此時(shí)內(nèi)部配置控制器會(huì)認(rèn)為配置失敗了,典型情況就是DONE internal為高(內(nèi)部數(shù)據(jù)接收完畢,內(nèi)部釋放了),但是DONE外部管腳為低。
此時(shí)需要做的,就是檢查PCB上DONE部分的設(shè)計(jì),看看是不是有和其他管腳相連的情況,被其他管腳強(qiáng)行拉低了?;蛘呤窃O(shè)計(jì)的DONE點(diǎn)亮LED燈電路不合理, LED通電后把DONE管腳的電平降為低電平。
如果你不清楚如何設(shè)計(jì)這部分電路,從www.xilinx.com 上,找到一款和你使用的FPGA型號(hào)相同或者同系列的開(kāi)發(fā)板,參考它的原理圖設(shè)計(jì)。
3. BIT29 BAD PACKET error
Bit29為1,大概率也是CRC錯(cuò)誤。這不過(guò)這個(gè)CRC錯(cuò)誤比較特殊,出錯(cuò)位跑到了配置文件里面的命令上,導(dǎo)致配置命令變成了一個(gè)無(wú)效無(wú)意義的指令。此時(shí)狀態(tài)字會(huì)報(bào)出bad packet error。
和CRC錯(cuò)誤的隨機(jī)性一樣,多次重復(fù)加載過(guò)程,大概率出錯(cuò)的數(shù)據(jù)位下次落到其他的數(shù)據(jù)上。由于配置數(shù)據(jù)的數(shù)量遠(yuǎn)遠(yuǎn)大于配置命令,那么很有可能下次出錯(cuò)看到的是BIT00 CRC ERROR為1.
如果每次都是BAD PACKET error,更要懷疑使用的配置文件已經(jīng)損壞。比如進(jìn)行了非法改寫(xiě)。Xilinx的任何配置文件,都是禁止手工修改的。
4. BIT15 IDCODE Error為1.
配置文件下載時(shí),都要先經(jīng)過(guò)FPGA的IDCODE校驗(yàn)。如果這一步通不過(guò),那么后續(xù)的配置不會(huì)進(jìn)行。這種情況下,看看配置文件的bit/bin/mcs是不是給錯(cuò)了?;蛘逨PGA器件有silicon revision的變化。舉個(gè)例子,有的系列ES芯片和Production芯片的配置文件是不能兼容的。這種錯(cuò)誤情況,如果是用JTAG通過(guò)Vivado下載,那么log里面也會(huì)有相應(yīng)的提示。
5. BIT13 DONE_INTERNAL+ BIT14 DONE_PIN均為0
這也是一種較常見(jiàn)的錯(cuò)誤。此時(shí)要重點(diǎn)檢查一下BIT07 GHIGH位,看看它是不是1。如果是,那么大概率是,你的CCLK時(shí)鐘給的不夠多。FPGA在接收完所有的配置數(shù)據(jù)后,還需要一定數(shù)量的CCLK時(shí)鐘去完成內(nèi)部的初始化。如果發(fā)送端,此時(shí)常常是一個(gè)CPU用Slave模式加載,認(rèn)為有效數(shù)據(jù)結(jié)束,強(qiáng)行停止了進(jìn)一步的時(shí)鐘發(fā)送,那么有時(shí)可以觀測(cè)到此種狀況。此時(shí)去檢查BIT18-20 STARTUP_STATE,根據(jù)具體的情況,也有一定概率看到不是預(yù)期的100.
標(biāo)準(zhǔn)的做法是,在默認(rèn)設(shè)置下持續(xù)發(fā)送CCLK時(shí)鐘,直至檢測(cè)到DONE管腳已經(jīng)拉高,然后再多發(fā)送至少64個(gè)時(shí)鐘信號(hào)。如果修改了配置默認(rèn)設(shè)置,比如選擇了wait for PLL to lock,那么需要更多的時(shí)鐘信號(hào)。
6. 狀態(tài)字看起來(lái)和沒(méi)有發(fā)出配置數(shù)據(jù),即和剛上電的表現(xiàn)一樣。
這種情況,說(shuō)明所有發(fā)出的配置數(shù)據(jù)都被FPGA忽略掉了,因?yàn)樗徽J(rèn)為你發(fā)送過(guò)來(lái)的是有效配置數(shù)據(jù)。
FPGA的配置文件里面,有一個(gè)數(shù)據(jù)同步頭,一般是AA 99 55 66。如果由于某種原因,這個(gè)同步頭FPGA都沒(méi)有認(rèn)出來(lái),那么后續(xù)的數(shù)據(jù)會(huì)被它全部忽略。
一般的原因是:
1). 在非serial配置模式中,沒(méi)有正確的做Byte Swap;
2). 配置文件生成時(shí),BPI數(shù)據(jù)線寬設(shè)置不對(duì)(x8, x16, x32選錯(cuò)了)
3). SPI的x1, x2, x4選擇錯(cuò)誤;
4). 嚴(yán)重的板級(jí)SI問(wèn)題導(dǎo)致的CRC錯(cuò)誤;
以上列舉了常見(jiàn)的一些配置錯(cuò)誤和其狀態(tài)字的相應(yīng)表現(xiàn)。需要注意的是,狀態(tài)字寄存器有32位,其組合可以說(shuō)是相當(dāng)多的。除了上述情況,配置失敗定位還可能需要結(jié)合狀態(tài)字,加載過(guò)程中l(wèi)og文件,硬件設(shè)計(jì)原理圖和工具版本信息,以及通過(guò)其他一些配置接口在不同條件下去對(duì)比測(cè)試才能逐步定位。
???審核編輯:湯梓紅
-
FPGA
+關(guān)注
關(guān)注
1629文章
21736瀏覽量
603315 -
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120348 -
接口
+關(guān)注
關(guān)注
33文章
8596瀏覽量
151145 -
賽靈思
+關(guān)注
關(guān)注
32文章
1794瀏覽量
131270 -
SPI
+關(guān)注
關(guān)注
17文章
1706瀏覽量
91578
原文標(biāo)題:干貨 | 如何理解FPGA的配置狀態(tài)字寄存器 Status Register
文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論