【JokerのZYNQ7020】DNA_PORT。

news/2024/7/5 21:17:12

软件环境:vivado 2017.4        硬件平台:XC7Z020


说起FPGA端最常用、最直接的加密手段,大概就是利用每个芯片独有的ID号 + 加密算法了,所以今天这篇,就来简单提一下如何获取7系列的每个芯片的DNA号。至于为什么说是7系列,是为了与ultrascale的方法区别开,在ultrascale下,这个码是96 bit的,而在7系列及以前,是57 bit的。

第一种方法是利用JTAG。

 点击左侧的PROGRAM AND DEBUG后,利用JTAG连接板卡,在识别出的PL芯片型号上单击,再在下方点击Properties,属性中找到EFUSE,子项目中比较关心其中两个,一个是DNA_PORT,另一个是FUSE_DNA,接下来说下这两个的关系。

 1.Fuse_DNA 是 7 系列和 Zynq 设备中的 64 位唯一标识符;

2.DNA_PORT 是一个 57 位值,最多可与 32 个设备共享;

3.DNA_PORT [0:56] 与 FUSE_DNA [63:7] 对齐,注意括号里MSB和LSB方向,举例如下。

 接下来说一下怎么读,读取方法是利用DNA_PORT原语,参考手册UG470。

读取过程示意如下。

当READ = 1时,将FUSE 寄存器中的DNA值压入移位寄存器,而后将READ清0将SHIFT置1,DNA的值会依次从DOUT口移出,将DIN的值依次移入,最先从移位寄存器出来的是MSB,需要注意。

上代码。

module DNA_Port_read(
    
    input               sys_clk,
    input 				sys_rst_n
    
    //input dna_read_vio
);   
    wire                dna_read_vio;
	reg     [1:0]       dna_read_en;
	reg     [7:0]       dna_cnt;
	
    wire    [56:0]      dna_data;
    wire                dna_valid;

    reg     [56:0]      dna_reg;
    wire                dna_dout;
    wire                dna_read;
    wire                dna_shift;
    

    vio_0 vio_0_inst (
      .clk(sys_clk),                // input wire clk
      .probe_out0(dna_read_vio)  // output wire [0 : 0] probe_out0
    );
    
   DNA_PORT #(
      .SIM_DNA_VALUE(57'h1234567AABBCCDD)  // 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.
   );

    always@(posedge sys_clk)
    begin
		if(!sys_rst_n)
			dna_read_en <= 2'd0;
		else
			dna_read_en <= {dna_read_en[0:0],dna_read_vio};
    end
   
    reg [7:0] dna_cnt_state;
	always@(posedge sys_clk)
	begin
		if(!sys_rst_n)
		begin
			dna_cnt <= 8'd0;
			dna_cnt_state <= 8'd0;
		end	
		else
		begin
			case(dna_cnt_state)
			8'd0:begin
				if(dna_read_en == 2'b10)
					dna_cnt_state <= 8'd1;
			end
			8'd1:begin
				dna_cnt <= dna_cnt + 1'b1;
				if(dna_cnt == 8'd99)
					dna_cnt_state <= 8'd2;
			end
			8'd2:begin
				dna_cnt <= 8'd0;
				dna_cnt_state <= 8'd0;
			end
			endcase
		end
	end
	
    always @ (posedge sys_clk)
    begin
		if(!sys_rst_n)
		begin
			dna_reg[56:0] <= 57'd0;
		end
		else
		begin
			if(dna_shift)
				dna_reg[56:0] <= {dna_reg[55:0],dna_dout};
		end
    end	
		
    assign dna_read = (dna_cnt == 8'd1) ? 1'b1 : 1'b0;
    assign dna_shift = ((dna_cnt >= 8'd10) && (dna_cnt <= (8'd10 + 8'd57 - 8'd1))) ? 1'b1 : 1'b0;
	
	assign dna_data = dna_reg;
    assign dna_valid = (dna_cnt == 8'd99) ? 1'b1 : 1'b0;
    
    
    ila_0 ila_0
    (
        .clk(sys_clk),
        .probe0(dna_data),
        .probe1(dna_valid),
        .probe2(dna_dout),
        .probe3(dna_read),
        .probe4(dna_shift),
        .probe5(dna_reg),
        .probe6(dna_cnt),
        .probe7(dna_read_en)
    );  
   
endmodule

测试中使用vio来触发DNA_PORT的读取,再read信号置位后等待了10个clk,目的是确保DNA_PORT的值加载进了移位寄存器中(当然,这10个clk只是我测试用,不一定非要10个),而后shift拉高,将移位寄存器输出的MSB依次移位进dna_reg中,确保所有数据移出后,最后将valid拉个脉冲,整个读取过程结束。

上板测试结果如下。


http://www.niftyadmin.cn/n/610553.html

相关文章

C语言数据结构-树和二叉树-树转二叉树-使用队列,编写transfrom函数,将普通树转换成对应的二叉树

树转二叉树 使用队列&#xff0c;编写transfrom函数&#xff0c;将普通树转换成对应的二叉树。二叉树的相关定义如下&#xff1a; typedef int DataType;typedef struct Node{DataType data;struct Node* left;struct Node* right; }BiTNode, *BiTree;普通树节点的定义如下&a…

【JokerのZYNQ7020】FLASH_TEST。

软件环境&#xff1a;vivado 2017.4 硬件平台&#xff1a;XC7Z020 在实际项目中&#xff0c;写好的ZYNQ工程在debug测试完毕之后&#xff0c;固化到FLASH往往是最后一步&#xff0c;然而&#xff0c;在固化的过程中&#xff0c;往往并不都是一次就能成功的&#xff0c;而固化不…

java程序员面试题目看你能回答几个(付答案)

第一&#xff0c;谈谈final&#xff0c; finally&#xff0c; finalize的区别。 ??第二&#xff0c;Anonymous Inner Class &#xff08;匿名内部类&#xff09; 是否可以extends&#xff08;继承&#xff09;其它类&#xff0c;是否可以implements&#xff08;实现&#xff…

【JokerのZYNQ7020】ZED_AD9361。

软件环境&#xff1a;vivado 2019.1 硬件平台&#xff1a;XC7Z020 作为AD/DA标杆&#xff0c;感觉只要参与过一些AD/DA项目&#xff0c;基本避不开用ADI的片子。ADI的手册和资料做的也是&#xff0c;那叫一地道。所以今天就来说一说&#xff0c;如何针对某一款ADI的片子&#x…

【JokerのNote】Ethernet_Interface。

将常用的网络接口总结一下&#xff0c;主要分为MAC与PHY之间的和PHY之前的&#xff0c;我们在说接口时&#xff0c;一定要注意接口所处的位置&#xff0c;MAC与PHY之间的接口大体上常用的有MII/GMII/RGMII/SGMII&#xff0c;PHY之前的常见接口主要分为1000BASE-T/1000BASE-X/10…

【JokerのZYNQ7020】DDS_Compiler。

软件环境&#xff1a;vivado 2019.1 硬件平台&#xff1a;XC7Z020 对于自产生的正余弦数据源最常用的一般有两种办法&#xff0c;一种是通过matlab生成coe存到ram里&#xff0c;使用的时候播出来&#xff0c;另一种就是通过自带的DDS核来产生&#xff0c;今天就来说说DDS_Compi…

【JokerのNote】Ethernet_Frame。

就是之前不是总结了下网络接口吗&#xff0c;这次继续顺着总结下网络帧格式。这里主要参考的是《计算机网络》这本书&#xff0c;书写的非常非常的好&#xff0c;感兴趣的朋友可以细翻一下&#xff0c;我这里只是当笔记做个总结。 在介绍具体以太网帧格式之前&#xff0c;先对…

【JokerのNote】常用字符集与编码方式。

在介绍ASCII、GB2312、UNICODE、UTF-8、UTF-16等等之前&#xff0c;我觉得还是有必要先说下题目&#xff0c;什么是字符集&#xff0c;什么是编码方式。鄙人愚见&#xff0c;字符集就是字符的集合&#xff0c;如ASCII、GB2312、UNICODE等等&#xff0c;而编码方式指的是码值与字…