FPGA半导体芯片-xilinx每一片芯片内部的DNA
你的位置:FPGA半导体芯片 > 芯片产品 > xilinx每一片芯片内部的DNA
xilinx每一片芯片内部的DNA
发布日期:2024-02-11 10:43     点击次数:128

每个芯片内部都有一个设备标识符。Xilinx称之为DNA。这个DNA是不可改变的,永远存在于芯片中。根据文件,DNA在一个系列中最多有32个芯片。以下是Xilinx的简要介绍 FPGA的DNA,以及如何读取。

XilinxFPGA芯片,在7系列和7系列之前,DNA是57Bit的数据,而在7系列之后,如Ultraslace等新型号,DNA是96Bit。这里有两种阅读方法。

1.通过jtag阅读

以vivado为例,连接下载器后,打开hardware manager,芯片上电连接到芯片后,在hardware上 device REGISTER在properties选项框中找到-EFUSE-DNA_PORT,芯片DNA的值如下图所示:    

2.通过调用原语读取

我们可以使用代码读取芯片的DNA。以vivado为例,首先根据我们选择的芯片型号找到相应的DNA_PORT原语。如下图所示,

7系列DNA_PORT原语:    

Ultrascale系列原语,原语名称有一点变化,请注意

以7系列为例,查看UG470文档,使用原语:    

例化原语

   DNA_PORT #(

      .SIM_DNA_VALUE(57’h123456789abcdef  // Specifies a sample 57-bit DNA value for simulation

   )

   DNA_PORT_inst (

      .DOUT(dna_dout),   // 1-bit output: DNA output data.

      .CLK(sys_clk),     // 1-bit input: Clock input.

      .DIN(1’b0),     // 1-bit input: User data input pin.

      .READ(dna_read),   // 1-bit input: Active high load DNA, active low read input.

      .SHIFT(dna_shift)  // 1-bit input: Active high shift enable input.

   );

读取代码如下:

首先拉高read信号,寄存器加载DNA值,加载后降低read信号,然后使shift信号,DOUT开始输出DNA数据,移位57小时后取消shift功能。

module DNA_capture(

    input               i_sys_clk,//时钟,时钟不要太高   

    input               i_dna_rdy,//读取使能信号

    output  [56:0]      o_dna_data,//输出DNA值

    output              o_dna_valid//输出有效的DNA标志输出有效的DNA标志

);    

    wire                dna_dout;

    wire                dna_read;

    wire                dna_shift;

    reg     [56:0]      dna_reg = 0;

    reg     [7:0]       dna_cnt = 0;

   DNA_PORT #(

      .SIM_DNA_VALUE(57’h123456789abcdef  // Specifies a sample 57-bit DNA value for simulation

   )

   DNA_PORT_inst (

      .DOUT(dna_dout),   // 1-bit output: DNA output data.

      .CLK(i_sys_clk),     // 1-bit input: Clock input.

      .DIN(1’b0),     // 1-bit input: User data input pin.

      .READ(dna_read),   // 1-bit input: Active high load DNA, active low read input.

      .SHIFT(dna_shift)  // 1-bit input: Active high shift enable input.

   );

    always@(posedge i_sys_clk)

    if(i_dna_rdy)begin

        if(dna_cnt == 7’d103)

            dna_cnt <= dna_cnt;

        else 

            dna_cnt <= dna_cnt 1’b1;

    end

    assign dna_read = dna_cnt == 8’d20;    

    //

    assign dna_shift = (dna_cnt >= 8’d45) && (dna_cnt <= (8’d45 8’d57-1));

    always @ (posedge i_sys_clk)

    begin

        if(dna_shift)begin

        dna_reg[56:0] <= {dna_reg[55:0],dna_dout};

        end

    end

    assign o_dna_data= dna_reg;

    assign o_dna_valid = dna_cnt == (8’d45 8’d57-1);

endmodule