获取Xilinx FPGA芯片IDCODE的4种方法

描述

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汇总

方式1:官方文档

对于常用的Spartan-6系列可以在UG380文档中找到对应的IDCODE,Spartan-7、Artix-7、Kinte-7、Virtex-7可以在UG470文档里找到对应的IDCODE。

Spartan-6系列的IDCODE对照表位于UG380:Table 5-13: ID Codes

FPGA

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

FPGA

ZYNQ系列没有找到对应的IDCODE说明文档。

方式2:一个头文件

在ISE开发环境下,最后一个版本14.7,可以在以下安装路径的文件中获取到一些旧型号的IDCODE:

 


 

安装路径Xilinx14.7ISE_DSEDKswXilinxProcessorIPLibdrivershwicap_v8_01_asrcxhwicap_l.h

FPGA

在Vivado开发环境下的xhwicap_l.h文件中,删除了IDCODE。

 


 

安装路径VivadoSDK2018.3dataembeddedswXilinxProcessorIPLibdrivershwicap_v11_0srcxhwicap_l.h

方式3:BSDL文件

对于ZYNQ-7000系列,一只没有找到IDCODE相关的说明文档,终极解决办法就是直接从BSDL边界扫描文件中查找,关于边界扫描,这是一个非常有意思的JTAG技巧,我们后面再介绍。只要有了FPGA芯片型号对应的BSDL文件,就可以获取到IDCODE,而且BSDL文件在安装ISE或安装Vivado时,就会保存在安装路径下。

以查找ZYNQ-7000系列XC7Z100的IDCODE为例,ISE开发环境,BSDL文件位于:

 


 

D:ProgramXilinx14.7ISE_DSISEzynqdataxc7z100*.bsd

Vivado开发环境,BSDL文件位于:

 


 

D:ProgramXilinxVivadoSDK2018.3datapartsxilinxzynqpublicsdlxc7z100*.bsd

 


 

D:ProgramXilinxVivadoVivado2018.3datapartsxilinxzynqpublicsdlxc7z100*.bsd

所谓的BSDL文件,其实就是一个VHDL文件,我们以文本方式打开,直接搜索关键字IDCODE_REGISTER,会定位到如下位置:

FPGA

二进制合并转换之后,就得到了我们想要的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用来作为唯一标识。 直接输入想要查找的芯片型号:

FPGA

点开对应的BSDL文件:

FPGA

可以看到IDCODE为0x03736093

Microchip A3P125 FPGA芯片的IDCODE

FPGA

Altera EP4CE40F29 FPGA芯片IDCODE

FPGA

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

  审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分