Xilinx任何一款FPGA型號都有一個唯一的IDCODE,用來區分不同的產品,同一型號不同封裝的FPGA IDCODE是一致的,可以通過JTAG、ICAP原語、AXI_HWICAP IP核等多種方式讀取。常見的應用場景是同一套代碼兼容不同的芯片型號,比如現在使用的是XC7A35T,新產品更換成了XC7A100T,兩個芯片的封裝不同,管腳配置也不同,而這兩種硬件需要使用一套C/Verilog代碼,這樣就可以通過讀取IDCODE,來進行自動區分不同的硬件,分別進行不同的處理方式。本文介紹Xilinx所有FPGA芯片型號IDCODE的獲取方法,一共4種方式,總有一種適合你,這些方法同樣適用于別的廠家的FPGA/MCU,比如Intel,Lattice,Microchip等等。
目錄
方式1:官方文檔
方式2:一個頭文件
方式3:BSDL文件
方法4:芯片IDCODE在線搜索網站
Xilinx FPGA部分型號IDCODE匯總
對于常用的Spartan-6系列可以在UG380文檔中找到對應的IDCODE,Spartan-7、Artix-7、Kinte-7、Virtex-7可以在UG470文檔里找到對應的IDCODE。
文檔下載:
https://gab.wallawalla.edu/~larry.aamodt/engr435/xilinx_spartan6_config_ug380.pdf
http://padley.rice.edu/cms/OH_GE21/UG470_7Series_Config.pdf
Spartan-6系列的IDCODE對照表位于UG380:Table 5-13: ID Codes

7系列的IDCODE對照表位于UG470:Table 1-1: Bitstream Length

ZYNQ系列沒有找到對應的IDCODE說明文檔。
在ISE開發環境下,最后一個版本14.7,可以在以下安裝路徑的文件中獲取到一些舊型號的IDCODE:
安裝路徑\Xilinx\14.7\ISE_DS\EDK\sw\XilinxProcessorIPLib\drivers\hwicap_v8_01_a\src\xhwicap_l.h

在Vivado開發環境下的xhwicap_l.h文件中,刪除了IDCODE。
安裝路徑\Vivado\SDK\2018.3\data\embeddedsw\XilinxProcessorIPLib\drivers\hwicap_v11_0\src\xhwicap_l.h
對于ZYNQ-7000系列,一只沒有找到IDCODE相關的說明文檔,終極解決辦法就是直接從BSDL邊界掃描文件中查找,關于邊界掃描,這是一個非常有意思的JTAG技巧,我們后面再介紹。只要有了FPGA芯片型號對應的BSDL文件,就可以獲取到IDCODE,而且BSDL文件在安裝ISE或安裝Vivado時,就會保存在安裝路徑下。
以查找ZYNQ-7000系列XC7Z100的IDCODE為例,ISE開發環境,BSDL文件位于:
D:\Program\Xilinx\14.7\ISE_DS\ISE\zynq\data\xc7z100*.bsd
Vivado開發環境,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文件,其實就是一個VHDL文件,我們以文本方式打開,直接搜索關鍵字IDCODE_REGISTER,會定位到如下位置:

二進制合并轉換之后,就得到了我們想要的IDCODE:
attribute?IDCODE_REGISTER?of?XC7Z100?:?entity?is
????"XXXX"?&????--?version
????"0011011"?&?--?family
????"100110110"?&???--?array?size
????"00001001001"?&?--?manufacturer
????"1";????????--?required?by?1149.1
--二進制合并處理后
attribute?IDCODE_REGISTER?of?XC7Z100?:?entity?is
????"XXXX"?&????--?version
????0011011100110110000010010011????????--0x03736093
所以,如果想要獲取任何FPGA芯片的IDCODE,只需要獲取對應的BSDL文件即可。
這里推薦一個在線的IDCODE搜索網站,其實本質是一個BSDL匯總網站:BSDL Files Library for JTAG
https://bsdl.info/index.htm
理論上任何一個支持JTAG的芯片型號,都會有一個IDCODE用來作為唯一標識。
直接輸入想要查找的芯片型號:

點開對應的BSDL文件:

可以看到IDCODE為0x03736093。
Microchip A3P125 FPGA芯片的IDCODE

Altera EP4CE40F29 FPGA芯片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