关于Xilinx-FPGA的DNA的使用场景和读取方法

  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,这样子就能让移位寄存器里面的值移位出来,下面是核心代码:

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
      

        这是一个axis总线的模块,在dna_read_rdy拉高表示外部准备好接收数据,这时候模块读取DNA的值,然后送出去给外部模块,外部模块收到数据和dna_read_vld信号,则拉低dna_read_rdy,完成一次dna数值传输流程。

  • 7
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Xilinx FPGA引脚功能详细介绍.doc是一份关于Xilinx FPGA引脚功能的详细介绍文档。在这份文档中,会详细介绍Xilinx FPGA芯片的引脚功能和用途。 Xilinx FPGA引脚是芯片与外部世界之间的物理连接。文档中将会介绍引脚的分类及其功能。一般来说,Xilinx FPGA引脚可以分为输入引脚、输出引脚和双向引脚。 输入引脚用于接收来自外部设备的数据或信号。例如,它可以接收来自传感器、外部存储器或其他外部模块的数据。文档中会介绍如何配置输入引脚的功能,以及如何使用FPGA内部逻辑处理来处理输入数据。 输出引脚用于向外部设备发送数据或信号。例如,它可以将处理后的数据发送到显示屏、驱动电机或其他外部模块。文档中会介绍如何配置输出引脚的功能,以及如何使用FPGA内部逻辑处理和控制输出信号。 双向引脚可以同时作为输入和输出引脚使用。它可以接收外部设备的数据,并将处理后的数据发送给外部设备。文档中会介绍如何配置双向引脚的功能,以及如何实现数据的双向传输。 此外,文档还会介绍引脚的约束和限制。由于FPGA引脚数量有限,所以在设计中需要遵守一些规则和限制。文档中会介绍如何根据设计要求配置引脚,并确保引脚的正确使用。 总之,这份文档将详细介绍Xilinx FPGA引脚的功能和用途,包括输入引脚、输出引脚和双向引脚,以及引脚的约束和限制。阅读文档可以帮助设计人员更好地理解和使用Xilinx FPGA引脚,从而实现各种应用需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值