|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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 |
|