Xilinx的每一片FPGA都有一个Device DNA(Device identifier),这个DNA就类似于我们每个人的ID一样,是独一无二的。Device DNA是非易失的,不可更改的,换言之,它只有只读属性。那么如何获取这个DNA呢?(这里以UltraScale系列芯片为例)
方法1:通过Primitive DNA_PORTE2
DNA_PORTE2是一个Primitive,和其他Primitive一样,可直接在代码中实例化,其端口如下图所示(图片来源Figure 8-1,Table 8-6,ug570)。所有端口位宽均为1。
这里主要控制端口是READ和SHIFT。当READ有效时(高有效,且至少持续一个时钟周期),96bit DNA信息将被同时加载到一个移位寄存器中,如下图所示(图片来源:Figure 8-2,ug570)。当SHIFT有效且READ无效时,移位寄存器开始在SHIFT的控制下进行移位操作,最先从DOUT输出的是DNA的最低位。
对于端口DIN会有如下图所示的三种处理方式(图片来源:Figure 8-3,Figure8-4,Figure8-5,ug570)。第一种方式,将DIN恒接高电平或低电平;第二种方式,将DIN与DOUT连接,这也就是把上图中移位寄存器的DOUT连接到DIN端口,构成一个桶状移位寄存器;第三种方式,需要用户单独设计应用代码,以控制DIN。
我们采用第一种方式。首先在代码中实例化DNA_PORTE2,如下图所示。该Primitive提供了一个仿真值,由参数SIM_DNA_VALUE确定,这有助于我们通过仿真来分析READ和SHIFT的时序关系。
仿真结果如下图所示。READ为高时,加载96bit DNA,SHIFT为高时,从移位寄存器中依次输出DNA,其中最先输出DNA[0]。
方法2:在Hardware Manager中读取
从Vivado 2015.3版本开始,打开Hardware Manager,选中FPGA芯片,在Property窗口中,找到FUSE_DNA,这个就对应FPGA Device DNA。