0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

手把手教你動(dòng)態(tài)編輯Xilinx FPGA內(nèi)LUT內(nèi)容

FPGA之家 ? 來(lái)源:FPGA之家 ? 2023-08-26 14:18 ? 次閱讀

研究背景及基礎(chǔ)知識(shí)

FPGA是實(shí)現(xiàn)高性能計(jì)算與網(wǎng)絡(luò)的重要工具,得益于其高度的并行性與用戶可編程的特性,F(xiàn)PGA得到了越來(lái)越廣泛的應(yīng)用。FPGA由CLB(Configurable Logic Block,可編程邏輯單元)、BRAM(Block RAM,塊RAM)、DSP48E1(專用數(shù)字處理單元)、可編程布線資源、可編程IO資源等部分組成,其中,CLB是實(shí)現(xiàn)邏輯功能的基礎(chǔ),Xilinx 7系列FPGA CLB內(nèi)部結(jié)構(gòu)如圖1.1所示[1]。

54eaa9b8-43cb-11ee-a2ef-92fbcf53809c.png

從圖1.1中我們可以看到,一個(gè)CLB由兩個(gè)SLICE組成,而SLICE可以分為SLICEL和SLICEM,SLICEL僅可以實(shí)現(xiàn)邏輯功能,而SLICEM除了可以實(shí)現(xiàn)邏輯功能外,還可以實(shí)現(xiàn)位寬為1bit、深度為64bit的RAM, SLICEL和SLICEM的結(jié)構(gòu)如圖1.2和圖1.3所示[1],SLICEL和SLICEM都是由4個(gè)6輸入LUT(Look up table,查找表)、3個(gè)MUX(數(shù)據(jù)選擇器)、1個(gè)Carry Chain(進(jìn)位鏈)和8個(gè)Flip-Flop(觸發(fā)器)組成,其中,LUT本質(zhì)是一塊6地址輸入1數(shù)據(jù)輸出的存儲(chǔ)器(不考慮5輸入LUT的情況),通過(guò)改變其內(nèi)容,可以得到各種各樣的真值表,也就得到了各種各樣的邏輯功能,這是FPGA可編程性的基礎(chǔ)之一。

5513ba06-43cb-11ee-a2ef-92fbcf53809c.jpg

5599100c-43cb-11ee-a2ef-92fbcf53809c.jpg

比圖1.2和圖1.3可以發(fā)現(xiàn),SLICEL的4個(gè)LUT,只有6bit地址輸入和1bit數(shù)據(jù)輸出(不考慮5輸入LUT的情況),當(dāng)bitstream文件配置下去后,用戶是無(wú)法對(duì)LUT內(nèi)容進(jìn)行更改的,可以將之看作是一塊ROM;而SLICEM除6bit讀地址輸入和1bit數(shù)據(jù)輸出外,還有6bit的寫(xiě)地址輸入(圖1.2中W6:W1)和1bit的寫(xiě)數(shù)據(jù)使能(圖1.2中WEN),2bit的寫(xiě)數(shù)據(jù)輸入(DI1和DI2),這也是SLICEM的LUT可以被配置為位寬為1bit、深度為64bit的RAM的原因。

研究目的

在7系列FPGA中,將近2/3的SLICE是SLICEL,其余的是SLICEM[1],也就是說(shuō),F(xiàn)PGA內(nèi)2/3的資源在bitstream文件下載后,其邏輯功能就無(wú)法更改了,除非修改代碼并生成新的bitstream文件。這給可重構(gòu)計(jì)算、基于LUT的高帶寬查找算法等研究帶來(lái)了很大的困擾:這些研究希望在設(shè)備運(yùn)行時(shí)對(duì)LUT的內(nèi)容進(jìn)行動(dòng)態(tài)修改,而只有SLICEM的LUT存在寫(xiě)數(shù)據(jù)接口,也就是這些研究中的算法只能利用1/3的LUT資源。 作者在研究基于FPGA的高性能可重構(gòu)CRC算法時(shí),就遇到了上述問(wèn)題,可編程CRC的關(guān)鍵計(jì)算模塊由LUT實(shí)現(xiàn),而為了實(shí)現(xiàn)CRC生成式的可編程,必須要使用SLLICEM的LUT,導(dǎo)致時(shí)序不理想,且需要額外使用復(fù)雜的配置電路。 作者收到啟發(fā),發(fā)現(xiàn)使用Xilinx 提供的HWICAP IP核即可實(shí)現(xiàn)對(duì)SLICEL的LUT的動(dòng)態(tài)編程,無(wú)需Vivado軟件參與 ,即可實(shí)現(xiàn)ms乃至us級(jí)別的重配置速度[2][3],該方案是基于FPGA實(shí)現(xiàn)高性能可重構(gòu)CRC的理想選擇。 然而,網(wǎng)上關(guān)于該研究的資料是十分稀缺的;Xilinx官方提供的內(nèi)容也十分分散且有限,部分內(nèi)容還被有意地忽略了;學(xué)術(shù)界的論文大多集中在如何設(shè)計(jì)高性能的ICAP控制器,以取代性能較低的HWICAP控制器。到目前為止,還無(wú)法找到關(guān)于如何使用HWICAP,實(shí)現(xiàn)單個(gè)LUT的內(nèi)容重配置的內(nèi)容。作者經(jīng)過(guò)1個(gè)多月的摸索,基本打通了單個(gè)LUT重配置的各個(gè)環(huán)節(jié),最終基于Artix-7 FPGA開(kāi)發(fā)板,搭建了一套演示環(huán)境,實(shí)現(xiàn)了單個(gè)LUT內(nèi)容的讀取與重配置,該項(xiàng)研究的各項(xiàng)內(nèi)容如下所述: 第二節(jié)介紹LUT的尋址與配置方式,只有知道LUT如何尋址,才能對(duì)特定位置的LUT進(jìn)行重配置;第三節(jié)介紹LUT的信息提取,包括LUT位置提取與LUT引腳映射關(guān)系提?。坏谒墓?jié)對(duì)rbt文件進(jìn)行解析(僅限于LUT內(nèi)容部分),只有了解LUT初始值是如何映射到rbt文件中,才能利用HWICAP實(shí)現(xiàn)LUT內(nèi)容的正確配置;第五節(jié)介紹HWICAP的具體操作,包括HWICAPIP核的操作與ICAP的操作命令;第六節(jié)搭建了驗(yàn)證系統(tǒng),基于Artix-7FPGA開(kāi)發(fā)板,在Vivado環(huán)境下,使用TCL命令,實(shí)現(xiàn)單個(gè)LUT的重配置;第七節(jié)對(duì)上述工作進(jìn)行總結(jié),指出后面的工作方向。

LUT尋址與配置方式

一、FPGA的基本結(jié)構(gòu)

想要對(duì)LUT進(jìn)行尋址,必須要知道LUT在FPGA中的組織方式,也就是知道FPGA的結(jié)構(gòu),需要說(shuō)明的是,Xilinx 7系列FPGA與其前代產(chǎn)品相比,組成出現(xiàn)了較大的變化,在這里介紹Virtex-5 FPGA與Artix-7 FPGA的具體結(jié)構(gòu)。

Virtex-5系列FPGA和Artix-7系列FPGA都是基于ASMBL(AdvancedSilicon Modular Block)架構(gòu)的(但是Virtex-5基于二代ASMBL技術(shù),Artix-7基于四代ASMBL技術(shù)) ,這里以7系列FPGA為例,對(duì)ASMBL架構(gòu)進(jìn)行簡(jiǎn)單介紹。

55bd57aa-43cb-11ee-a2ef-92fbcf53809c.jpg1.1 ASMBL架構(gòu)

7系列FPGA ASMBL架構(gòu)如圖1.1所示,該架構(gòu)的關(guān)鍵在于,資源按列排布,同一列的資源是相同的,通過(guò)組合不同的列,可以得到面向各種應(yīng)用、滿足各種功能的FPGA,該架構(gòu)的模塊化思想,大大簡(jiǎn)化了FPGA的設(shè)計(jì)。我們來(lái)看一張真實(shí)的FPGA的內(nèi)部結(jié)構(gòu)圖(器件型號(hào)為XC7A100T 該圖通過(guò)Vivado軟件得到),如圖1.2所示,該FPGA分為8個(gè)區(qū)域(8個(gè)Clock Region),圖中大量的淡藍(lán)色非規(guī)則部分,是已經(jīng)被占用的模塊,我們選擇比較“干凈”的X0Y3區(qū)域進(jìn)行介紹;

55ed845c-43cb-11ee-a2ef-92fbcf53809c.png

圖1.2 XC7A100T內(nèi)部結(jié)構(gòu)

55fef714-43cb-11ee-a2ef-92fbcf53809c.png

圖1.3 X0Y3區(qū)域結(jié)構(gòu)

X0Y3區(qū)域放大后的圖片如圖1.3所示,圖中最左側(cè)橘色部分為IO接口,藍(lán)色部分為CLB,紅色部分為BRAM資源(RAM36E1),綠色部分為DSP資源(DSP48E1),這樣的資源組織方式與前面說(shuō)的ASMBL架構(gòu)是完全吻合的。我們?cè)俅螌D2中的藍(lán)色方塊放大,如圖1.4所示,可以看到,每個(gè)藍(lán)色方塊內(nèi)部,都由2個(gè)SLICE組成。

561e508c-43cb-11ee-a2ef-92fbcf53809c.png

圖1.4 CLB內(nèi)部結(jié)構(gòu)

作者肉眼數(shù)了一下,一列藍(lán)色方塊中,藍(lán)色方塊的數(shù)量是50個(gè),也就是一列CLB中包含50個(gè)CLB(這個(gè)知識(shí)后面要用到);一列紅色方塊中,紅色方塊的數(shù)量是10個(gè),也就是一列BRAM中包含10個(gè)RAM36E1;一列綠色方塊中,紅色方塊的數(shù)量是20個(gè),也就是一列DSP中包含20個(gè)DSP48E1;

562ea61c-43cb-11ee-a2ef-92fbcf53809c.jpg

圖1.5 FPGA中間部位的BUFG

需要特別注意的是,在FPGA的中間部分,是一組BUFG,如圖1.5所示(圖1.2放大,觀察FPGA正中央),在BUFG的上方,是FPGA的上半部分(top),F(xiàn)PGA的下方是下半部分(bottom),這個(gè)知識(shí)后面會(huì)用到,可能有人會(huì)有疑問(wèn),圖1.2結(jié)構(gòu)如此對(duì)稱,上半部分和下半部分不是一目了然的么?但是我們需要知道,不是所有的FPGA都是四行兩列八個(gè)ClockRegion的,如圖1.6(芯片型號(hào)為XC7Z020),為三行了兩列六個(gè)Clock Region,這時(shí)只能通過(guò)觀察BUFG的位置(圖1.6中白框所在位置),判斷哪幾行是top部分,哪幾行是bottom部分。

565a274c-43cb-11ee-a2ef-92fbcf53809c.png

圖1.6 XC7Z020內(nèi)部結(jié)構(gòu)

567ea400-43cb-11ee-a2ef-92fbcf53809c.png

圖1.7 XC5VLX110T所示

再來(lái)看一下Virtex-5FPGA的內(nèi)部結(jié)構(gòu),如圖1.7所示,可以看到,Virtex-5FPGA的結(jié)構(gòu)與7系列FPGA很相似,都是模塊化的、按列排布的;我們重點(diǎn)關(guān)注一下CLB方面的區(qū)別,對(duì)比圖1.3和圖1.7可以發(fā)現(xiàn),7系列FPGA一列CLB包含CLB的個(gè)數(shù)為50個(gè),而Virtex-5FPGA一列CLB包含CLB的個(gè)數(shù)為20個(gè),這種差別在后期介紹LUT尋址時(shí)會(huì)體現(xiàn)出來(lái)。

二、FPGA配置幀格式與尋址格式

FPGA配置數(shù)據(jù)的最小單位是幀,下面先以Virtex-5為例,介紹配置幀的格式與尋址方式;然后介紹7系列FPGAVirtex-5在配置幀格式與尋址方式方面的區(qū)別。
1.Virtex-5 FPGA配置幀格式與尋址格式

Virtex-5配置幀格式如圖1.8所示,圖中共有36個(gè)幀,每個(gè)幀包含41個(gè)word,每個(gè)word由32bit組成,圖中“X odd”部分代表一個(gè)CLB中編號(hào)為奇數(shù)的SLICE,而“X even”代表編號(hào)為偶數(shù)的SLICE,也就是“X odd”代表圖1.4中右側(cè)的SLICE,“X odd”代表圖1.4中左側(cè)的SLICE;Frame26-Frame29和Frame32-Frame35已經(jīng)可以用來(lái)配置一個(gè)CLB內(nèi)的8個(gè)LUT了,為什么配置一個(gè)CLB需要36個(gè)幀呢?因?yàn)槌诵枰渲肔UT外,還需要配置觸發(fā)器、連接線等其他的部分,因?yàn)槲覀儍H需要研究LUT內(nèi)容是如何重配置的,因此我們不對(duì)這些內(nèi)容進(jìn)行研究;另外,想要配置一個(gè)LUT,使用1個(gè)幀是搞不定的,因?yàn)?個(gè)幀只能配置1個(gè)LUT的2個(gè)字節(jié)(6輸入LUT初始值為64bit,也就是8字節(jié)),需要4個(gè)幀才能配置一個(gè)LUT,但是,一個(gè)幀又同時(shí)涉及到了20個(gè)LUT的配置信息,也就是一個(gè)幀會(huì)對(duì)一列SLICE中的LUT進(jìn)行配置(前面提到過(guò),Virtex-5一列CLB中,CLB數(shù)量是20),這也是為什么要使用RMW(read-modify-write)的思想,也就是想配置1個(gè)LUT,需要先把這個(gè)LUT對(duì)應(yīng)的4個(gè)幀讀出來(lái),修改該LUT對(duì)應(yīng)的內(nèi)容后,再將這4個(gè)幀寫(xiě)回去,這樣才能保證其他的LUT不受影響。

56c55080-43cb-11ee-a2ef-92fbcf53809c.jpg

1.8 Virtex-5配置幀格式

細(xì)心的讀者可以發(fā)現(xiàn),圖1.8中一個(gè)配置幀包含41個(gè)word,而一列SLICE包含20個(gè)SLICE,2個(gè)word可以配置一個(gè)SLICE的4個(gè)LUT,怎么多出了一個(gè)word?答案在圖1.9中可以找到,一個(gè)配置幀的前20個(gè)word和后20個(gè)word都是用于配置LUT的,而中間的LUT用于其它功能,更多信息可以參考Xilinx官方文檔:UG191。

56e74b90-43cb-11ee-a2ef-92fbcf53809c.png

1.9一個(gè)配置幀的具體格式

5709bdf6-43cb-11ee-a2ef-92fbcf53809c.png

1.10 Virtex-5 FPGA配置幀尋址格式

Virtex-5 FPGA配置幀的尋址格式如圖1.10所示,Virtex-5系列FPGA配置幀的地址由24bit組成,其中,bit23-bit21作用是指示配置對(duì)象的類型,如取值為000代表對(duì)CLB進(jìn)行配置;bit20作用是指示配置的對(duì)象在FPGA的上半部分還是下半部分(相關(guān)內(nèi)容參考圖1.5及圖1.6);bit19-bit15是選擇行的,如圖1.2所示,該FPGA有4行,但是其編址方式是不是從上到下為0、1、2、3呢?

5734b768-43cb-11ee-a2ef-92fbcf53809c.png

1.11行編址

當(dāng)然不是的,其編址方式如圖1.11所示,上半部分(top)和下半部分(bottom)是分開(kāi)編址的,接近中間的行,地址為1,遠(yuǎn)離中間的行,地址依次加1,舉個(gè)例子,圖2.2中X0Y2、X1Y2、X0Y3、X1Y3位于上半部分,X0Y2、X1Y2行地址為0,X0Y3、X1Y3行地址為1;圖2.2中X0Y0、X1Y0、X0Y1、X1Y1位于上半部分,X0Y1、X1Y1行地址為0,X0Y0、X1Y0行地址為1;bit14-bit7是列地址,需要注意的是,列地址是不分clock region的,比如圖2.2中X0Y2、X0Y3的第一列,地址是相同的,另外,CLB、BRAM、DSP等列是統(tǒng)一編址的,列地址可以利用Viavdo軟件,通過(guò)TCL命令提取出來(lái);bit6-bit0是選擇具體某一幀的地址,由圖1.8可知,配置1個(gè)CLB(或者說(shuō)配置一列CLB),需要36個(gè)幀,但是在對(duì)LUT重配置的時(shí)候,并不是所有幀都要重新進(jìn)行RMW操作,只需要對(duì)與該LUT相關(guān)的四個(gè)幀進(jìn)行RMW操作即可,對(duì)36個(gè)幀中某一具體的幀進(jìn)行尋址,就需要用到minor address了。

2.7系列FPGA配置幀格式與尋址格式 7系列FPGA配置幀格式與圖1.8基本類似,但是由于7系列FPGA一列CLB由50個(gè)CLB組成(而Virtex-5為20個(gè)),因此一個(gè)7系列FPGA配置幀包含101個(gè)word; 7系列FPGA的配置幀的尋址格式如圖1.12所示,7系列FPGA的配置幀地址由26bit組成,與圖1.10比較之后,可以發(fā)現(xiàn),7系列FPGA 列地址為10個(gè)bit,而Virtex-5FPGA列地址為8bit,這是由于FPGA規(guī)模變大所致;地址其他部分基本沒(méi)有發(fā)生變化。

5765a53a-43cb-11ee-a2ef-92fbcf53809c.png

1.12 7系列FPGA的配置幀格式

rbt文件解析

rbt文件和bit文件一樣,都是FPGA的配置文件,bit文件是二進(jìn)制的,觀察起來(lái)是很不方便的,然而rbt文件相當(dāng)于bit文件的ASCII版本因而我們選擇rbt文件作為我們解析的對(duì)象。
一、做rbt文件解析的原因 為什么要做rbt文件解析?因?yàn)樯瞎?jié)講述配置幀格式的研究中,還存在一個(gè)不清楚的地方:圖1.8中半個(gè)word可以配置1個(gè)LUT的1/4,那這半個(gè)word的bit順序,與Verilog代碼中LUT初始值的bit順序,是否是一致的?是否存在某種映射關(guān)系?為了探索這一點(diǎn),我首先想到的是對(duì)rbt文件進(jìn)行解析,具體來(lái)說(shuō),建立一個(gè)工程,對(duì)一個(gè)LUT進(jìn)行初始化,生成bit文件后,觀察rbt文件中相應(yīng)的初始化值是怎樣的。后來(lái)發(fā)現(xiàn),進(jìn)行這項(xiàng)研究是十分必要的,研究結(jié)果表明,LUT的初始化值與rbt文件中對(duì)應(yīng)的內(nèi)容,并不是相等的,二者存在特定的映射關(guān)系, 且SLICEL和SLICEM中的LUT,映射關(guān)系是不一樣的。下面對(duì)研究過(guò)程進(jìn)行介紹。

578525e0-43cb-11ee-a2ef-92fbcf53809c.jpg

2.1 各種FPGA配置文件格式

二、準(zhǔn)備工作 rbt文件中的配置數(shù)據(jù)是二進(jìn)制格式的,觀察十分不方便,因此第一項(xiàng)準(zhǔn)備工作就是將二進(jìn)制的rbt文件轉(zhuǎn)換為十六進(jìn)制,這項(xiàng)工作是通過(guò)一個(gè)python腳本實(shí)現(xiàn)的(位置:代碼 bt_translation.py),如圖2.2所示,因?yàn)樽髡叽饲皼](méi)有寫(xiě)過(guò)python腳本,因此代碼很不完善,下面結(jié)合代碼說(shuō)明需要注意的地方: (1)rbt文件的前7行是rbt文件的介紹信息,如圖2.3所示,在用腳本轉(zhuǎn)換進(jìn)制之前,這7行需要手動(dòng)去掉(作者python水平太低); (2)圖2.2第一行的NUM值為956447,這是rbt文件去除前7行后的行數(shù);需要注意的是,本工程針對(duì)的FPGA型號(hào)是XC7A100T,每個(gè)型號(hào)的FPGA規(guī)模不同,NUM的值也要相應(yīng)變化; (3)圖2.2第三、四行為原始rbt文件的路徑(后綴改為txt)與轉(zhuǎn)換后文件的路徑,這個(gè)路徑是絕對(duì)路徑,需要根據(jù)實(shí)際情況進(jìn)行修改。

57a98bba-43cb-11ee-a2ef-92fbcf53809c.png

2.2 rbt進(jìn)制轉(zhuǎn)換代碼

57ca74ce-43cb-11ee-a2ef-92fbcf53809c.png

2.3 rbt文件介紹信息

UG470中,專門有一部分介紹bitstream的組成,這部分需要重點(diǎn)了解,詳細(xì)內(nèi)容見(jiàn)UG470table 5-19

三、具體流程

首先建立一個(gè)工程,在工程中例化一個(gè)LUT,這個(gè)LUT的位置必須是固定的,方便進(jìn)行多次對(duì)照試驗(yàn),如圖3.4所示,例化LUT的位置為SLICE_X57Y53的LUT-D,如圖2.4所示,為了簡(jiǎn)單起見(jiàn),該LUT的初始值設(shè)置為“0x6996966996696996”,為什么設(shè)置成這個(gè)值呢?因?yàn)長(zhǎng)UT初始值為該值時(shí),作用為一個(gè)六輸入一輸出異或門,而異或門是CRC算法中的基本單元。

綜合工程(工程在:工程jtag_axi_icap_lut_AX7103_simple_lut_6996文件夾下),生成rbt文件后,將rbt文件轉(zhuǎn)成十六進(jìn)制(見(jiàn)上述準(zhǔn)備工作),結(jié)果如表2.1所示:

2.1 rbt文件對(duì)應(yīng)行數(shù)和值-1

rbt文件行數(shù) rbt文件值
510521 0x69960000
510622 0x 96690000
510723 0x 69960000
510824 0x 96690000

57fa1e72-43cb-11ee-a2ef-92fbcf53809c.png

2.4 LUT初始化-1

觀察表2.1可以發(fā)現(xiàn),rbt文件對(duì)應(yīng)值的行數(shù),總是差了101個(gè)word,與之前描述的配置幀格式是可以對(duì)應(yīng)上的。那是不是可以說(shuō)Verilog代碼中LUT初始值的bit順序(圖2.4)和rbt中的bit順序,是一致的呢?還不能這么說(shuō),因?yàn)椤?”的二進(jìn)制表示是“0110”,9的二進(jìn)制表示為“1001”,可以發(fā)現(xiàn)這兩個(gè)值都是十分對(duì)稱的值。

為了進(jìn)一步驗(yàn)證是否存在某種bit順序映射關(guān)系,建立新的工程。LUT位置不變,但初始化值設(shè)置為“0x0123456789ABCDEF”,如圖2.5所示,綜合工程(工程在:工程jtag_axi_icap_lut_AX7103_simple_lut_0123文件夾下),生成rbt文件后,將rbt文件轉(zhuǎn)成十六進(jìn)制(上述操作),結(jié)果如表2.2所示:

3.2 rbt文件對(duì)應(yīng)行數(shù)和值-2

rbt文件行數(shù)

rbt文件值

510521

0x fe760000

510622

0x ba320000

510723

0x 98100000

510824

0x dc540000

581b7798-43cb-11ee-a2ef-92fbcf53809c.png

2.5 LUT初始化-2

可以發(fā)現(xiàn),rbt文件值與LUT初始化值完全不一樣,可以證明,確實(shí)存在某種特殊的映射關(guān)系。如何確定這種映射關(guān)系呢?最簡(jiǎn)單的是,建立多個(gè)工程,每個(gè)工程初始化值只有1bit(如0x0000000000000001、0x0000000000000002、0x0000000000000004、0x0000000000000008等),觀察生成rbt文件中對(duì)應(yīng)值的位置,理論上需要建立64個(gè)工程才能完全確定這個(gè)關(guān)系(但其實(shí)存在規(guī)律,不用這么多),成功破譯了其對(duì)應(yīng)關(guān)系,測(cè)試原始數(shù)據(jù)如表2.3所示(為了簡(jiǎn)單起見(jiàn),將1個(gè)LUT的4部分?jǐn)?shù)據(jù)寫(xiě)到一起,作為一個(gè)完整的word,“X”代表0x0000):

2.3測(cè)試原始數(shù)據(jù)-1

LUT初始值

rbt數(shù)據(jù)

0x X_X_X_0001

0x 8000_X_X_X

0x X_X_X_0002

0x X_8000_X_X

0x X_X_X_0004

0x 4000_X_X_X

0x X_X_X_0008

0x X_4000_X_X

0x X_X_X_0010

0x 2000_X_X_X

0x X_X_X_0020

0x X_2000_X_X

0x X_X_X_0040

0x 1000_X_X_X

0x X_X_X_0080

0x X_1000_X_X

0x X_X_X_0100

0x X_X_X_8000

0x X_X_X_0200

0x X_X_8000_X

0x X_X_X_0400

0x X_X_X_4000

0x X_X_X_0800

0x X_X_4000_X

0x X_X_X_1000

0x X_X_X_2000

0x X_X_X_2000

0x X_X_2000_X

0x X_X_X_4000

0x X_X_X_1000

0x X_X_X_8000

0x X_X_1000_X

0x 0100_X_X_X

0x X_X_X_0008

0x 0200_X_X_X

0x X_X_0008_X

0x X_0100_X_X

0x X_X_X_0080

0x X_0200_X_X

0x X_X_0080_X

0x X_X_0100_X

0x X_X_X_0800

0x X_X_0200_X

0x X_X_0800_X

0x 0001_X_X_X

0x 0008_X_X_X

0x 0002_X_X_X

0x X_0008_X_X

0x X_0001_X_X

0x 0080_X_X_X

0x X_0002_X_X

0x X_0080_X_X

0x X_X_0001_X

0x 0800_X_X_X

0x X_X_0002_X

0x X_0800_X_X

將64bit初始值的最高位(MSB)定義為bit-64,最低位(LSB)定義為bit-1,則LUT初始值與rbt文件的位置映射關(guān)系如表2.4所示:

LUT初始值

rbt數(shù)據(jù)

1

64

2

48

3

63

4

47

5

62

6

46

7

61

8

45

9

16

10

32

11

15

12

31

13

14

14

30

15

13

16

29

57

4

58

20

41

8

42

24

25

12

26

28

49

52

50

36

33

56

34

40

17

60

18

44

觀察規(guī)律后,將該映射規(guī)律用python代碼(文件位置:代碼map_SliceL.py)表示出來(lái),如圖2.6所示,

5830d35e-43cb-11ee-a2ef-92fbcf53809c.png

2.6對(duì)應(yīng)python代碼

后來(lái)又發(fā)現(xiàn),SLICEL和SLICEM的LUT,從verilog代碼初始值到rbt文件值的映射關(guān)系還是不一樣的,上面是SLICEL的映射關(guān)系,SLICEM(位置是SLICE_X56Y53)的測(cè)試數(shù)據(jù)、映射關(guān)系、python代碼分別如表2.5、表2.6、圖2.7所示,表2.6中紅色字體,代表這幾組數(shù)據(jù)是推測(cè)得來(lái)的(后來(lái)證實(shí)推測(cè)正確)。

2.5測(cè)試原始數(shù)據(jù)-1

LUT初始值

rbt數(shù)據(jù)

0x X_X_X_0001

0x X_X_8000_X

0x X_X_X_0002

0x X_X_X_8000

0x X_X_X_0004

0x X_X_4000_X

0x X_X_X_0008

0x X_X_X_4000

0x X_X_X_0010

0x X_X_2000_X

0x X_X_X_0020

0x X_X_X_2000

0x X_X_X_0040

0x X_X_1000_X

0x X_X_X_0080

0x X_X_X_1000

0x X_X_X_0100

0x 8000_X_X_X

0x X_X_X_0200

0x X_8000_X_X

0x 0100_X_X_X

0x 0008_X_X_X

0x 0200_X_X_X

0x X_0008_X_X

0x X_0100_X_X

0x 0080_X_X_X

0x X_0200_X_X

0x X_0080_X_X

0x X_X_0100_X

0x 0800_X_X_X

0x X_X_0200_X

0x X_0800_X_X

0x 0001_X_X_X

0x X_X_0008_X

0x 0002_X_X_X

0x X_X_X_0008

0x X_0001_X_X

0x X_X_0080_X

0x X_0002_X_X

0x X_X_X_0080

0x X_X_0001_X

0x X_X_0800_X

0x X_X_0002_X

0x X_X_X_0800

2.6映射關(guān)系-1

LUT初始值

rbt數(shù)據(jù)

1

32

2

16

3

31

4

15

5

30

6

14

7

29

8

13

9

64

10

48

11

63

12

47

13

62

14

46

15

61

16

45

57

52

58

36

41

56

42

40

25

60

26

44

49

20

50

4

33

24

34

8

17

28

18

12

585a7c54-43cb-11ee-a2ef-92fbcf53809c.png

2.7對(duì)應(yīng)python代碼

上述關(guān)系推導(dǎo)出來(lái)之后,還是得不到表2.2的結(jié)果,理論上,初始化值映射后,結(jié)果應(yīng)如表2.7所示,經(jīng)過(guò)多次探索嘗試后,發(fā)現(xiàn)原因:Verilog代碼中例化的LUT與FPGA上LUT的管腳的映射關(guān)系是不同的,通過(guò)一個(gè)例子說(shuō)明,如圖2.8所示,Verilog代碼例化的LUT,初始化值“0x0123456789ABCDEF”,對(duì)應(yīng)的6位地址是I5-I0,但實(shí)際FPGA內(nèi)部的LUT如圖2.9所示,對(duì)應(yīng)的地址是A6-A1。

2.7 rbt文件對(duì)應(yīng)行數(shù)和值-3

rbt文件行數(shù)

rbt文件值

510521

0x d8d80000

510622

0x ffaa0000

510723

0x 55000000

510824

0x d8d80000

586d6cf6-43cb-11ee-a2ef-92fbcf53809c.png

2.8 Verilog代碼例化的LUT

589e24ae-43cb-11ee-a2ef-92fbcf53809c.png

2.9 FPGA內(nèi)實(shí)際的LUT

而Verilog代碼例化的LUT與實(shí)際的LUT,地址引腳的對(duì)應(yīng)關(guān)系如圖2.10所示,二者又存在一種映射關(guān)系,發(fā)生這種情況的原因是,綜合工具Vivado會(huì)綜合考慮各種情況,選擇最優(yōu)的布線,為了達(dá)到這種最優(yōu),允許一個(gè)LUT的地址線進(jìn)行某種翻轉(zhuǎn)。

58b855ae-43cb-11ee-a2ef-92fbcf53809c.png

2.10引腳對(duì)應(yīng)關(guān)系

為了支持上述的翻轉(zhuǎn),作者寫(xiě)了一個(gè)簡(jiǎn)單的python腳本(目錄:代碼lut_pin_map.py),如圖3.11所示,假如數(shù)據(jù)m是Verilog代碼中的LUT初始化值,則n是映射到實(shí)際FPGA中的LUT初始化值。

58cf4732-43cb-11ee-a2ef-92fbcf53809c.png

2.11 LUT引腳映射代碼

四、總結(jié)

從Verilog代碼中的LUT初始值到rbt文件中的LUT初始值,遵循的流程如圖2.12所示,經(jīng)過(guò)兩次轉(zhuǎn)換后,Verilog代碼中的LUT初始值可以轉(zhuǎn)換為rbt文件中的LUT初始值。58f542d4-43cb-11ee-a2ef-92fbcf53809c.png

2.12 LUT初始化值轉(zhuǎn)換流程

LUT信息提取

我們?nèi)绾沃来渲玫腖UT,其位置是多少?代碼中的LUT與實(shí)際的LUT引腳映射關(guān)系是怎樣的?當(dāng)然可以通過(guò)Verilog代碼中的位置約束(如BEL="D6LUT",LOC="SLICE_X57Y53")和xdc文件中的引腳鎖定約束(如set_property LOCK_PINS {I0:A1 I1:A2 I2:A3 I3:A4 I4:A5 I5:A6}[get_cells u_xor_lut/LUT6_inst_D_right]),在生成rbt文件之前,人為地分配好一切,但是,這樣做可能會(huì)導(dǎo)致設(shè)計(jì)性能下降,因?yàn)閂ivado的綜合實(shí)現(xiàn)算法,是Xilinx公司多年研究的成果,可以認(rèn)為其是最優(yōu)的。因此,作者不建議通過(guò)添加位置約束和LUT引腳鎖定約束的方式,確定待配置LUT的信息,而是生成rbt文件之后,通過(guò)Vivado軟件和TCL命令,將LUT的位置信息和引腳約束信息提取出來(lái)。

593362e4-43cb-11ee-a2ef-92fbcf53809c.png

1.1 Verilog代碼中的LUT例化

以圖1.1中例化的LUT為例,生成rbt文件后,

LUT位置信息提取命令是:

get_tiles-of_objects [get_property SITE [get_cells -hierarchical"*LUT6_inst_D_right*" ]]

得到的結(jié)果是:CLBLM_L_X34Y53

上述結(jié)果給出的是LUT所在CLB的位置,其中X的值(34)就是前文的圖1.12中的columnaddress,可以通過(guò)Y的地址,換算前文圖1.12中的top/bottom address和row address。

LUT引腳映射關(guān)系提取命令是:get_bel_pins-of_objects [get_pins -hierarchical "*LUT6_inst_D_right*"]

得到的結(jié)果是:

SLICE_X57Y53/D6LUT/O6

SLICE_X57Y53/D6LUT/A1

SLICE_X57Y53/D6LUT/A2

SLICE_X57Y53/D6LUT/A3

SLICE_X57Y53/D6LUT/A4

SLICE_X57Y53/D6LUT/A5

SLICE_X57Y53/D6LUT/A6

上述結(jié)果與前文圖2.10中的映射關(guān)系是一致的。

HWICAP操作方法

前面的工作解決了配置幀尋址與配置幀內(nèi)容怎么寫(xiě)的問(wèn)題,下面要開(kāi)始介紹ICAP原語(yǔ)和HWICAP IP核。ICAP原語(yǔ)是Xilinx公司開(kāi)放給用戶的FPGA內(nèi)部配置接口,如圖2.1所示,使用ICAP原語(yǔ),需要寫(xiě)一個(gè)控制器,處理接口時(shí)序的問(wèn)題,Xilinx提供了這個(gè)控制器,就是HWICAP IP核,如圖2.2所示,這個(gè)IP核對(duì)外呈現(xiàn)AXI4-LiteSlave接口,使用者可以通過(guò)該接口,間接地操縱ICAP原語(yǔ)。

5950cc62-43cb-11ee-a2ef-92fbcf53809c.png

1.1 ICAP原語(yǔ)

596d4090-43cb-11ee-a2ef-92fbcf53809c.png

圖2.2 HWICAP IP

一、ICAP操作方法

ICAP操作方法主要參考UG953與UG470,尤其是UG470,第五節(jié)Configuration Details介紹了大量有用信息,需要重點(diǎn)關(guān)注的有:

(1)BitstreamComposition小節(jié),介紹了bit文件/rbt文件的組成形式,可以從中看出一些配置流程相關(guān)的信息;

(2)ConfigurationMemory Frames 小節(jié),與前文第一節(jié)介紹的幀格式是對(duì)應(yīng)的;

(3)ConfigurationPackets小節(jié),介紹了ConfigurationPackets的細(xì)節(jié),上面說(shuō)的ConfigurationMemory Frames主要是用于傳輸配置內(nèi)容(如LUT的初始化值),而Configuration Packets主要用于傳輸一些配置相關(guān)的指令,如讀寫(xiě)配置寄存器。ConfigurationPackets分為兩種,即Type 1packet和Type 2 packet,Type 2報(bào)文必須跟在Type 1報(bào)文后面,個(gè)人認(rèn)為Type 2報(bào)文的作用是對(duì)Type 1 報(bào)文進(jìn)行補(bǔ)充,因?yàn)門ype 1 報(bào)文word count字段僅有11bit,只支持2048個(gè)word傳輸,而Type 2報(bào)文word count字段有27bit,支持134217728個(gè)word,具體內(nèi)容請(qǐng)參考UG470 Table 5-20、Table 5-21、Table 5-22;

(4)ConfigurationRegisters小節(jié),配置相關(guān)寄存器,如圖2.3所示,詳細(xì)內(nèi)容請(qǐng)參考UG470 ConfigurationRegisters小節(jié)。

598d7b80-43cb-11ee-a2ef-92fbcf53809c.jpg

圖2.3 配置寄存器

從圖2.2可知,HWICAP IP核僅支持AXI4-Lite接口,也就是我們操作HWICAP IP核的時(shí)候,其實(shí)是在配置寄存器,那么該IP核有哪些寄存器呢?如圖2.4所示。

59b79bf4-43cb-11ee-a2ef-92fbcf53809c.jpg

2.4 HWICAP IP核的寄存器

下面重點(diǎn)介紹幾個(gè)用到的寄存器。我們先分析一下我們將配置幀傳輸進(jìn)去,需要哪些操作。

寫(xiě)配置幀:(1)將幀寫(xiě)入FIFO(2)寫(xiě)完后開(kāi)始配置。

上面第一步,將幀寫(xiě)入FIFO,對(duì)應(yīng)的是WriteFIFO Keyhole Register(keyhole就是鑰匙孔,可以說(shuō)十分形象了),寄存器格式如圖2.5所示;第二步,開(kāi)始配置,對(duì)應(yīng)的寄存器是Control Register,該寄存器可以控制讀,也可以控制寫(xiě),寄存器格式如圖2.6所示。

59cda82c-43cb-11ee-a2ef-92fbcf53809c.png

2.5 Write FIFO Keyhole Register

59ea37da-43cb-11ee-a2ef-92fbcf53809c.png

2.6 Control Register

讀配置幀:(1)告訴IP核讀幾幀(2)開(kāi)始讀。

第一步對(duì)應(yīng)的寄存器是Size Register,定義如圖2.7所示,第二步對(duì)應(yīng)的還是ControlRegister,如圖5.6所示。

5a0baa5a-43cb-11ee-a2ef-92fbcf53809c.png

2.7 Size Register

其他的寄存器也有各自的用處,建議讀者參考PG134,進(jìn)一步了解。

驗(yàn)證系統(tǒng)

前面做的大量調(diào)研與學(xué)習(xí),目的是為了能夠做到對(duì)單個(gè)LUT的在線讀和寫(xiě),如何證明我們前面做的工作是正確的呢?答案是建立一個(gè)驗(yàn)證系統(tǒng),在實(shí)際的FPGA系統(tǒng)中,將FPGA內(nèi)部某個(gè)特定的LUT內(nèi)容在線讀出來(lái),然后在線將某些內(nèi)容寫(xiě)進(jìn)去,如果可以成功做到這一點(diǎn),可以說(shuō)研究工作基本成功了。下面我們來(lái)介紹驗(yàn)證系統(tǒng)搭建的詳細(xì)流程。

一、開(kāi)發(fā)板與連接拓補(bǔ)

開(kāi)發(fā)板連接拓?fù)淙鐖D3.1所示,F(xiàn)PGA開(kāi)發(fā)板型號(hào)為黑金AX7103,如圖3.2所示,讀者也可以用其他Xilinx FPGA板卡搭建驗(yàn)證系統(tǒng)(前文的知識(shí)適用于所有的7系列FPGA),但是Zynq系列暫時(shí)還無(wú)法調(diào)通,應(yīng)該是作者忽略了些什么;PC與FPGA通過(guò)JTAG連接,PC上運(yùn)行Vivado軟件,在Vivado TCL Console中輸入TCL命令,可以做到PC與FPGA的交互。

5a2c116e-43cb-11ee-a2ef-92fbcf53809c.png

3.1驗(yàn)證環(huán)境拓?fù)?/span>

5a45f7b4-43cb-11ee-a2ef-92fbcf53809c.jpg

3.2 FPGA開(kāi)發(fā)板

二、FPGA內(nèi)部模塊設(shè)計(jì)

FPGA內(nèi)部模塊設(shè)計(jì)如圖3.3所示(工程位置:工程jtag_axi_icap_lut_AX7103_0123),JTAG2AXI IP核和HWICAP IP核負(fù)責(zé)實(shí)現(xiàn)接收PC的控制指令,實(shí)現(xiàn)對(duì)LUT內(nèi)容的讀寫(xiě);目標(biāo)LUT是被讀寫(xiě)的對(duì)象,其Verilog例化如圖3.4所示。

讀LUT內(nèi)容怎么驗(yàn)證?

答案:在PC的Vivado軟件TCL Console內(nèi),寫(xiě)TCL命令,讀取目標(biāo)LUT內(nèi)容,讀取內(nèi)容與rbt文件的相應(yīng)位置比對(duì)(參見(jiàn)前文表2.7,為了簡(jiǎn)單起見(jiàn),我們采用set_property LOCK_PINS{I0:A1 I1:A2 I2:A3 I3:A4 I4:A5 I5:A6} [get_cells u_xor_lut/LUT6_inst_D_right]命令,保證代碼例化LUT與真實(shí)LUT管腳一一對(duì)應(yīng),避免出現(xiàn)圖2.10的情況)。

寫(xiě)LUT內(nèi)容怎么驗(yàn)證?

答案:在PC的Vivado軟件TCL Console內(nèi),寫(xiě)TCL命令,配置目標(biāo)LUT內(nèi)容,配置完成后,觀察ILA。在配置之前,目標(biāo)LUT初始值是0x0123456789ABCDEF,計(jì)數(shù)器產(chǎn)生遞減的地址,因此可以用ILA觀察到變化的數(shù)據(jù);配置內(nèi)容為全0,配置完成后,ILA觀察到的內(nèi)容為全0,證明配置成功。

5a6607ac-43cb-11ee-a2ef-92fbcf53809c.png

3.3 FPGA內(nèi)部模塊設(shè)計(jì)

5a7b9360-43cb-11ee-a2ef-92fbcf53809c.png

3.4 LUT例化

三、如何編寫(xiě)TCL代碼 學(xué)習(xí)TCL本身的語(yǔ)法,需要參考Xilinx官方文檔,UG835、UG894,熟悉TCL基本操作,另外,Xilinx高級(jí)SAE高亞軍老師的TCL系列教程寫(xiě)的也很好; 學(xué)習(xí)第5節(jié)HWICAP和ICAP的具體操作方法,可以參考Xilinx給的HWICAP官方驅(qū)動(dòng)(其中的example和src部分讓作者受益匪淺),作者也給出了讀寫(xiě)LUT需要的TCL代碼(位置:代碼讀LUT-TCL指令和代碼寫(xiě)LUT-TCL指令),作者寫(xiě)的這些代碼大量參考了Xilinx給的驅(qū)動(dòng)(可以從作者代碼的注釋中看出來(lái)),另外一定要注意,TCL文件里面的路徑是絕對(duì)路徑,要修改成自己電腦上的路徑。 四、驗(yàn)證結(jié)果

讀LUT內(nèi)容:

下載工程“jtag_axi_icap_lut_AX7103_0123”的bit程序(記得通過(guò)VIO復(fù)位,復(fù)位是低電平復(fù)位),運(yùn)行“read_frame_510521.tcl”文件,該文件讀取LUT的1/4的內(nèi)容,對(duì)應(yīng)rbt文件的510521行(見(jiàn)前文表2.7),讀出的結(jié)果如圖3.5所示(如果讀出的結(jié)果不能完全顯示出來(lái),使用“set_param messaging.defaultLimit 5000”命令,修改TCLConsole顯示的消息數(shù)量限制),可以發(fā)現(xiàn)是對(duì)應(yīng)的(其他三行的讀操作可以運(yùn)行同目錄下的其他TCL文件,結(jié)果都是正確的)。

5a93bfbc-43cb-11ee-a2ef-92fbcf53809c.png

3.5讀結(jié)果

寫(xiě)LUT內(nèi)容

仍然是同樣的bit文件,在配置LUT內(nèi)容之前,ILA可以看到的數(shù)據(jù)如圖3.6所示,從上到下的三個(gè)信號(hào),分別是LUT的輸入(地址),LUT的輸出,與LUT輸出的并行化(LUT輸出不方便觀察,并行化之后,方便觀察LUT初始值);在Vivado TCL Console行“source_write_all.tcl”文件后(記得改地址?。。。?,LUT的內(nèi)容被重置為全0,如圖3.8所示,配置成功。

5ab604f0-43cb-11ee-a2ef-92fbcf53809c.png

3.6配置前的LUT輸出

5ad1f534-43cb-11ee-a2ef-92fbcf53809c.png

3.8配置全0LUT的輸出

驗(yàn)證系統(tǒng)

獲得的成果:

基本打通了單個(gè)LUT動(dòng)態(tài)讀寫(xiě)的流程,包括LUT尋址、LUT配置幀格式、rbt文件解析(對(duì)照用)、LUT信息提取、LUT配置方法(HWICAP和ICAP操作)、演示驗(yàn)證系統(tǒng)搭建。

后期還需要做的工作:

(1)后期需要用嵌入式CPU實(shí)現(xiàn)對(duì)HWICAP IP核的操作,而不是PC,因?yàn)镻C+Vivado+TCL的方式效率太低了;作者對(duì)軟件開(kāi)發(fā)了解有限,需要一個(gè)精通軟件的人員,協(xié)助作者開(kāi)發(fā)上層軟件及應(yīng)用,比如開(kāi)發(fā)文獻(xiàn)中的配表系統(tǒng);

(2)上述操作方法不適用于Zynq系列,原因未知,目前懷疑是某些操作不到位,Zynq系列的單個(gè)LUT動(dòng)態(tài)讀寫(xiě),還需要進(jìn)一步研究。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1629

    文章

    21736

    瀏覽量

    603419
  • Xilinx
    +關(guān)注

    關(guān)注

    71

    文章

    2167

    瀏覽量

    121428
  • 可編程
    +關(guān)注

    關(guān)注

    2

    文章

    862

    瀏覽量

    39825

原文標(biāo)題:【重磅干貨】手把手教你動(dòng)態(tài)編輯Xilinx FPGA內(nèi)LUT內(nèi)容

文章出處:【微信號(hào):zhuyandz,微信公眾號(hào):FPGA之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    原創(chuàng)手把手教你學(xué)習(xí)FPGA視頻教程,不看后悔喲

    ;amp;uk=290577677211.芯創(chuàng)電子手把手教你學(xué)習(xí)FPGA入門系列視頻教程_數(shù)碼管動(dòng)態(tài)顯示百度網(wǎng)盤下載地址:http://pan.baidu.com/share/link
    發(fā)表于 08-14 16:24

    手把手教你學(xué)CPLD/FPGA與單片機(jī)聯(lián)合設(shè)計(jì)》-周興華

    作者從2009年1月起,在《電子世界》雜志上連載了《手把手教你學(xué)CPLD/FPGA設(shè)計(jì)》講座?!?b class='flag-5'>手把手教你學(xué)CPLD/
    發(fā)表于 12-29 17:10

    手把手教你學(xué)CPLD/FPGA與單片機(jī)聯(lián)合設(shè)計(jì)》-周興華

    `作者從2009年1月起,在《電子世界》雜志上連載了《手把手教你學(xué)CPLD/FPGA設(shè)計(jì)》講座?!?b class='flag-5'>手把手教你學(xué)CPLD/
    發(fā)表于 01-06 17:21

    手把手教你學(xué)FPGA 編程規(guī)范篇

    手把手教你學(xué)FPGA 編程規(guī)范篇
    發(fā)表于 02-02 11:32

    手把手教你學(xué)FPGA設(shè)計(jì)與應(yīng)用

    手把手教你學(xué)FPGA設(shè)計(jì)與應(yīng)用.zip (17.33 MB )
    發(fā)表于 05-08 23:03

    手把手教你構(gòu)建一個(gè)完整的工程

    手把手教你構(gòu)建一個(gè)完整的工程
    發(fā)表于 08-03 09:54 ?33次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>構(gòu)建一個(gè)完整的工程

    手把手教你寫(xiě)批處理-批處理的介紹

    手把手教你寫(xiě)批處理-批處理的介紹
    發(fā)表于 10-25 15:02 ?69次下載

    美女手把手教你如何裝機(jī)(中)

    美女手把手教你如何裝機(jī)(中) 再來(lái)是硬碟的部份,這款機(jī)殼還不錯(cuò),可以旋轉(zhuǎn)支架~
    發(fā)表于 01-27 11:14 ?1467次閱讀

    美女手把手教你如何裝機(jī)(下)

    美女手把手教你如何裝機(jī)(下) 接著下來(lái)就是今天的重頭戲,開(kāi)核蘿!~
    發(fā)表于 01-27 11:16 ?2923次閱讀

    手把手教你學(xué)習(xí)FPGA—LED篇

    電子專業(yè)單片機(jī)相關(guān)知識(shí)學(xué)習(xí)教材資料——手把手教你學(xué)習(xí)FPGA—LED篇
    發(fā)表于 08-08 17:19 ?0次下載

    手把手教你安裝Quartus II

    本章手把手把教你如何安裝 Quartus II 軟件 ,并將它激活 。此外 還有USB -Blaster下載器的驅(qū)動(dòng)安裝步驟 。
    發(fā)表于 09-18 14:55 ?9次下載

    手把手教你在家搭建監(jiān)控系統(tǒng)

    手把手教你在家搭建監(jiān)控系統(tǒng)
    發(fā)表于 01-17 19:47 ?25次下載

    手把手教你如何開(kāi)始DSP編程

    手把手教你如何開(kāi)始DSP編程。
    發(fā)表于 04-09 11:54 ?12次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>如何開(kāi)始DSP編程

    手把手教你學(xué)LabVIEW視覺(jué)設(shè)計(jì)

    手把手教你學(xué)LabVIEW視覺(jué)設(shè)計(jì)手把手教你學(xué)LabVIEW視覺(jué)設(shè)計(jì)手把手教你學(xué)LabVIEW視
    發(fā)表于 03-06 01:41 ?3135次閱讀

    手把手教你學(xué)FPGA仿真

    電子發(fā)燒友網(wǎng)站提供《手把手教你學(xué)FPGA仿真.pdf》資料免費(fèi)下載
    發(fā)表于 10-19 09:17 ?2次下載
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>學(xué)<b class='flag-5'>FPGA</b>仿真