You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 19:57:27