这一篇在干嘛?
你做好的 FPGA 设计,一旦比特流被人拷走,就能烧到另一块芯片上白嫖。安路 EAGLE 系列 FPGA 给每块芯片出厂时就”刻”了一串全球唯一的 64 位 DNA 序列号——改不掉、擦不掉,你的设计可以在运行时读出它来认芯片。这一篇就讲:DNA 是什么、能干什么、以及怎么一步步把它读出来。
一、DNA 到底是什么?
先说结论:DNA 就是一串 64 位的数字,相当于芯片的身份证号。
安路在 EAGLE FPGA 的生产过程中,会给每一块芯片写入一个唯一的 64 位 DNA 数据。它有三个关键特性:
- 唯一:每块芯片一个,不重复,就像每个人的身份证号都不一样;
- 不可修改:用户改不了它;
- 不可擦除:断电、重新烧比特流,它都还在。
也就是说,不管你的设计被拷贝到多少块芯片上,只要设计里”问一下”芯片的 DNA,就能立刻分辨出”这块板子是不是我授权过的那块”。
二、DNA 能拿来干什么?
手册里只说了一句”可以利用 DNA 进行用户设计保护”,具体怎么保护,属于你自己的设计思路。常见的玩法有这几类,这里讲清楚原理,但注意:这些是设计思路,具体实现要靠你自己在逻辑里完成:
- 防拷贝(绑定板卡):把设计里某些关键运算的输入”混入” DNA 值。这样同一个比特流烧到别的芯片上,DNA 对不上,运算结果就是错的,设计根本跑不起来。相当于设计只对”那一块”芯片有效。
- 加密授权:在片上用 DNA 参与某种校验运算(比如和你在 Flash 里存的许可值做比对或变换),只有 DNA 匹配的芯片才解锁全部功能。想做更强的方案,还可以把 DNA 和外部存储里的密钥组合起来做一致性验证。
- 版本/溯源管理:DNA 反正每块芯片都不同,拿它当生产序列号记录,出货、维修、统计时都能对上号。
一个最朴素的理解方式
把 DNA 想成”芯片自带的、别人抄不走的私章”。你的设计在启动时盖一次章、验一次真伪,验不过就装死——这就是所有 DNA 保护方案的共同骨架。
三、用 TD 的 DNA IP 来读
自己摸寄存器是读不到 DNA 的,好消息是你不用自己想办法:安路的 TD(Tang Dynasty)集成开发环境直接提供了 DNA IP,把 IP 例化进你的设计,接上几个信号就能把 64 位 DNA 移出来。
先看 IP 长什么样——左边三个是输入,右边一个是输出:

四个端口的说明如下(对应手册的端口描述表):
| 名称 | 输入/输出 | 位宽/bit | 描述 |
|---|---|---|---|
| dna_clk | input | 1 | dna_clk 时钟 |
| dna_shift | input | 1 | dna 数据移入移出使能,高有效 |
| user_dna_in | input | 1 | 用户数据移入 |
| dna_out | output | 1 | dna 模块数据移出 |
逐个解释一下:
- dna_clk:整个模块的节拍器,所有移位动作都跟着这个时钟走。频率范围是 0~20MHz,不高,慢一点完全没问题。
- dna_shift:开关。拉高(高有效)时模块才开始工作——数据一边移入一边移出;拉低就停住。
- user_dna_in / usr_dna_in:用户自定义数据输入,一次移进来 1 位。手册说明它主要用于接口测试——你可以随便填个自定义位宽和数值移进去,验证整个移位链路是通的。
- dna_out:出口。DNA 的 64 位(D0~D63)就是从这里一位一位串行吐出来的。
命名小坑
手册正文和时序图里写的是 usr_dna_in,端口表里写的是 user_dna_in,两处叫法不一致。实际例化 IP 时,以你所用 TD 版本生成的 IP 端口名为准,别因为名字对不上就以为接错了线。
四、怎么读:时序逐条讲
看懂这张时序图,读取流程就通了:

从上往下四根信号,跟着走一遍:
- 先给时钟,平时 dna_shift 保持低:模块静止,dna_out 上没有有效数据。
- 拉高 dna_shift:这是”开始读”的发令枪。注意图里标了一个 T1——发令枪打响后,并不是立刻就有数据出来,中间隔了一小段建立时间,所以要等 T1 过后再开始采样,别抢跑。
- usr_dna_in 上送你的自定义数据:时钟每来一个节拍,就移进 1 位。图中送的是 UD0、UD1、UD2、UD3……这些是你自己随便定的值(测试用)。
- dna_out 同步移出 DNA:每来一个时钟节拍,吐出 1 位,顺序是 D0、D1、D2……一路到 D63,正好 64 拍。你在 dna_clk 的节拍上把这 64 位逐个接住、拼起来,就是这块芯片的完整 DNA。
- 一个有意思的细节:64 位 DNA 出完之后,dna_out 接着往外吐的是你刚才移进去的那些数据(图里 D63 后面跟着 UD0、UD1……)。也就是说这是个”双向串行链”:你送进去什么,绕一圈还会出来什么——这正是它适合做接口测试的原因:移入已知数据、移出核对一遍,链路通没通一目了然。
- 读完拉低 dna_shift:移位停止,一次读取结束。
完整的读取思路(文字版伪流程,非代码):上电 → 产生一个 0~20MHz 的 dna_clk → 拉高 dna_shift → 等 T1 → 在 dna_clk 节拍下用移位寄存器从 dna_out 收满 64 位 → 拉低 dna_shift → 拿这 64 位 DNA 去参与你的校验逻辑。整件事就是一个普通的串行移位时序,难度不高,关键在节奏对齐。
两个最容易踩的坑
- 时钟别超范围:dna_clk 的合法范围是 0~20MHz,超频可能导致移位数据出错,读出来的 DNA 不对。反正读 DNA 不赶时间,给个几 MHz 就很稳妥。
- dna_shift 建议用时钟下降沿送出:手册明确建议 dna_shift 在时钟下降沿发出,保证时序要求。如果在上升沿附近同时翻转 dna_shift 又采样数据,建立/保持余量就悬了,容易读出错位的数据。
五、小结
- DNA = 每块 EAGLE 芯片出厂唯一的 64 位序列号,不可修改、不可擦除;
- 用途核心是设计保护:防拷贝绑定板卡、加密授权、溯源管理(这些是设计思路,逻辑要自己写);
- 读法:TD 提供 DNA IP,dna_clk(0
20MHz)打拍、dna_shift 拉高使能(建议下降沿送出)、从 dna_out 串行收 D0D63; - usr_dna_in 是测试用的移入通道,移进去的数据在 64 位 DNA 之后会原样从 dna_out 出来。
自测 1:为什么 dna_shift 建议在 dna_clk 的下降沿送出?如果在上升沿附近翻转会有什么风险?
因为 dna_shift 和 dna_out 的采样都由 dna_clk 同步,下降沿送出让 dna_shift 的变化正好落在数据不变化的时刻,给建立/保持时间留足余量。若在上升沿附近翻转,使能信号和采样边沿几乎同时发生,时序余量不足,可能读到错位或错误的数据。
自测 2:从 dna_shift 拉高开始,dna_out 上一共会依次出现哪些数据?
先是 T1 建立时间过后开始移出的 64 位芯片 DNA(D0~D63),之后接着输出的是你通过 usr_dna_in 移入的用户数据(UD0、UD1……)。收数时只取前 64 位就是芯片 DNA,后段可用来核对移位链路是否正常。