PotatoPie 2.1/3.0 教程(6) —— 实验5 FPGA内部DNA码读取例程-Anlogic-安路社区-FPGA CPLD-ChipDebug

PotatoPie 2.1/3.0 教程(6) —— 实验5 FPGA内部DNA码读取例程

为了更好地保护用户代码的安全,PotatoPie 板上的EF2芯片均具有唯一的 DNA 序列,可以使用该序列对用户设计进行保护。 每块芯片在生产过程中会提供一个唯一的 64 位 DNA 数据,这个数据不能被修改和擦除,
用户可以通过
TD 软件提供的 IP 接口,读出 DNA 数据,该模块会自动移出 64 bit 的 DNA 数值

1. 实验说明

1.1 管脚说明

该例程不需要绑定管脚,只需通过ChipWatch工具进行信号抓取即可。

set_pin_assignment	{ dna }	{ LOCATION = virtualIO; }
set_pin_assignment	{ led }	{ LOCATION = virtualIO; }
set_pin_assignment	{ pll_lock }	{ LOCATION = virtualIO; }

dna是输出的DNA数据高低32位进与之后的结果,目的是产生一个输出避免优化,其它两个分别是LED和PLL锁定信号用于调试。

从ADC文件可以看到所有的管脚都约束为了virtualIO,一方面是不需要连接到外部管脚只需Chipwatch查看,另一方面是避免信号被优化掉。

1.2实验现象

本例程添加了串转并模块与 DNA 读取模块, DNA 码读取例程通过产生脉冲信号对 DNA 模块的移位操
作进行触发,并将
64 位 DNA 序列送入串转并模块中进行转换,从而输出 64 位 DNA 序列。 具体现象可以将 DNA 读取例程加载到开发板上进行查看。

DEMO 板实际 DNA 码读取

编译下载 FPGA 的位流文件,通过选取 ChipWatcher 工具进行输出信号与数据的抓取,检测开发板
DNA 码的具体数值。具体选择查看波形工具方式为在 TD 工具栏内找到 Tools,选择 Debug Tools,然后在
打开的窗口栏内选择
ChipWatcher。通过 ChipWatcher 实际抓到的信号如下图所示。

20231220214320784-image

通过 ChipWatcher 实际抓到的 DNA 数据和 MINI DEMO 板 DNA 码相同。

2.实验原理

调用DNA原语进行DNA的读取

3.源码分析

代码的核心是这个EF2_LOGIC_DNA原语。

EF2_LOGIC_DNA   /*#( .DNA(64'hFFFF_0000_0000_0000) )*/
	          U (
	           //Inputs
	           .clk     ( clk_12p5 ), 
	           .din     ( cnt[0]   ), 
	           .shift_en( shift_en ), 
	           //Outpus       
	           .dout    ( dna_dout )
	           );
  • clk是需要的时钟
  • din是输入移位脉冲
  • shift_en是移位使能
  • dna_dout是串行输出的DNA数据

cnt_rst:

下面的代码首先进行复位处理,计数到cnt_rst[7]为高释放复位

reg [7:0] cnt_rst;
always @(posedge clk_osc) if (!cnt_rst[7]) cnt_rst <= cnt_rst + 1'b1;

assign led = cnt_rst[7];

cnt:

接下来的代码用于产生移位脉冲。

always @(posedge clk_12p5 or negedge pll_lock)
begin
	if(!pll_lock)
		cnt <= 0;
	else if(cnt == 7'd66)
		cnt <= cnt;
	else 
		cnt <= cnt + 1;
end

shift_en、shift_en_data:

shift_en表示移位有效从cnt为1~64有效,而shift_en_data则从cnt为1~65有效,DNA数据为64,因为数据比移位脉冲晚一拍,所以shift_en_data持续到65.

always @(posedge clk_12p5)
begin
	shift_en <= ((cnt >= 7'd1) && (cnt <= 7'd64))? 1'b1 :1'b0; 
	shift_en_data <= ((cnt >= 7'd1) && (cnt <= 7'd65))? 1'b1 :1'b0;
end

dna_value,dna:

第一段代码中dan_value对EF2_LOGIC_DNA的dna_out进行移位完成串转并,这个dan_value即为我们要用chipwatch观察的信号。

第二段是为了避免工程没有输出被优化故意对dna_value做了一个与操作。

always @(posedge clk_12p5)
begin 
	if(shift_en_data)
		dna_value <= {dna_dout,dna_value[63:1]};		
	else;
end

assign dna = dna_value[31:0] & dna_value[63:32];
请登录后发表评论

    没有回复内容