在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4720|回复: 1

[原创] Xilinx DAN加密

[复制链接]
发表于 2011-12-19 15:01:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
// Dependencies: 该代码主要是验证DNA读取,然后再按钮1有效的情况下,写入到AN系列的ISFlash中,
//               然后再读出,和读取的DNA进行比较,如果比较相同,点亮一个LED,实验平台为AN starter。
//               目标器件为700AN,使用了预定义,客户可以根据自己的保密需要重新设置地址,并且可以
//               对DNA的值进行加密,在写入到ISF中。(客户需要确保DNA存放的位置不会被新的代码覆盖)
//               主要针对大规模生产的加密,分为两套代码,生产两个bit流,第一套代码主要是读取DNA,进行一定
//               操作后,写入到ISF中;该bit流只在生产期间使用,会被第二套代码覆盖,但是写入到ISF的值不会被覆盖;
//               第二套代码是供货的代码,首先确保选择的位置不被第二套代码覆盖,第二套代码首先读取DNA,然后从特定的
//               位置读取ISF中的DNA,如果相同,就可以工作,如果不同就不工作。
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//

module dnaChecker(
    input      sysClkIn,
    input      pulseIn0,
    input      pulseIn1,
    output reg dnaIsValid=0,
    output     ledOut
    );         
   
    //设定存放DNA的ISF的地址,确保该地址大于bit流的大小,避免被烧写的bit流覆盖
    `define 700AN  
   
    `ifdef 700AN
     parameter DNA_ADDR = 24'h1cfe00 ;
    `elsif 200AN
        parameter DNA_ADDR = 24'h0bfe00 ;
    `elsif 400AN
     parameter DNA_ADDR = 24'h09fe00 ;
    `endif
   
    reg         flashWrEn=0;
    reg         flashRdEn=0;
    wire [55:0] flashRdData;
    wire        flashRdValid;
   
    wire        spiClk;
    wire        spiCs_n;
    wire        spiMosi;
    wire        spiMiso;
   
    reg  [7 :0] cnt8bits=0;
wire        dnaOfDevice;
    reg         dnaReadEn=0;
    reg  [56:0] dnaOfDeviceR0=0;
    reg         dnaShift=0;
    reg         dnaShiftR0=0;
   
    wire        pulseOut0,pulseOut1;
    reg         pulseR00=0,pulseR01=0;
    reg         pulseR10=0,pulseR11=0;
   
    wire        sysClk,CLKIN_IBUFG_OUT,CLK0_OUT,sysDcmLock;
   
    //chipscope debug interface and module
    wire  [35:0] iconControl0;
    reg   [63:0] monitorData=0;
   
    iconModule iconModule (
     .CONTROL0(iconControl0) // INOUT BUS [35:0]
     );
     
    ilaModule ilaModule (
     .CONTROL(iconControl0), // INOUT BUS [35:0]
     .CLK(sysClk), // IN
     .TRIG0(monitorData) // IN BUS [31:0]
    );
   
    always@(posedge sysClk)
    begin      
     //monitorData <= {dnaIsValid,flashRdEn,flashWrEn,dnaReadEn,pulseR11,pulseR01,cnt8bits,dnaOfDeviceR0} ; //first check the DNAs from logic and manual are same
     monitorData <= {dnaIsValid,flashRdEn,flashWrEn,dnaReadEn,pulseR11,pulseR01,
                     spiClk,spiCs_n,spiMosi,spiMiso,cnt8bits,flashRdData[22:0],dnaOfDeviceR0[22:0]} ;
    end
   
    sysDcm sysDcm(
    .CLKIN_IN(sysClkIn),
    .RST_IN(1'b0),
    .CLKIN_IBUFG_OUT(CLKIN_IBUFG_OUT),
    .CLK0_OUT(CLK0_OUT),
    .CLK2X_OUT(sysClk),
    .LOCKED_OUT(sysDcmLock)
    );
    //led slip for one second
    oneScnd oneScnd(
                   .sysClk(sysClk),   
                   .ledOut(ledOut)
                   );
   
    //delet dither of button for ISE write
    deletDither deletDither0(
                   .sysClk(sysClk),
                   .sysRst_n(sysDcmLock),
                   .pulseIn(pulseIn0),
                   .pulseOut(pulseOut0)
                   );
                  
    always@(posedge sysClk)
    begin
     pulseR00 <= pulseOut0 ;
     pulseR01 <= pulseR00  ;
    end
   
    always@(posedge sysClk)
    begin
     if((pulseR00==0)&&(pulseR01==1))
      flashWrEn <= 1 ;
     else
      flashWrEn <= 0 ;
    end
    //delet dither of button for ISE read  
    deletDither deletDither1(
                   .sysClk(sysClk),
                   .sysRst_n(sysDcmLock),
                   .pulseIn(pulseIn1),
                   .pulseOut(pulseOut1)
                   );
                  
    always@(posedge sysClk)
    begin
     pulseR10 <= pulseOut1 ;
     pulseR11 <= pulseR10  ;
    end
   
    always@(posedge sysClk)
    begin
     if((pulseR10==0)&&(pulseR11==1))
      flashRdEn <= 1 ;
     else
      flashRdEn <= 0 ;
    end
   
    //first read DNA, this counter is for dna read phase control
    always@(posedge sysClk)
    begin
      if(sysDcmLock==0)
        cnt8bits <= 0 ;
      else if(cnt8bits==255)
          cnt8bits <= 255 ;
      else
        cnt8bits <= cnt8bits + 1 ;
    end
    //first issue a DNA readEn
    always@(posedge sysClk)
    begin
     if(cnt8bits==99)
      dnaReadEn <= 1 ;
     else
      dnaReadEn <= 0 ;
    end
    //enable shift DNA out after issue dna read en, it should be valid 57 clock becuase DNA value is 57 bits
    always@(posedge sysClk)
    begin
     if((cnt8bits>98)&&(cnt8bits<156))
      dnaShift <= 1 ;
     else
      dnaShift <= 0 ;
    end
   
    always@(posedge sysClk)
    begin
     dnaShiftR0 <= dnaShift ;
    end
    //DNA_PORT
    DNA_PORT DNA_PORT1(
      .DIN(1'b0),
      .READ(dnaReadEn),
      .SHIFT(dnaShift),
      .CLK(sysClk),
      .DOUT(dnaOfDevice)
      );
   
    //storage the DNA value
    always@(posedge sysClk)
    begin
     if(dnaShiftR0==1)
      dnaOfDeviceR0 <= {dnaOfDeviceR0[55:0],dnaOfDevice} ;
    end
   
    //isf spi master control
    flashSpi flashSpi(
                     .sysClk(sysClk),
                     .sysRst(1'b0),                                             
                     .flashWrEn(flashWrEn),    //0x82 write to flash arry include the relative block be erased
                     .flashRdEn(flashRdEn),    //0x03 read from flash arry
                     .flashAddr(DNA_ADDR),               
                     .flashData(dnaOfDeviceR0[55:0]),                 
                     .flashRdData(flashRdData),   
                     .flashRdValid(flashRdValid),
                     .flashSpiCnvOut_n(spiCs_n),
                     .flashSpiTck(spiClk),
                     .flashSpiDout(spiMosi),
                     .flashSpiInput(spiMiso)
                      );
    //ISF MODULE                  
SPI_ACCESS spiFlash
           (
           .MISO(spiMiso),
           .MOSI(spiMosi),
           .CSB(spiCs_n),
           .CLK(spiClk)
           );
    //compare the DNA from DNA_PORT and ISF_PORT, if same, valid is assert and connected to a LED.
    always@(posedge sysClk)
begin
  if(flashRdValid==1)
  begin
   if(flashRdData==dnaOfDeviceR0[55:0])
    dnaIsValid <= 1 ;
         else
          dnaIsValid <= 0 ;
  end
end
endmodule
发表于 2016-12-29 11:52:34 | 显示全部楼层
楼主,好东西!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-3-28 22:13 , Processed in 0.032459 second(s), 11 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表