读取Xilinx FPGA芯片的唯一ID号DNA
文章目录
- 应用场景
- 方法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相关推荐
- STM32通过读取芯片唯一ID号来实现程序的保护,防止被抄袭
大家好!我叫肖亚平,从小热爱上了电子技术,读书时阴差阳错的选择了电子这方面的专业,学习电子技术.一直到今年毕业.对于我的理解来说,学校里面学到的技术不是全部实用,但是必须有用,所以一直奋斗在前线.我对 ...
- 读取STM32F207/40x的CPU唯一ID(Unique Device ID)号方法
在网上看到有很多的读取STM32F103系列MCU的CPU ID号,但是拿来在STM32F207上面是读取不到ID号的(按照STM32F103的地址读出来都是0XFFFFFFFF),原因是STM32F ...
- 生成唯一id号解决方法
1 添加一个id自增表t_Next FUserID(用户唯一标示符) FTableName(要唯一id号的表的名称) FNextNo(下一个id号) 2 添加存储过程如下 GO Create proc ...
- Xilinx FPGA芯片命名规则
1.1 Xilinx FPGA芯片命名规则 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Xilinx FPGA芯片命名规则: 5)结束语. 1.1.2 本节引言 &q ...
- Xilinx ISE系列教程(8):读取FPGA芯片唯一ID号
文章目录 @[toc] 应用场景 方法1:通过JTAG读取 方法2:调用原语读取 DNA_PORT原语的使用 注意 本文是Xilinx ISE系列教程的第8篇文章. 用过单片机的朋友都知道,单片机芯片 ...
- Xilinx FPGA 芯片命名规则与查询方法
Xilinx 公司的芯片有一整套命名规则,可以通过相关文档查阅. Xilinx 提供了很多关于 Device 的用户手册,很多会在文档的开始部分对命名规则及其含义进行讲解,如 UG-112:Devic ...
- [Xilinx FPGA] #6 Xilinx FPGA 芯片选型
1.工艺节点 首先不管选择什么厂家的产品,都建议在其主流产品中选择合适的芯片. 以上是目前 Xilinx 主流的也是常用的几个 FPGA 产品系列,这里不谈传说中的后两个系列.Spartan-6 和 ...
- 基于XILINX FPGA芯片高速串行接口GTX学习笔记
前言: 综合全网各路老鸟的优质博客加上一些自己的理解,整理了如下学习笔记:蛮开心入职了自己满意的单位,分享出来,希望大家都有所收获. 吉比特收发器(MGT)是吉比特级串行器/解串器(SERDES)的别 ...
- 【STM32+cubemx】0025 HAL库开发:唯一ID获取和简单的程序加密
1)STM32芯片的唯一ID简介 STM32内部有一个96bit的产品唯一ID,在出厂被固化在芯片中,是不能修改的,而且每个芯片不同,可以作为芯片的身份标识. STM32不同系列的ID起始地址不同,如 ...
- Spring Boot 工程集成全局唯一ID生成器 Vesta
2019独角兽企业重金招聘Python工程师标准>>> 本文内容脑图如下: 文章共 760字,阅读大约需要 2分钟 ! 概 述 在前一篇文章 <Spring Boot工程集成全 ...
最新文章
- 通过仿真和综合认识T触发器(Verilog HDL语言描述T触发器)
- 机器学习之数学基础(四)~Lasso Regression回归, L1、L2 Regularization正则化, 回归问题中的损失函数
- python内置序列类型_Python序列内置类型之元组类型详解
- 行健设计_广西大学行健文理学院参加2019年第七届广西大学生工业设计大赛
- 网页开发浏览器兼容性问题
- pytorch dataset_【小白学PyTorch】16.TF2读取图片的方法
- 【微软亚洲研究院院长洪小文专访---谈大学生实习就业】
- JS字符转为json对象
- 惠普p1106打印机安装步骤_「惠普打印机驱动安装」惠普P1106打印机怎么安装驱动? - seo实验室...
- linux u盘 引导修复工具下载,win7+ubuntu双系统引导修复工具boot repair disk 32+64位ISO版...
- .NET Core剪裁器背后的技术
- 天眼查app协议逆向分析
- 超简单!为图片和 PDF 上去掉水印
- 科学论文写作工具TEX/LaTEX/CTEX
- SKNet:自适应感受野
- mysql 事务隔离界别_mysql/mariadb知识点总结(21):事务隔离级别 (事务总结之三)...
- 绿色版,便携版,破解版,精简版区别
- 巴纳比·杰克和他发现的ATM取款和心脏起搏器漏洞
- 键盘起源于那一带计算机,键盘排序的由来竟是因为这个原因……
- 关于导出编辑后的PDF文件中目录带框的情况及解决
热门文章
- 关于 nth-child(n)的几种写法。
- 四线电阻式触摸屏原理
- 电阻式触摸屏的基本结构和驱动原理
- 联想服务器自动关机_联想电脑老是自动关机怎么回事
- php6简介,[PHP框架] ThinkPHP6 介绍、安装及配置
- python怎么隐藏输入法_用隐马尔科夫模型 python 实现简单拼音输入法
- java根据身份证号码计算年龄的方法(精确到日)
- 中大计算机学院不及格,大学要求越来越严格 | 学渣可能无法从中大毕业了
- 怎么把PDF文件转换成图片?这两种方法可以收藏下来
- 前端实现很哇塞的端扫码功能