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 实际抓到的信号如下图所示。
通过 ChipWatcher 实际抓到的 DNA 数据和 MINI DEMO 板 DNA 码相同。
2.实验原理
调用DNA原语进行DNA的读取
3.源码分析
代码的核心是这个EF2_LOGIC_DNA原语。
module EG_LOGIC_DNA(dout, clk, din, shift_en); // config dna
output dout; // LSB out firstly
input clk;
input din;
input shift_en;
endmodule
- 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];
没有回复内容