Xilinx任何一款FPGA型號(hào)都有一個(gè)唯一的IDCODE,用來(lái)區(qū)分不同的產(chǎn)品,同一型號(hào)不同封裝的FPGA IDCODE是一致的,可以通過(guò)JTAG、ICAP原語(yǔ)、AXI_HWICAP IP核等多種方式讀取。常見(jiàn)的應(yīng)用場(chǎng)景是同一套代碼兼容不同的芯片型號(hào),比如現(xiàn)在使用的是XC7A35T,新產(chǎn)品更換成了XC7A100T,兩個(gè)芯片的封裝不同,管腳配置也不同,而這兩種硬件需要使用一套C/Verilog代碼,這樣就可以通過(guò)讀取IDCODE,來(lái)進(jìn)行自動(dòng)區(qū)分不同的硬件,分別進(jìn)行不同的處理方式。本文介紹Xilinx所有FPGA芯片型號(hào)IDCODE的獲取方法,一共4種方式,總有一種適合你,這些方法同樣適用于別的廠家的FPGA/MCU,比如Intel,Lattice,Microchip等等。 目錄 方式1:官方文檔對(duì)于常用的Spartan-6系列可以在UG380文檔中找到對(duì)應(yīng)的IDCODE,Spartan-7、Artix-7、Kinte-7、Virtex-7可以在UG470文檔里找到對(duì)應(yīng)的IDCODE。 文檔下載: Spartan-6系列的IDCODE對(duì)照表位于UG380:Table 5-13: ID Codes
7系列的IDCODE對(duì)照表位于UG470:Table 1-1: Bitstream Length ZYNQ系列沒(méi)有找到對(duì)應(yīng)的IDCODE說(shuō)明文檔。 方式2:一個(gè)頭文件在ISE開(kāi)發(fā)環(huán)境下,最后一個(gè)版本14.7,可以在以下安裝路徑的文件中獲取到一些舊型號(hào)的IDCODE: 安裝路徑\Xilinx\14.7\ISE_DS\EDK\sw\XilinxProcessorIPLib\drivers\hwicap_v8_01_a\src\xhwicap_l.h
在Vivado開(kāi)發(fā)環(huán)境下的xhwicap_l.h文件中,刪除了IDCODE。
安裝路徑\Vivado\SDK\2018.3\data\embeddedsw\XilinxProcessorIPLib\drivers\hwicap_v11_0\src\xhwicap_l.h
方式3:BSDL文件對(duì)于ZYNQ-7000系列,一只沒(méi)有找到IDCODE相關(guān)的說(shuō)明文檔,終極解決辦法就是直接從BSDL邊界掃描文件中查找,關(guān)于邊界掃描,這是一個(gè)非常有意思的JTAG技巧,我們后面再介紹。只要有了FPGA芯片型號(hào)對(duì)應(yīng)的BSDL文件,就可以獲取到IDCODE,而且BSDL文件在安裝ISE或安裝Vivado時(shí),就會(huì)保存在安裝路徑下。 以查找ZYNQ-7000系列XC7Z100的IDCODE為例,ISE開(kāi)發(fā)環(huán)境,BSDL文件位于: D:\Program\Xilinx\14.7\ISE_DS\ISE\zynq\data\xc7z100*.bsd
Vivado開(kāi)發(fā)環(huán)境,BSDL文件位于: D:\Program\Xilinx\Vivado\SDK\2018.3\data\parts\xilinx\zynq\public\bsdl\xc7z100*.bsd
或 D:\Program\Xilinx\Vivado\Vivado\2018.3\data\parts\xilinx\zynq\public\bsdl\xc7z100*.bsd
所謂的BSDL文件,其實(shí)就是一個(gè)VHDL文件,我們以文本方式打開(kāi),直接搜索關(guān)鍵字IDCODE_REGISTER,會(huì)定位到如下位置:
二進(jìn)制合并轉(zhuǎn)換之后,就得到了我們想要的IDCODE:
attribute IDCODE_REGISTER of XC7Z100 : entity is 'XXXX' & -- version '0011011' & -- family '100110110' & -- array size '00001001001' & -- manufacturer '1'; -- required by 1149.1
--二進(jìn)制合并處理后 attribute IDCODE_REGISTER of XC7Z100 : entity is 'XXXX' & -- version 0011011100110110000010010011 --0x03736093
所以,如果想要獲取任何FPGA芯片的IDCODE,只需要獲取對(duì)應(yīng)的BSDL文件即可。 方法4:芯片IDCODE在線搜索網(wǎng)站這里推薦一個(gè)在線的IDCODE搜索網(wǎng)站,其實(shí)本質(zhì)是一個(gè)BSDL匯總網(wǎng)站:BSDL Files Library for JTAG https://bsdl.info/index.htm
理論上任何一個(gè)支持JTAG的芯片型號(hào),都會(huì)有一個(gè)IDCODE用來(lái)作為唯一標(biāo)識(shí)。 直接輸入想要查找的芯片型號(hào):
點(diǎn)開(kāi)對(duì)應(yīng)的BSDL文件:
可以看到IDCODE為0x03736093。
Microchip A3P125 FPGA芯片的IDCODE Altera EP4CE40F29 FPGA芯片IDCODE
Xilinx FPGA部分型號(hào)IDCODE匯總/* Virtex4 Devices. */ #define IDCODE_XC4VLX15 0x01658093 #define IDCODE_XC4VLX25 0x0167C093 #define IDCODE_XC4VLX40 0x016A4093 #define IDCODE_XC4VLX60 0x016B4093 #define IDCODE_XC4VLX80 0x016D8093 #define IDCODE_XC4VLX100 0x01700093 #define IDCODE_XC4VLX160 0x01718093 #define IDCODE_XC4VLX200 0x01734093 #define IDCODE_XC4VSX25 0x02068093 #define IDCODE_XC4VSX35 0x02088093 #define IDCODE_XC4VSX55 0x020B0093 #define IDCODE_XC4VFX12 0x01E58093 #define IDCODE_XC4VFX20 0x01E64093 #define IDCODE_XC4VFX40 0x01E8C093 #define IDCODE_XC4VFX60 0x01EB4093 #define IDCODE_XC4VFX100 0x01EE4093 #define IDCODE_XC4VFX140 0x01F14093
#define IDCODE_V4_NUM_DEVICES 17
/* Virtex5 Devices */ #define IDCODE_XC5VLX30 0x0286E093 #define IDCODE_XC5VLX50 0x02896093 #define IDCODE_XC5VLX85 0x028AE093 #define IDCODE_XC5VLX110 0x028D6093 #define IDCODE_XC5VLX220 0x0290C093 #define IDCODE_XC5VLX330 0x0295C093 #define IDCODE_XC5VLX30T 0x02A6E093 #define IDCODE_XC5VLX50T 0x02A96093 #define IDCODE_XC5VLX85T 0x02AAE093 #define IDCODE_XC5VLX110T 0x02AD6093 #define IDCODE_XC5VLX220T 0x02B0C093 #define IDCODE_XC5VLX330T 0x02B5C093 #define IDCODE_XC5VSX35T 0x02E72093 #define IDCODE_XC5VSX50T 0x02E9A093 #define IDCODE_XC5VSX95T 0x02ECE093 #define IDCODE_XC5VFX30T 0x03276093 #define IDCODE_XC5VFX70T 0x032C6093 #define IDCODE_XC5VFX100T 0x032D8093 #define IDCODE_XC5VFX130T 0x03300093 #define IDCODE_XC5VFX200T 0x03334093
#define IDCODE_V5_NUM_DEVICES 20
/* Virtex6 Devices */ #define IDCODE_XC6VHX250T 0x042A2093 #define IDCODE_XC6VHX255T 0x042A4093 #define IDCODE_XC6VHX380T 0x042A8093 #define IDCODE_XC6VHX565T 0x042AC093 #define IDCODE_XC6VLX75T 0x04244093 #define IDCODE_XC6VLX130T 0x0424A093 #define IDCODE_XC6VLX195T 0x0424C093 #define IDCODE_XC6VLX240T 0x04250093 #define IDCODE_XC6VLX365T 0x04252093 #define IDCODE_XC6VLX550T 0x04256093 #define IDCODE_XC6VLX760 0x0423A093 #define IDCODE_XC6VSX315T 0x04286093 #define IDCODE_XC6VSX475T 0x04288093 #define IDCODE_XC6VCX75T 0x042C4093 #define IDCODE_XC6VCX130T 0x042CA093 #define IDCODE_XC6VCX195T 0x042CC093 #define IDCODE_XC6VCX240T 0x042D0093
#define IDCODE_V6_NUM_DEVICES 17
/* Spartan6 Devices. */ #define IDCODE_XC6SLX4 0x04000093 #define IDCODE_XC6SLX9 0x04001093 #define IDCODE_XC6SLX16 0x04002093 #define IDCODE_XC6SLX25 0x04004093 #define IDCODE_XC6SLX25T 0x04024093 #define IDCODE_XC6SLX45 0x04008093 #define IDCODE_XC6SLX45T 0x04028093 #define IDCODE_XC6SLX75 0x0400E093 #define IDCODE_XC6SLX75T 0x0402E093 #define IDCODE_XC6SLX100 0x04011093 #define IDCODE_XC6SLX100T 0x04031093 #define IDCODE_XC6SLX150 0x0401D093 #define IDCODE_XC6SLX150T 0x0403D093
#define IDCODE_S6_NUM_DEVICES 13
/* Kintex7 Devices. */ #define IDCODE_XC7K30T 0x03642093 #define IDCODE_XC7K70T 0x03647093 #define IDCODE_XC7K160T 0x0364C093 #define IDCODE_XC7K325T 0x03651093 #define IDCODE_XC7K410T 0x03656093 #define IDCODE_XC7K235T 0x0365B093 #define IDCODE_XC7K125T 0x0365C093 #define IDCODE_XC7K290T 0x0365D093 #define IDCODE_XC7K355T 0x03747093 #define IDCODE_XC7K420T 0x0374C093 #define IDCODE_XC7K480T 0x03751093
#define IDCODE_K7_NUM_DEVICES 11
/* Virtex7 Devices. */ #define IDCODE_XC7VX80T 0x03680093 #define IDCODE_XC7VX82T 0x03681093 #define IDCODE_XC7VX330T 0x03667093 #define IDCODE_XC7VX415T 0x03682093 #define IDCODE_XC7V450T 0x0366C093 #define IDCODE_XC7VX485T 0x03687093 #define IDCODE_XC7VX550T 0x03692093 #define IDCODE_XC7V585T 0x03671093 #define IDCODE_XC7VX690T 0x03691093 #define IDCODE_XC7VX980T 0x03696093
#define IDCODE_V7_NUM_DEVICES 10
/* Artix7 Devices. */ #define IDCODE_XC7A15 0x03627093 #define IDCODE_XC7A30T 0x0362D093 #define IDCODE_XC7A50T 0x0362C093 #define IDCODE_XC7A100T 0x03631093 #define IDCODE_XC7A200T 0x03636093 #define IDCODE_XC7A350T 0x0363B093
#define IDCODE_A7_NUM_DEVICES 6
/* Zynq Devices. Latest as of July 2023 */ #define IDCODE_XC7Z007 0x03723093 #define IDCODE_XC7Z010 0x03722093 #define IDCODE_XC7Z012 0x0373C093 #define IDCODE_XC7Z014 0x03728093 #define IDCODE_XC7Z015 0x0373B093 #define IDCODE_XC7Z020 0x03727093 #define IDCODE_XC7Z030 0x0372C093 #define IDCODE_XC7Z035 0x03732093 #define IDCODE_XC7Z045 0x03731093 #define IDCODE_XC7Z100 0x03736093
#define IDCODE_ZYNQ_NUM_DEVICES 10
|