当前位置:   article > 正文

Xilinx FPGA的Device DNA获取方法_xilinx fpga序列号

xilinx fpga序列号

第一部分 概述

(转载至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找到。

                        dna_0.png

        接下来说一下这个源语和源语相关的使用方法,这个源语本质上就是读取FUSE寄存器表里面的FUSE_DNA寄存器,里面还包含了一个移位寄存器,源语中的接口本质上都是操作移位寄存器,这个移位寄存器的长度和器件类型有关,是56或者96bit。源语里面的READ信号,是用于把DNA的值装载到移位寄存器里面,DIN是移位寄存器的输入,DOUT是移位寄存器的输出,SHIFT是移位寄存器的移位使能,CLK是移位寄存器的操作时钟,官方提供的源语模型和时序图如下,

                                            

                                            

        对于用户来说,调用这个源语,我们只需要按照操作移位寄存器的流程操作就好了,我们目的是读出源语里面的移位寄存器的值,所以我们设计的思路应该是首先拉高READ先让移位寄存器装载DNA的值,然后在时钟上升沿使能SHIFT,这样子就能让移位寄存器里面的值移位出来,下面是核心代码:


 
 
  1. module dna_read(
  2. input sys_clk,
  3. input dna_read_rdy,
  4. output [95:0] dna_read_dat,
  5. output dna_read_vld);
  6. wire dna_dout;
  7. wire dna_read;
  8. wire dna_shift;
  9. DNA_PORTE2 #(
  10. .SIM_DNA_VALUE ( 96'd0)
  11. )DNA_PORTE2_inst(
  12. .DOUT (dna_dout),
  13. .CLK (sys_clk),
  14. .DIN (dna_dout),
  15. .READ (dna_read),
  16. .SHIFT (dna_shift)
  17. );
  18. reg [ 95: 0] dna_reg = 0;
  19. reg [ 7: 0] dna_cnt = 0;
  20. always @ (posedge sys_clk)
  21. begin
  22. if(dna_read_rdy) begin
  23. dna_cnt <= dna_cnt + 1;
  24. end
  25. else begin
  26. dna_cnt <= 0;
  27. end
  28. end
  29. // load dna data from the fuse dna register
  30. assign dna_read = dna_cnt == 8'd63;
  31. // for ultrascale
  32. assign dna_shift = (dna_cnt >= 8'd100) && (dna_cnt <= 195);
  33. always @ (posedge sys_clk)
  34. begin
  35. dna_reg <= {dna_dout,dna_reg[ 95: 1]};
  36. end
  37. assign dna_read_dat = dna_reg;
  38. assign dna_read_vld = dna_cnt == 8'd196;
  39. endmodule
  • 1

第二部分 仿真及测试

        参考上述博客内容,本人在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;
       else
        dna_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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
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一致。

在这里插入图片描述
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/494194
推荐阅读
相关标签
  

闽ICP备14008679号