怎样读取Xilinx FPGA芯片的设备标识符---DNA

作者: tongcheng123,文章来源:FPGA视频图像处理微信公众号

每一片芯片内部存有一个设备标识符,xilinx把它叫做DNA,这个DNA是不可更改的,永久存在芯片里面的。根据文档介绍,一个系列最多有32块芯片的DNA一样。下面简单介绍一下xilinx FPGA的DNA,及怎么读取出来。

Xilinx的FPGA芯片,在7系列和7系列之前的产品,DNA是一个57Bit的数据,而在7系列之后,如Ultraslace等新型号,DNA是96Bit。下面介绍两种读取方式。

1.通过jtag方式读取

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

2.通过调用原语读取

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

7系列的DNA_PORT原语:

Ultrascale系列原语,原语名称有一点点改变,大家注意一下

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

例化原语

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有效标志

);

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

最新文章

最新文章