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];
请登录后发表评论

    没有回复内容