Xilinx FPGA的Device DNA获取方法
第一部分 概述
(转载至https://blog.csdn.net/ladywn/article/details/84393123)
Xilinx每一个FPGA都有一个独特的ID,也就是Device DNA,这个ID相当于我们的身份证,在FPGA芯片生产的时候就已经写死在芯片的eFuse寄存器中,具有不可修改的属性,因为使用的是熔断技术。值得说明的是,在7系列及以前,这个ID都是57bit的,但是在Xilinx的Ultraslace架构下是96bit。
FPGA的DNA我们一般的使用场景是用于用户逻辑加密。一般来说,用户在逻辑上可以通过特定的接口把这个Device DNA读取出来,经过一系列加密算法之后和预先在外部Flash存储的一串加密后的字节串做比较,这个flash存储的加密后的字节串也是由该DNA经过加密后得到,fpga加载程序后可以先从flash读出该段字节做比较,如果相同,则让FPGA启动相应的逻辑,如不同,则代表该FPGA没有经过用户授权,用户逻辑上可以关闭FPGA的逻辑功能甚至可以通过一些手段让硬件损坏。
如何获取FPGA的Device DNA呢,下面我从JTAG和调用源语两个方法说明,并开放核心代码供大家参考。
第一种,通过JTAG获取,这种方法在ISE的Impact或者vivado都可以实现,下面介绍在Vivado下如何或者Device DNA,这个其实很简单,首先板卡通过JTAG连接PC,在Flow Navigator -> PROGRAM AND DEBUG 界面下,点击对应的FPGA的芯片,点击Hardware Device Properties,在search中搜索dna,在REGISTER下可以找到Device DNA,在Impact下如何获取DNA网上有相应的文章,这里就不做进一步介绍。
第二种,用户逻辑通过调用源语获取,至于源语是什么,这里跟大家分享一个技巧,一般我们使用源语的时候,往往记不住大量的源语定义,那么如何快速搜索到我们想要的源语呢,在Vivado中,有一个功能是Language Templates,在Flow Navigator可以找到,里面包含了基本所有的Xilinx提供的源语和一些语法用法,以DNA读取为例,我们搜索DNA,就可以找到关于DNA的源语,由于博主用的是VU9P的片子,所以用的是DNA_PORTE2这个源语,针对7系列及以前,使用的是DNA_PORT源语,这两个源语都可以在Language Templates找到。
接下来说一下这个源语和源语相关的使用方法,这个源语本质上就是读取FUSE寄存器表里面的FUSE_DNA寄存器,里面还包含了一个移位寄存器,源语中的接口本质上都是操作移位寄存器,这个移位寄存器的长度和器件类型有关,是56或者96bit。源语里面的READ信号,是用于把DNA的值装载到移位寄存器里面,DIN是移位寄存器的输入,DOUT是移位寄存器的输出,SHIFT是移位寄存器的移位使能,CLK是移位寄存器的操作时钟,官方提供的源语模型和时序图如下,
对于用户来说,调用这个源语,我们只需要按照操作移位寄存器的流程操作就好了,我们目的是读出源语里面的移位寄存器的值,所以我们设计的思路应该是首先拉高READ先让移位寄存器装载DNA的值,然后在时钟上升沿使能SHIFT,这样子就能让移位寄存器里面的值移位出来,下面是核心代码:
- module dna_read(
- input sys_clk,
- input dna_read_rdy,
- output [95:0] dna_read_dat,
- output dna_read_vld);
- wire dna_dout;
- wire dna_read;
- wire dna_shift;
- DNA_PORTE2 #(
- .SIM_DNA_VALUE (96'd0)
- )DNA_PORTE2_inst(
- .DOUT (dna_dout),
- .CLK (sys_clk),
- .DIN (dna_dout),
- .READ (dna_read),
- .SHIFT (dna_shift)
- );
- reg [95:0] dna_reg = 0;
- reg [7:0] dna_cnt = 0;
- always @ (posedge sys_clk)
- begin
- if(dna_read_rdy) begin
- dna_cnt <= dna_cnt + 1;
- end
- else begin
- dna_cnt <= 0;
- end
- end
- // load dna data from the fuse dna register
- assign dna_read = dna_cnt == 8'd63;
- // for ultrascale
- assign dna_shift = (dna_cnt >= 8'd100) && (dna_cnt <= 195);
- always @ (posedge sys_clk)
- begin
- dna_reg <= {dna_dout,dna_reg[95:1]};
- end
- assign dna_read_dat = dna_reg;
- assign dna_read_vld = dna_cnt == 8'd196;
- endmodule
第二部分 仿真及测试
参考上述博客内容,本人在Vivado2017.4以及Zynq板子(Zynq型号为7Z015,Device DNA为57bit)上分别进行了仿真测试和上板实测。
2.1测试代码
// An highlighted block
`timescale 1ns / 1ps
module dna_test(input CLK,input DIN,output [56:0] DNA_DOUT);wire SHIFT;wire READ;wire DOUT;reg [6:0] dna_cnt = 7'd0;reg [56:0] dna_reg = 57'd0;always@(posedge CLK)if(dna_cnt == 7'd103)dna_cnt <= dna_cnt;else dna_cnt <= dna_cnt + 1'b1;assign SHIFT = (dna_cnt>= 7'd45) && (dna_cnt <= 7'd101);assign READ = (dna_cnt == 7'd20);always@(posedge CLK)if(SHIFT)dna_reg[101-dna_cnt] <= DOUT;elsedna_reg <= dna_reg;assign DNA_DOUT = (dna_cnt==7'd102) ? dna_reg : 57'd0;DNA_PORT #(.SIM_DNA_VALUE(57'h155550000005555) // Specifies a sample 57-bit DNA value for simulation)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.); endmodule
2.2仿真结果
在上述代码基础上,添加激励文件,并设置SIM_DNA_VALUE = 57'h155550000005555,测试结果如下图所示:
据图可知,激励文件的时序操作如下:首先拉高READ,让移位寄存器装载DNA的值,延时一段时间(注意若不延时会导致DNA首位出问题,无法正常读出),然后在时钟上升沿使能SHIFT,移位寄存器的值由MSB>>LSB依次移出。 DNA仿真结果表明:DOUT输出与设定的DNA值一致:
2.3上板测试结果
在7z015板卡上,运行该程序,并添加ILA观察分析运行结果,程序读出的DNA为008958a31e9085c,与JTAG读出的DNA_PORT = 008958A31E9085C一致。
Xilinx FPGA的Device DNA获取方法相关推荐
- Xilinx FPGA单端时钟设计方法
1.1 Xilinx FPGA单端时钟设计方法 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4)Xilinx FPGA单端时钟设计方法: 5)结束语. 1.1.2 本节引 ...
- Appium真机运行Device Name获取方法
转自https://blog.csdn.net/maryshine/article/details/52248389 开始接触Appium的时候,看网上的经验帖子一般都是用模拟器运行,但是模拟器运行的 ...
- Xilinx FPGA的程序加密方法
更多精彩内容,请微信搜索"FPGAer俱乐部"关注我们. Xilinx所有的FPGA器件都有Device DNA,这是一个57bit的二进制序列,在器件生产的时候烧死到芯片里 ...
- Xilinx FPGA PLL输出不能直接连接IO解决方法
1.1 Xilinx FPGA PLL输出不能直接连接IO解决方法 1.1.1 本节目录 1)本节目录: 2)本节引言: 3)FPGA简介: 4) Xilinx FPGA PLL输出不能直接连接IO解 ...
- Xilinx FPGA的配置
http://blog.sina.com.cn/s/blog_98d98c7f0102v4ex.html http://www.cnblogs.com/aikimi7/p/3499633.html F ...
- xilinx芯片管脚使用限制_【转载】 Xilinx FPGA配置的一些细节
0 参考资料 (1) Xilinx: Development System Reference Guide. dev.pdf, v10.1 在Xilinx的doc目录下有. (2) Xilinx: V ...
- Xilinx FPGA 将寄存器放入IOB中
xilinx FPGA的资源一般指IOB,CLB,BRAM,DCM,DSP五种资源.其中IOB就是input/output block,完成不同电气特性下对输入输出信号的的驱动和匹配要求. IOB的作 ...
- 四、在Xilinx FPGA上使用Cortex M1 软核——固化Cortex-M1程序
在Xilinx FPGA上使用Cortex M1 软核--固化Cortex-M1程序 本文的硬件(FPGA)工程和软件代码.脚本均参考ARM提供的例程. 本文使用的FPGA工程: https://do ...
- Xilinx FPGA时钟及I/O接口规划(一)
引言:从本文开始,我们介绍Xilinx FPGA时钟及I/O接口规划设计.I/O和时钟规划是定义和分析FPGA和印刷电路板(PCB)之间连接的过程,并将各种互连信号分配给FPGA器件的物理管脚,正确的 ...
- 数据传输完整性_基于IBIS模型的FPGA信号完整性仿真验证方法
人工智能与深度学习等领域的快速发展,使得FPGA等器件应用范围愈加广泛,同时也要求器件的开关速率加快.引脚数量增多.但陡峭的时钟边沿和增加的引脚数使得杂散.耦合.寄生电容电感会对器件产生诸多信号完整性 ...
最新文章
- Gut: 妊娠期糖尿病与孕妇及其新生儿微生物菌群失调有关(赵方庆作品)
- Fedora 33更新异常:Errors during downloading metadata for repository ‘updates‘
- bootstrap 模态 modal 小例子【转】
- 骆驼祥子大事件时间轴_骆驼中的事件处理
- 述职答辩提问环节一般可以问些什么_论文答辩一般会问什么问题?需要注意什么事项?...
- 基于alsa的音量控制代码
- pytorch Resnet
- 华北水利水电大学计算机研究生调剂,2017年华北水利水电大学考研调剂公告
- js中立即执行函数会预编译吗_浅析Vue的生命周期以及JS异步
- 【机器学习系列】变分推断第二讲:基于Mean Field的变分推断解法
- 迅雷bolt界面引擎
- 前端学习——页面布局
- itunes如何备份手机所有数据
- API 接口应该如何设计?如何保证安全?如何签名?如何防重?
- 一个项目的经验教训:关于打乱和拆分数据
- 视频剪辑没素材?一定要收藏这几个网站。
- MySQL拷贝表结构、表数据总结
- 苹果mac电脑重装系统,以及重装之后没有声音、热键不能使用的解决办法
- 计算机科技英语文章及翻译,计算机专业英语短文翻译.doc
- linux下 postgresql 安装 postgis 拓展