本文转载自: 电子电路开发学习微信公众号
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:官方文档
对于常用的Spartan-6系列可以在UG380文档中找到对应的IDCODE,Spartan-7、Artix-7、Kinte-7、Virtex-7可以在UG470文档里找到对应的IDCODE。
文档下载:
xilinx_spartan6_config_ug380.pdf
https://gab.wallawalla.edu/~larry.aamodt/engr435/xilinx_spartan6_config_...
UG470_7Series_Config.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说明文档。
方式2:一个头文件
在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
方式3:BSDL文件
对于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文件即可。
方法4:芯片IDCODE在线搜索网站
这里推荐一个在线的IDCODE搜索网站,其实本质是一个BSDL汇总网站:BSDL Files Library for JTAG
理论上任何一个支持JTAG的芯片型号,都会有一个IDCODE用来作为唯一标识。
直接输入想要查找的芯片型号:
点开对应的BSDL文件:
可以看到IDCODE为0x03736093。
Microchip A3P125 FPGA芯片的IDCODE
Altera EP4CE40F29 FPGA芯片IDCODE
Xilinx 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