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

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

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

一文了解FPGA比特流的內(nèi)部結(jié)構(gòu)

OpenFPGA ? 來(lái)源:OpenFPGA ? 2024-07-16 18:02 ? 次閱讀

比特流是一個(gè)常用詞匯,用于描述包含FPGA完整內(nèi)部配置狀態(tài)的文件,包括布線(xiàn)、邏輯資源和IO設(shè)置。大多數(shù)現(xiàn)代FPGA都是基于SRAM的,包括Xilinx Spartan和Virtex系列。在FPGA上電或隨后的FPGA重新配置期間,比特流從外部諸如閃存這樣的非易失性存儲(chǔ)器中讀取,通過(guò)FPGA配置控制器的處理,加載到內(nèi)部的配置SRAM中。

在有些情況下,設(shè)計(jì)者需要很好地了解FPGA比特流的內(nèi)部結(jié)構(gòu)。例如,使用FPGA物理實(shí)現(xiàn)工具的參數(shù)不能訪(fǎng)問(wèn)自定義的低級(jí)比特流、實(shí)現(xiàn)復(fù)雜的配置回溯方案、通過(guò)內(nèi)部配置端口(ICAP)產(chǎn)生用于FPGA重新配置的短命令序列、讀配置狀態(tài)等。遺憾的是,逆向工程和篡改比特流以非法獲取專(zhuān)利設(shè)計(jì)信息也屬于這些使用范疇。

比特流格式

Xilinx FPGA的比特流結(jié)構(gòu)如圖1所示。

aa209e0c-375d-11ef-a4c8-92fbcf53809c.png

比特流包括以下組成部分:填充、同步字、用于訪(fǎng)問(wèn)配置寄存器的命令、存儲(chǔ)器幀和解同步字。

填充

填充的數(shù)據(jù)是全0或全1序列,被FPGA配置控制器忽略。填充數(shù)據(jù)用于非易失性存儲(chǔ)器中分離比特流。一般使用全1填充較為方便,因?yàn)閳?zhí)行擦除后閃存的狀態(tài)一般也是全1。

同步字

同步字是一個(gè)特殊值(0xAA995566),通知FPGA配置控制器處理后續(xù)的比特流數(shù)據(jù)。

解同步字

解同步字通知FPGA配置控制器比特流的末端位置。解同步字之后,所有的比特流數(shù)據(jù)被忽略,直到遇到下一個(gè)同步字。

命令

命令用于讀和寫(xiě)FPGA配置控制器寄存器。每個(gè)比特流中出現(xiàn)的一些命令,有的是ID-CODE,用于標(biāo)識(shí)比特流屬于哪個(gè)FPGA器件。幀地址寄存器(FAR)、幀數(shù)據(jù)寄存器(FDRI)和無(wú)操作(NOOP)將被忽略。

存儲(chǔ)器幀

存儲(chǔ)器幀是配置Xilinx FPGA的比特流基本單元。幀的大小與具體的FPGA系列有關(guān),系列不同,幀的大小也不同。Virtex 6器件的幀有2592位。每個(gè)Virtex 6器件具有的幀數(shù)不同,從最小7491(對(duì)于LX75T)到最大55548(對(duì)于LX550T)。幀用于多個(gè)邏輯片、IO、BRAM及其他FPGA的配置。每幀都有一個(gè)地址,對(duì)應(yīng)于FPGA配置空間的位置。比特流使用FAR和FDRI命令序列來(lái)配置幀。

Virtex 6 FPGA配置用戶(hù)指南包含足夠的關(guān)于比特流和訪(fǎng)問(wèn)FPGA配置控制器寄存器命令的文檔。然而,關(guān)于存儲(chǔ)器幀的詳細(xì)文檔不僅對(duì)于Xilinx FPGA無(wú)法獲得,而且對(duì)于其他供應(yīng)商的FPGA也是如此。

Xilinx的BITGEN實(shí)用程序

BITGEN是Xilinx的實(shí)用程序,利用本地電路描述(NCD)格式的布局布線(xiàn)后文件,創(chuàng)建用于FPGA配置的比特流。BITGEN是一個(gè)高度可配置的工具,具有100多個(gè)命令行選項(xiàng)(在命令行工具用戶(hù)指南中描述)。有些選項(xiàng)用于確定比特流輸出格式、啟用壓縮處理減少比特流大小、提高FPGA配置速度、使用CRC來(lái)確保數(shù)據(jù)完整性、對(duì)比特流加密等。

示例

以下示例用于根據(jù)差異部分配置的短比特流, 通過(guò)腳本語(yǔ)言描述比特流命令。

#!/devl/perl/bin/perl

useSwitch;

#-----------------------------------------------------------------------------
#Copyright(C)2011OutputLogic.com
#Thissourcefilemaybeusedanddistributedwithoutrestriction
#providedthatthiscopyrightstatementisnotremovedfromthefile
#andthatanyderivativeworkcontainstheoriginalcopyrightnotice
#andtheassociateddisclaimer.
#
#THISSOURCEFILEISPROVIDED"ASIS"ANDWITHOUTANYEXPRESS
#ORIMPLIEDWARRANTIES,INCLUDING,WITHOUTLIMITATION,THEIMPLIED
#WARRANTIESOFMERCHANTIBILITYANDFITNESSFORAPARTICULARPURPOSE.
#-----------------------------------------------------------------------------
#
#AscripttoparseXilinxFPGAbitstreamin.RBTformat
#
if($#ARGV
";
}

$verbose=2;

open(RBT_FILE,"<$ARGV[0]")??????????||?die?"Error:?can't?open?$ARGV[0]?for?input
";

#?Bus?OP?codes
$opcode{"00"}?=?"no?op";
$opcode{"01"}?=?"read";
$opcode{"10"}?=?"write";
$opcode{"11"}?=?"decrypt";

#?Regster?Addresses
$reg{"00000"}?=?"CRC?";
$reg{"00001"}?=?"FAR?";
$reg{"00010"}?=?"FDRI";
$reg{"00011"}?=?"FDRO";
$reg{"00100"}?=?"CMD?";
$reg{"00101"}?=?"CTL?";
$reg{"00110"}?=?"MASK";
$reg{"00111"}?=?"STAT";
$reg{"01000"}?=?"LOUT";
$reg{"01001"}?=?"COR?";
$reg{"01010"}?=?"MFWR";
$reg{"01011"}?=?"CBC?";
$reg{"01100"}?=?"ID??";
$reg{"01101"}?=?"AXSS";
$reg{"01110"}?=?"COR1";
$reg{"01111"}?=?"CSOB";
$reg{"10000"}?=?"WBSTAR";
$reg{"10001"}?=?"TIMER";
$reg{"10010"}?=?"RBCRC0";
$reg{"10011"}?=?"RBCRC1";
$reg{"10100"}?=?"RBCRC2";
$reg{"10101"}?=?"EFAR";
$reg{"10110"}?=?"BOOTSTS";
$reg{"10111"}?=?"TESTMODE";
$reg{"11000"}?=?"CTL1";


#?Configuration?Commands
$command{"00000"}?=?"NULL";
$command{"00001"}?=?"WCFG";
$command{"00010"}?=?"MFW";
$command{"00011"}?=?"LFRM";
$command{"00100"}?=?"RCFG";
$command{"00101"}?=?"START";
$command{"00110"}?=?"RCAP";
$command{"00111"}?=?"RCRC";
$command{"01000"}?=?"AGHIGH";
$command{"01001"}?=?"SWITCH";
$command{"01010"}?=?"GRESTORE";
$command{"01011"}?=?"SHUTDOWN";
$command{"01100"}?=?"GCAPTURE";
$command{"01101"}?=?"DESYNCH";
$command{"01110"}?=?"DRTEST";
$command{"01111"}?=?"IPROG";
$command{"10000"}?=?"CRCC";

$fa?=?-1;
$last_fa?=?-1;
$in_LOUT?=?0;
@LOUT_wordcnt?=?();

while?()
{
$type="";
$op="";
$reg="";
chop;
nextif(!/^[01]/);

if(/^10101010100110010101010101100110/){
$type="Syncword";
}
elsif(/^11111111111111111111111111111111/){
$type="Dummyword";
}
elsif(/^00000000000000000000000010111011/){
$type="BusWidthword";
}
elsif(/^00010001001000100000000001000100/){
$type="8/16/32BusWidth";
}
elsif(/^001/){
$type="Type1";
}
elsif(/^010/){
$type="Type2";
}
elsif(/^00000000000000000000000000000000/){
$type="NOOP";
$wordcnt=0;
}
else{
if(($registereq"FDRI")||($registereq"FDRO")||($last_commandeq"LFRM")){
$type="PartialCRCword";
}else{
$type="TypeUnknown";
}
}

if($typeeq"Type1"||$typeeq"Type2"){
$s=substr($_,3,2);
if($opcode{$s}ne"")
{
$op=$opcode{$s};
}
else
{
$op="Unknown";
}
}

if($typeeq"Type1"){
$s=substr($_,14,5);
if($reg{$s}ne""){
$register=$reg{$s};
}
else{
$register="Unknown";
}
$wordcnt=&bin2dec(substr($_,21,11));
}

if($typeeq"Type2"){
$wordcnt=&bin2dec(substr($_,5,27));
}

$text="$type";
if($opeq"read")
{
$text.="$op"."$wordcntwordsfrom"."$register";
}
elsif(($opeq"write")||($opeq"decrypt"))
{
$text.="$op"."$wordcntwordsto"."$register";
}
elsif($opeq"noop")
{
$text.="NOOP";
}
printf("%10s%s
",&bin2hex($_),$text);


#Alittlehacksowecanseethenextstreamalso
if(($registereq"LOUT")&&($wordcnt>1))
{
$in_LOUT++;
push@LOUT_wordcnt,$wordcnt;
$wordcnt=0;
}


#startprintingouteverything
for($i=0;$i<$wordcnt?&&?(($op?eq?"write")?||?($op?eq?"decrypt")?||?($op?eq?"read"))?&&?($_?=?);$i++)
{
chop;

if(($opeq"write")&&($registereq"FAR"))
{
$fa=$_;
}

if(($registereq"FDRI")||($registereq"FDRO"))
{
#printf("%s%10s
","dataword".$i,$_);

#don'tprintallframewords

if($i==0)
{
printf("%s%d...%d
","datawords",$i,$wordcnt-1);
}
}
elsif($registereq"LOUT")
{
$this_fa=&bin2dec($_);
$BlkType=&bin2dec(substr($_,8,3));
$TopBot=(&bin2dec(substr($_,11,1))==0)?"Top":"Bot";
$MajRow=&bin2dec(substr($_,12,5));
$MajCol=&bin2dec(substr($_,17,8));
$MinCol=&bin2dec(substr($_,25,7));

printf("%10s%s[Block%d%sRow%dCol%dMinor%d]
",&bin2hex($_),"FrameAddress",$BlkType,$TopBot,$MajRow,$MajCol,$MinCol);


if($this_fa

關(guān)于腳本的使用,可以查看《Verilog數(shù)字系統(tǒng)基礎(chǔ)設(shè)計(jì)-CRC》。

仔細(xì)觀(guān)察比特流,能區(qū)分出同步和解同步命令、屬于Virtex-6 LX240T FPGA的IDCODE,以及兩個(gè)405個(gè)和243個(gè)字的幀。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guā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)注

    1640

    文章

    21907

    瀏覽量

    611557
  • 控制器
    +關(guān)注

    關(guān)注

    113

    文章

    16820

    瀏覽量

    182115
  • 比特流
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    8220
  • Vivado
    +關(guān)注

    關(guān)注

    19

    文章

    822

    瀏覽量

    67858

原文標(biāo)題:【Vivado那些事】簡(jiǎn)談FPGA比特流結(jié)構(gòu)

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    了解FPGA比特流結(jié)構(gòu)

    比特流個(gè)常用詞匯,用于描述包含FPGA完整內(nèi)部配置狀態(tài)的文件,包括布線(xiàn)、邏輯資源和IO設(shè)置。大多數(shù)現(xiàn)代FPGA都是基于SRAM的,包括X
    發(fā)表于 11-30 10:59 ?1301次閱讀

    DAC1280 TDATA引腳輸入的比特流,怎么產(chǎn)生這個(gè)比特流,算法是什么?

    我想請(qǐng)問(wèn)下關(guān)于DAC1280的TDATA引腳輸入的比特流的問(wèn)題: 1,怎么產(chǎn)生這個(gè)比特流,算法是什么? 2,怎么控制輸出信號(hào)的頻率? 對(duì)您的回答感激不盡,謝謝。
    發(fā)表于 01-06 06:21

    無(wú)法生成比特流

    你好,我使用Vivado 2017.4;當(dāng)我運(yùn)行Synthesis和Implementation時(shí),切似乎都可以。但是,當(dāng)我想生成比特流文件時(shí),沒(méi)有任何錯(cuò)誤消息發(fā)生。.runs / impl_l
    發(fā)表于 11-09 11:37

    如何使用IMPACT在FPGA xilinx中下載比特流

    你好,請(qǐng)有人解釋我如何使用IMPACT在FPGA xilinx中下載比特流先謝謝你以上來(lái)自于谷歌翻譯以下為原文hello,please can someone explain me how
    發(fā)表于 01-15 10:08

    中途向ICAP中止寫(xiě)入部分比特流

    嗨,我正在嘗試部分自我重新配置。想法是通過(guò)介質(zhì)將部分比特流發(fā)送到FPGAFPGA接收它(在多個(gè)塊中)并將比特流寫(xiě)入ICAP。當(dāng)連接發(fā)生時(shí),我的FP
    發(fā)表于 02-14 09:40

    怎么在我的比特流中攻擊BRAM

    嗨,我有個(gè)應(yīng)用程序,我希望在下載到FPGA之前使用類(lèi)似于data2mem的工具來(lái)在FPGA比特流中破解塊內(nèi)存內(nèi)容。FPGA可以是Virte
    發(fā)表于 03-19 12:44

    比特流是什么

    `請(qǐng)問(wèn)比特流是什么?`
    發(fā)表于 08-23 16:24

    怎么為FPGA生成了個(gè)比特流

    XPS中設(shè)計(jì)了您的硬件平臺(tái),最終為FPGA生成了個(gè)比特流?!边@是真實(shí)的,我就是這樣?,F(xiàn)在它說(shuō),“......你將硬件平臺(tái)描述導(dǎo)出到軟件開(kāi)發(fā)套件(SDK)?!笔謨?cè)說(shuō)要遵循以下步驟:1.在PlanAhead
    發(fā)表于 03-23 09:19

    如何使用Vivado生成特定的部分比特流

    Mul7.穆添加8. Mul Sub9. Mul Mul現(xiàn)在我希望為上述任何種組合提供完整的比特流(比如Add Add)。并且我希望部分比特流用于所選擇的組合,即添加用于部分區(qū)域1和1。 2,Sub
    發(fā)表于 05-05 09:42

    如何使用GZip的比特流完成重新配置?

    。 FPGA將始終首先引導(dǎo)未壓縮的黃金比特流,這將決定下個(gè)引導(dǎo)哪個(gè)比特流。理想情況下,黃金比特流中的MicroBlaze可以從閃存讀取壓縮
    發(fā)表于 05-29 17:12

    請(qǐng)問(wèn)如何在沒(méi)有靜態(tài)路由的情況下生成部分比特流?

    reconfig。模塊加載在可重新配置的插槽內(nèi),個(gè)帶有移位 - 右側(cè)模塊加載在可重新配置的插槽內(nèi))。部分設(shè)計(jì)正常工作,我能夠通過(guò)PCAP接口加載FPGA中的部分比特流。此外,我解碼了左移部分
    發(fā)表于 06-04 08:52

    是否需要在flash上??切換黃金比特流和多重比特流的位置?

    嗨專(zhuān)家, 我正在使用spartan-6 FPGA進(jìn)行多重啟動(dòng)實(shí)驗(yàn)。我發(fā)現(xiàn)位文件位于ug380上,如下圖所示。黃金比特流位于閃存的下部塊上,多重引導(dǎo)比特流位于閃存的較高塊上。 因此,如果我想使用保護(hù)區(qū)
    發(fā)表于 06-09 17:43

    匹配位置對(duì)比特流隨機(jī)性的影響研究

    本文闡述了IP 報(bào)文標(biāo)識(shí)字段比特流隨機(jī)性的評(píng)價(jià)標(biāo)準(zhǔn),通過(guò)對(duì)大量實(shí)測(cè)報(bào)文進(jìn)行統(tǒng)計(jì)分析證明了比特流的匹配位置對(duì)隨機(jī)測(cè)度值有定影響。結(jié)果表明,標(biāo)識(shí)字段比特流隨機(jī)測(cè)度值
    發(fā)表于 08-04 08:20 ?19次下載

    Zynq開(kāi)發(fā)板FPGA比特流文件下載方式

    Zynq開(kāi)發(fā)板FPGA比特流文件可以通過(guò)三種途徑下載: 1. 利用SDK生成的FSBL.elf文件自動(dòng)加載FPGA比特流配置文件,將比特流
    發(fā)表于 02-08 15:20 ?1381次閱讀

    使用加密保護(hù)7系列FPGA比特流

    電子發(fā)燒友網(wǎng)站提供《使用加密保護(hù)7系列FPGA比特流.pdf》資料免費(fèi)下載
    發(fā)表于 09-13 15:31 ?0次下載
    使用加密保護(hù)7系列<b class='flag-5'>FPGA</b><b class='flag-5'>比特流</b>

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品