如何将Baysis 3 FPGA实现的硬件RNG输出传输至PC端
Basys 3 抖动型硬件RNG传流至PC做NIST测试实现方案
FPGA板端逻辑实现
- 先做跨时钟域缓存:你的抖动RNG核心工作在自由振荡的低精度时钟域,和传输接口时钟异步,必须例化一个深度1024的8位宽异步FIFO做隔离。RNG逐比特输出时,用一个8位移位寄存器攒比特,每凑满1字节就写入FIFO,避免跨时钟域丢数。
- 传输接口直接用Basys 3板载的USB-UART桥,不需要额外接硬件,就是板子上用来下载程序的那个Micro USB口。UART模块配置为921600波特率、无校验、1停止位、无流控,这个波特率下传输速度足够,不会堵满FIFO。
- UART发送逻辑非常简单:只要检测到异步FIFO的空标志为低(即FIFO内有有效数据),就读出1个字节发送,不需要加任何自定义帧头、校验位,纯发原始字节流,降低后续PC端采集的处理复杂度。
- 上板后先加ILA核抓三组信号确认链路正常:RNG输出的原始比特跳变、FIFO的读写指针状态、UART的TX输出波形,确认没有固定stuck bit、没有FIFO溢出、没有UART发错字节的问题,再连PC做采集。
PC端流数据采集
- 不要用普通串口调试助手存数据,这类工具大多带字符转义、自动加换行的逻辑,会污染原始随机比特流。直接用Python写极简采集脚本即可,依赖
pyserial库,采集到的字节直接按二进制格式写入文件,不做任何转码处理。 - 可直接复用的采集脚本如下,修改串口号、采集长度、保存路径即可使用:
import serial import time # 串口参数必须和FPGA端UART配置完全一致 ser = serial.Serial(port='COM3', baudrate=921600, parity='N', stopbits=1, timeout=10) time.sleep(2) # 等待串口枚举稳定 target_size = 100 * 1024 * 1024 # 采集100MB原始数据,满足NIST测试样本量要求 written_bytes = 0 with open('rng_raw_stream.bin', 'wb') as f: while written_bytes < target_size: chunk = ser.read(4096) f.write(chunk) written_bytes += len(chunk) ser.close()
- 采集注意事项:采集过程中关闭PC端其他高负载程序,避免串口接收缓冲区溢出丢数;采集完成后核对文件大小,若和目标大小偏差超过1KB说明存在丢包,需要降低波特率或者加大FIFO深度后重新采集。
NIST测试适配
- NIST SP 800-22测试套件原生支持二进制裸流文件输入,你采集到的.bin文件不需要做格式转换,直接导入测试套件即可。
- 唯一需要注意的是比特顺序匹配:如果FPGA端移位寄存器是先采集到的RNG比特放在字节高位,测试时不要做比特反转操作,否则会引入人为的序列偏差,导致测试结果不准。
- 如果首次测试通过率不达标,优先排查传输链路问题:比如UART分频误差是否超过2%、FIFO是否出现过溢出、采集过程中是否有丢数,排除链路问题后再调整RNG核心的抖动环参数。
内容的提问来源于stack exchange,提问作者Rahul
相关产品推荐
相关产品推荐

