您的位置 首页 培训

获取Xilinx FPGA的DNA的两个办法

获取Xilinx FPGA的DNA的两个方法-Xilinx每一个FPGA都有一个独特的ID,也就是Device DNA,这个ID相当于我们的身份证,在FPGA芯片生产的时候就已经写死在芯片的eFuse寄存器中,具有不可修改的属性,因为使用的是熔断技术。

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找到。

获取Xilinx FPGA的DNA的两个办法

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

获取Xilinx FPGA的DNA的两个办法

获取Xilinx FPGA的DNA的两个办法

关于用户来说,调用这个源语,咱们只需要依照操作移位寄存器的流程操作就好了,咱们意图是读出源语里边的移位寄存器的值,所以咱们规划的思路应该是首要拉高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数值传输流程。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/338456.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部