摘要
相信对于大家FPGA保密这块,都很头疼,特别是我们这种小工作室,更对于保密这块,忧心冲冲,相信谁也不敢想让自己辛辛苦苦调试的项目,在量产之后,被大厂摘桃子,付费买断就算是比较讲究了,有很多直接勾结PCB制造商,贴片商,直接复刻咱们的PCB,一点脾气也没有。
在这种情况下,保密措施就很重要了,小公司有小公司的好处,对于量不大的产品,读取设备编号,那就是最好的解决办法。
设备DNA
Xilinx 每一个 FPGA 都有一个独特的 ID,也就是 DNA Port,这个 ID 相当于我们的身份证,在 FPGA 芯片生产的时候就已经写死在芯片的 eFuse 寄存器中,具有不可修改的属性当前SPARTAN6的设备编号是57Bits的二进制数据。
获取DNA的方法有两种,1、使用JTAG读取;2通过原语读取。
JTAG读取DNA
打开ISE14.7软件IMPACT->查找设备->READ DNA命令,如图
通过源语读取DNA
DNA_PORT #(
.SIM_DNA_VALUE(57'h000000000000000) // Specifies the Pre-programmed factory ID value
)
DNA_PORT_inst (
.DOUT(DOUT), // 1-bit output: DNA output data
.CLK(CLK), // 1-bit input: Clock input
.DIN(DIN), // 1-bit input: User data input pin
.READ(READ), // 1-bit input: Active high load DNA, active low read input
.SHIFT(SHIFT) // 1-bit input: Active high shift enable input
);
功能有说明,值得注意的是,DIN没什么用,不用管他
应用&仿真
module SP6_DNA_CHECK #
(
parameter P_DEV_DNA = 57'h135DCD0A8CE26E7
)
(
input I_SYSTEM_CLK ,
input I_SYSTEM_RSTN ,
output O_SYSTEM_FIFISH
);
reg [6:0] r_dna_rcnt ;
reg r_dna_read ;
reg r_dna_shift ;
reg [56:0] r_local_dna ;
wire w_local_dat ;
always @(posedge I_SYSTEM_CLK)
if(~I_SYSTEM_RSTN)
r_dna_rcnt <= 7'b0 ;
else if(r_dna_rcnt == 7'h7f)
r_dna_rcnt <= r_dna_rcnt ;
else
r_dna_rcnt <= r_dna_rcnt + 1'b1 ;
always @(posedge I_SYSTEM_CLK)
begin
r_dna_read <= (r_dna_rcnt == 7'd10) ? 1'b1 : 1'b0 ;
r_dna_shift <= (r_dna_rcnt >= 7'd20 && r_dna_rcnt < 7'd77) ? 1'b1 : 1'b0 ;
end
always @(posedge I_SYSTEM_CLK)
if(~I_SYSTEM_RSTN)
r_local_dna <= 57'b0 ;
else if(r_dna_rcnt < 78)
r_local_dna <= {r_local_dna[55:0],w_local_dat} ;
else
r_local_dna <= r_local_dna ;
DNA_PORT #
(
.SIM_DNA_VALUE(57'h135DCD0A8CE26E7) // Specifies the Pre-programmed factory ID value
)
DNA_PORT_inst
(
.DOUT(w_local_dat), // 1-bit output: DNA output data
.CLK(I_SYSTEM_CLK), // 1-bit input: Clock input
.DIN(1'b0), // 1-bit input: User data input pin
.READ(r_dna_read), // 1-bit input: Active high load DNA, active low read input
.SHIFT(r_dna_shift) // 1-bit input: Active high shift enable input
);
assign O_SYSTEM_FIFISH = (r_local_dna == P_DEV_DNA)? 1'b1 : 1'b0 ;
endmodule
功能很简单,就是开机之后对比一下DNA,一致则继续执行,不一致非法状态
总结:
虽然很麻烦,在每次写入前都要重复读取设备DNA然后写入到设备程序里面,再编译,下载。增加了工作了,但是保护了我们的知识产权,其中取舍还得看个人喜好以及实际使用情况,至于其他方法,也欢迎大家讨论。