如何读取FPGA芯片的序列号ID?

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 如何读取FPGA芯片的序列号ID?

用过单片机的朋友都知道,单片机芯片内部都有一串序列号,比如STM32,称之为Unique device ID,是一个96Bit的只读数据。

640.jpg


和单片机一样,FPGA芯片内部同样也有ID,具有不可修改的属性。以常用的Xilinx和Altera为例,Altera称之为Chip ID,Xilinx FPGA称之为Device DNA。

640.jpg


应用场景

FPGA的DNA我们一般的使用场景是用于用户逻辑加密。


一般来说,用户在逻辑上可以通过特定的接口把这个Device DNA读取出来,经过一系列加密算法之后和预先在外部Flash存储的一串加密后的字节串做比较,这个flash存储的加密后的字节串也是由该DNA经过加密后得到,FPGA加载程序后可以先从flash读出该段字节做比较,如果相同,则让FPGA启动相应的逻辑,如不同,则代表该FPGA没有经过用户授权,用户逻辑上可以关闭FPGA的逻辑功能甚至可以通过一些手段让硬件损坏。

640.jpg


Xilinx的FPGA芯片,在7系列和7系列之前的产品,DNA是一个57Bit的数据,而在7系列之后,如Ultraslace等新型号,DNA是96Bit。如何获取Xilinx FPGA的Device DNA呢,下面我从JTAG和调用源语两个方法说明,并开放核心代码供大家参考。


方法1:通过JTAG读取

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

640.jpg


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

640.jpg


方法2:调用原语读取

通过我们需要在程序读取出芯片的DNA,可以通过调用DNA_PORT原语的方式来读取芯片的DNA。原语的例化模板,可以在ISE或Vivado自带的代码模板中找到:ISE中的代码模板640.jpg


Vivado中的代码模板

640.jpg


Vivado下UltraScale系列的DNA_PORT2原语模板

640.jpg


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
);


操作说明

640.jpg

先拉高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(
    //inputs
    input 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) begin
    if(!rst_n) begin
        cnt_bit <= 0;
        fsm <= S0_IDLE;
        load <= 0;
        shift <= 0;
        dna <= 0;
        dna_vld <= 0;
    end
    else begin
        case (fsm)
            S0_IDLE: begin
                if(cnt_bit != 10)//上电等待10个clk
                    cnt_bit <= cnt_bit + 1;
                else begin
                    cnt_bit <= 0;
                    fsm <= S1_LOAD;
                    load <= 0;
                    shift <= 0;
                    dna <= 0;
                    dna_vld <= 0;
                end
            end
            S1_LOAD:begin
                if(cnt_bit != 5) begin//load信号维持5个clk
                    cnt_bit <= cnt_bit + 1;
                    load <= 1;
                end
                else begin
                    cnt_bit <= 0;
                    load <= 0;
                    fsm <= S2_SHIFT;
                end
            end
            S2_SHIFT: begin
//              if(cnt_bit != 56) begin    //Spartan-6
                if(cnt_bit != 57) begin    //Artix-7
                    cnt_bit <= cnt_bit + 1;
                    shift <= 1;
                end
                else begin
                    shift <= 0;
                    fsm <= S3_FINSIH;
                    cnt_bit <= 0;
                    dna <= dna_buf;
                end
            end
            S3_FINSIH: begin
                cnt_bit <= 0;
                dna <= dna;
                dna_vld <= 1;
                fsm <= S3_FINSIH;
            end
        endcase
    end
end
//dout在上升沿变化,在下降沿采样
always @ (negedge clk) begin
    if(!rst_n) 
        dna_buf <= 'h0;
    else if(fsm == S2_SHIFT) 
        dna_buf <= dna_buf << 1 | dout;
    else 
        dna_buf <= 'h0;
end
DNA_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


仿真波形:

640.jpg


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

640.jpg


和JTAG读取出的一致:

640.jpg


注意

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


XC6SLX9使用JTAG读取的DNA

29ae34ff362ebcbf63a36e8624d389fd.jpg


XC6SLX9使用原语方式读取的

3562e728dd8541b939650835b2e302c5.jpg


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


目录
相关文章
|
机器学习/深度学习 调度 芯片
快速入门数字芯片设计,UCSD ECE111(九)FPGA vs ASIC(一)
快速入门数字芯片设计,UCSD ECE111(九)FPGA vs ASIC
114 0
|
7月前
|
存储 芯片 异构计算
【FPGA原型验证】FPGA 技术:芯片和工具-当今的 FPGA 器件技术_fpga原型版本
【FPGA原型验证】FPGA 技术:芯片和工具-当今的 FPGA 器件技术_fpga原型版本
196 0
|
存储 前端开发 芯片
快速入门数字芯片设计,UCSD ECE111(九)FPGA vs ASIC(三)
快速入门数字芯片设计,UCSD ECE111(九)FPGA vs ASIC(三)
124 0
|
芯片 C++ 异构计算
快速入门数字芯片设计,UCSD ECE111(九)FPGA vs ASIC(二)
快速入门数字芯片设计,UCSD ECE111(九)FPGA vs ASIC(二)
88 0
|
存储 前端开发 Linux
(上)【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|
【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|
(上)【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|
|
人工智能 算法 安全
(下)【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|
【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|
(下)【数字IC精品文章收录】近500篇文章|学习路线|基础知识|接口|总线|脚本语言|芯片求职|安全|EDA|工具|低功耗设计|Verilog|低功耗|STA|设计|验证|FPGA|架构|AMBA|书籍|
|
开发工具 芯片 异构计算
芯片设计:FPGA开发学习
芯片设计:FPGA开发学习
261 0
芯片设计:FPGA开发学习
|
存储 芯片 异构计算
Xilinx FPGA SPI配置芯片都支持哪些型号
Xilinx FPGA SPI配置芯片都支持哪些型号
577 0
Xilinx FPGA SPI配置芯片都支持哪些型号
|
芯片 异构计算
FPGA-xilinx系列芯片的复位,你真的明白吗?(二)
FPGA-xilinx系列芯片的复位,你真的明白吗?
526 0
FPGA-xilinx系列芯片的复位,你真的明白吗?(二)
|
存储 芯片 异构计算
FPGA-xilinx系列芯片的复位,你真的明白吗?(一)
FPGA-xilinx系列芯片的复位,你真的明白吗?
625 0
FPGA-xilinx系列芯片的复位,你真的明白吗?(一)