文章目录

  • 应用场景
  • 方法1:通过JTAG读取
  • 方法2:调用原语读取
  • DNA_PORT原语的使用
  • 注意

用过单片机的朋友都知道,单片机芯片内部都有一串序列号,比如STM32,称之为Unique device ID,是一个96Bit的只读数据。和单片机一样,FPGA芯片内部同样也有ID,以常用的Xilinx和Altera为例,Altera称之为Chip ID,Xilinx FPGA称之为Device DNA,

应用场景

上位机通过编程器先读取出芯片的ID,经过加密算法后生成密钥,下载程序的同时,向Flash中某个地址写入密钥。

芯片上电之后,先读取芯片的ID,经过加密算法后,生成本地密钥,和Flash中的密钥相对比,若相同执行用户程序,若不同,则跳入死循环或执行开发者指定的功能。

Xilinx的FPGA芯片,在7系列和7系列之前的产品,DNA是一个57Bit的数据,而在7系列之后,如Ultraslace等新型号,DNA是96Bit。

方法1:通过JTAG读取

ISE环境,以14.7版本为例,将下载器连接到FPGA芯片之后,使用iMPACT软件,在已经连接的芯片上右键选择Read Device DNA,可以读出芯片的DNA。

vivado环境下,使用自带的Hardware Manager,连接到芯片之后,在REGISTER->EFUSE->DNA_PORT,可以看到读取的DNA寄存器的值。

方法2:调用原语读取

通过我们需要在程序读取出芯片的DNA,可以通过调用DNA_PORT原语的方式来读取芯片的DNA。

原语的例化模板,可以在ISE或Vivado自带的代码模板中找到:

ISE中的代码模板

Vivado中的代码模板

Vivado下UltraScale系列的DNA_PORT2原语模板

DNA_PORT原语的使用

关于DNA_PORT原语的介绍和使用,可以查看Xilinx官方文档,

UG470_7Series_Config

https://www.xilinx.com/content/dam/xilinx/support/documents/user_guides/ug470_7Series_Config.pdf

7系列及其之前的FPGA芯片,DNA_PORT原语:

DNA_PORT #(.SIM_DNA_VALUE(57'h000000000000000)  // Specifies the Pre-programmed factory ID value
)DNA_PORT_inst (.DOUT(DOUT),   // 1-bit output: DNA output data.CLK(CLK),     // 1-bit input: Clock input.DIN(DIN),     // 1-bit input: User data input pin.READ(READ),   // 1-bit input: Active high load DNA, active low read input.SHIFT(SHIFT)  // 1-bit input: Active high shift enable input
);

7系列之后Ultraslace系列的FPGA,使用DNA_PORT2原语:

DNA_PORTE2 #(.SIM_DNA_VALUE(96'h000000000000000000000000)  // Specifies a sample 96-bit DNA value for simulation
)DNA_PORTE2_inst (.DOUT(DOUT),   // 1-bit output: DNA output data.CLK(CLK),     // 1-bit input: Clock input.DIN(DIN),     // 1-bit input: User data input pin.READ(READ),   // 1-bit input: Active-High load DNA, active-Low read input
.SHIFT(SHIFT)  // 1-bit input: Active-High shift enable input
);

操作说明

先拉高READ信号,加载DNA寄存器,然后给出SHIFT拉高使能信号,DOUT串口输出DNA值,57个clk之后,DNA输出完毕,SHIFT拉低取消使能。

驱动代码:

/**************************************************************** Copyright(C), 2010-2022, YOUR CORP/INC/COMPANY/LTD/LIMITED.* ModuleName : get_dna.v * Date       : 2022年5月22日* Time       : 11:06:00* Author     : wcc149* Function   : XC7A75T获取DNA芯片ID* Version    : v1.0*      Version | Modify*      ----------------------------------*       v1.0    .....***************************************************************/module get_dna(//inputsinput clk,input rst_n,//Outputs output reg [56:0] dna,output reg dna_vld
);localparam S0_IDLE   = 4'd0;
localparam S1_LOAD   = 4'd1;
localparam S2_SHIFT  = 4'd2;
localparam S3_FINSIH = 4'd3;reg [7:0] cnt_bit;
reg [56:0] dna_buf;
reg [3:0] fsm;
reg load;
reg shift;always @ (posedge clk) beginif(!rst_n) begincnt_bit <= 0;fsm <= S0_IDLE;load <= 0;shift <= 0;dna <= 0;dna_vld <= 0;endelse begincase (fsm)S0_IDLE: beginif(cnt_bit != 10)//上电等待10个clkcnt_bit <= cnt_bit + 1;else begincnt_bit <= 0;fsm <= S1_LOAD;load <= 0;shift <= 0;dna <= 0;dna_vld <= 0;endendS1_LOAD:beginif(cnt_bit != 5) begin//load信号维持5个clkcnt_bit <= cnt_bit + 1;load <= 1;endelse begincnt_bit <= 0;load <= 0;fsm <= S2_SHIFT;endendS2_SHIFT: begin
//              if(cnt_bit != 56) begin    //Spartan-6if(cnt_bit != 57) begin //Artix-7cnt_bit <= cnt_bit + 1;shift <= 1;endelse beginshift <= 0;fsm <= S3_FINSIH;cnt_bit <= 0;dna <= dna_buf;endendS3_FINSIH: begincnt_bit <= 0;dna <= dna;dna_vld <= 1;fsm <= S3_FINSIH;endendcaseend
end//dout在上升沿变化,在下降沿采样
always @ (negedge clk) beginif(!rst_n) dna_buf <= 'h0;else if(fsm == S2_SHIFT) dna_buf <= dna_buf << 1 | dout;else dna_buf <= 'h0;
endDNA_PORT #(.SIM_DNA_VALUE(57'h123456789ABCDEF)  // Specifies the Pre-programmed factory ID value
)get_xc6slx9_dna(//Inputs.CLK(clk),     // 1-bit input: Clock input.DIN(1'b0),    // 1-bit input: User data input pin.READ(load),   // 1-bit input: Active high load DNA, active low read input.SHIFT(shift), // 1-bit input: Active high shift enable input//Outputs.DOUT(dout)   // 1-bit output: DNA output data
);endmodule

仿真波形:

实际运行时,逻辑分析仪抓的波形:

和JTAG读取出的一致:

注意

ISE 14.7环境下,使用下载器JTAG方式读取出的Spartan-6芯片的DNA,可能并不准确,我的两块Spartan-6开发板,一块XC6SLX9的开发板,使用下载器读出的是DNA全为1,但是使用原语方式读取出是正确的。

XC6SLX9使用JTAG读取的DNA

XC6SLX9使用原语方式读取的

而另一块XC6SLX16开发板,使用下载器和原语方式读取出的DNA是一致的。

读取Xilinx FPGA芯片的唯一ID号DNA相关推荐

  1. STM32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭

    大家好!我叫肖亚平,从小热爱上了电子技术,读书时阴差阳错的选择了电子这方面的专业,学习电子技术.一直到今年毕业.对于我的理解来说,学校里面学到的技术不是全部实用,但是必须有用,所以一直奋斗在前线.我对 ...

  2. 读取STM32F207/40x的CPU唯一ID(Unique Device ID)号方法

    在网上看到有很多的读取STM32F103系列MCU的CPU ID号,但是拿来在STM32F207上面是读取不到ID号的(按照STM32F103的地址读出来都是0XFFFFFFFF),原因是STM32F ...

  3. 生成唯一id号解决方法

    1 添加一个id自增表t_Next FUserID(用户唯一标示符) FTableName(要唯一id号的表的名称) FNextNo(下一个id号) 2 添加存储过程如下 GO Create proc ...

  4. Xilinx FPGA芯片命名规则

    1.1 Xilinx FPGA芯片命名规则 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Xilinx FPGA芯片命名规则: 5)结束语. 1.1.2 本节引言 &q ...

  5. Xilinx ISE系列教程(8):读取FPGA芯片唯一ID号

    文章目录 @[toc] 应用场景 方法1:通过JTAG读取 方法2:调用原语读取 DNA_PORT原语的使用 注意 本文是Xilinx ISE系列教程的第8篇文章. 用过单片机的朋友都知道,单片机芯片 ...

  6. Xilinx FPGA 芯片命名规则与查询方法

    Xilinx 公司的芯片有一整套命名规则,可以通过相关文档查阅. Xilinx 提供了很多关于 Device 的用户手册,很多会在文档的开始部分对命名规则及其含义进行讲解,如 UG-112:Devic ...

  7. [Xilinx FPGA] #6 Xilinx FPGA 芯片选型

    1.工艺节点 首先不管选择什么厂家的产品,都建议在其主流产品中选择合适的芯片. 以上是目前 Xilinx 主流的也是常用的几个 FPGA 产品系列,这里不谈传说中的后两个系列.Spartan-6 和 ...

  8. 基于XILINX FPGA芯片高速串行接口GTX学习笔记

    前言: 综合全网各路老鸟的优质博客加上一些自己的理解,整理了如下学习笔记:蛮开心入职了自己满意的单位,分享出来,希望大家都有所收获. 吉比特收发器(MGT)是吉比特级串行器/解串器(SERDES)的别 ...

  9. 【STM32+cubemx】0025 HAL库开发:唯一ID获取和简单的程序加密

    1)STM32芯片的唯一ID简介 STM32内部有一个96bit的产品唯一ID,在出厂被固化在芯片中,是不能修改的,而且每个芯片不同,可以作为芯片的身份标识. STM32不同系列的ID起始地址不同,如 ...

  10. Spring Boot 工程集成全局唯一ID生成器 Vesta

    2019独角兽企业重金招聘Python工程师标准>>> 本文内容脑图如下: 文章共 760字,阅读大约需要 2分钟 ! 概 述 在前一篇文章 <Spring Boot工程集成全 ...

最新文章

  1. 通过仿真和综合认识T触发器(Verilog HDL语言描述T触发器)
  2. 机器学习之数学基础(四)~Lasso Regression回归, L1、L2 Regularization正则化, 回归问题中的损失函数
  3. python内置序列类型_Python序列内置类型之元组类型详解
  4. 行健设计_广西大学行健文理学院参加2019年第七届广西大学生工业设计大赛
  5. 网页开发浏览器兼容性问题
  6. pytorch dataset_【小白学PyTorch】16.TF2读取图片的方法
  7. 【微软亚洲研究院院长洪小文专访---谈大学生实习就业】
  8. JS字符转为json对象
  9. 惠普p1106打印机安装步骤_「惠普打印机驱动安装」惠普P1106打印机怎么安装驱动? - seo实验室...
  10. linux u盘 引导修复工具下载,win7+ubuntu双系统引导修复工具boot repair disk 32+64位ISO版...
  11. .NET Core剪裁器背后的技术
  12. 天眼查app协议逆向分析
  13. 超简单!为图片和 PDF 上去掉水印
  14. 科学论文写作工具TEX/LaTEX/CTEX
  15. SKNet:自适应感受野
  16. mysql 事务隔离界别_mysql/mariadb知识点总结(21):事务隔离级别 (事务总结之三)...
  17. 绿色版,便携版,破解版,精简版区别
  18. 巴纳比·杰克和他发现的ATM取款和心脏起搏器漏洞
  19. 键盘起源于那一带计算机,键盘排序的由来竟是因为这个原因……
  20. 关于导出编辑后的PDF文件中目录带框的情况及解决

热门文章

  1. 关于 nth-child(n)的几种写法。
  2. 四线电阻式触摸屏原理
  3. 电阻式触摸屏的基本结构和驱动原理
  4. 联想服务器自动关机_联想电脑老是自动关机怎么回事
  5. php6简介,[PHP框架] ThinkPHP6 介绍、安装及配置
  6. python怎么隐藏输入法_用隐马尔科夫模型 python 实现简单拼音输入法
  7. java根据身份证号码计算年龄的方法(精确到日)
  8. 中大计算机学院不及格,大学要求越来越严格 | 学渣可能无法从中大毕业了
  9. 怎么把PDF文件转换成图片?这两种方法可以收藏下来
  10. 前端实现很哇塞的端扫码功能