FPGA 流式实战 · 01 从单命令到流式数据通路

沿用现有工程基础,建立 AXI4-Stream 数据、包边界和字节有效性的完整契约。

先修知识完成 FPGA AXI / CDC 进阶课程;掌握同步 FIFO、握手、Gray 编码和时序报告基础。

适用环境Basys 3 / Artix-7;板上写 100 MHz、读 50 MHz;Python 3、Icarus Verilog;Vivado 2024.1 命令参考。

验证状态六场景 RTL 测试、两类故障检出及顶层软件模型已验证;性能表为仿真测量,Vivado 与板上 ILA 尚需实测。

本文目录控制面与数据面的分工定义每一拍与每一个包建立软件基线与输入记录典型故障:只传数据,忘了包信息

控制面与数据面的分工

前一课程用 AXI4-Lite 寄存器和单槽邮箱完成一次命令往返。本课程沿用板卡、时钟复位、冻结构建与双 ILA 方法,把数据路径升级为可以连续排队的流式队列。实验由可综合源和接收自检器驱动,没有集成处理器、DMA 或前章寄存器外设;这一边界让工程师能够专注分析数据吞吐、反压和跨域存储。

TDATA、TKEEP、TLAST 作为同一条记录跨域,源和接收端独立握手。流式源序号 / 字节 / 包尾异步 FIFO RAM16 × 37 bit读端输出槽额外 1 拍缓冲接收检查器计数 / 比较 / 反压仅在本域 VALID 与 READY 同时为 1 的时钟沿转移数据
TDATA、TKEEP、TLAST 作为同一条记录跨域,源和接收端独立握手。(原创示意,非器件引脚图;窄屏可横向滑动)

定义每一拍与每一个包

数据宽度为三十二位,TKEEP 表示四个字节是否有效,TLAST 标记包尾。基准源每八拍形成一包,前七拍四字节有效,尾拍只保留两个字节,所以每包有效载荷是三十字节。传输总计四千零九十六拍、五百一十二包,期望有效字节总数为一万五千三百六十;这些数字贯穿代码、性能表和排障步骤。

设计契约与检查依据
项目工程含义
TDATA第 i 拍为 0x60000000 + i*17 + 3
TKEEP普通拍 0xf;包尾 0x3
TLAST序号低三位等于 7 时为 1
TVALID/TREADY两者为 1 才接受一拍;等待时保持全部字段
容量16 个 RAM 槽位加 1 个读端输出槽
接口范围没有 TID、TDEST、TUSER;不是 AXI 存储器映射突发

可综合源,只在实际接受一拍后推进序号。

systemverilog
module stream_source #(parameter N=4096)(input wire clk,rst,
 output wire [31:0] data,output wire [3:0] keep,output wire last,valid,
 input wire ready,output reg [31:0] sent);
 assign valid=!rst && sent<N;
 assign data=32'h60000000+sent*17+3;
 assign last=sent[2:0]==7;
 assign keep=last?4'h3:4'hf;
 always @(posedge clk or posedge rst)
  if(rst)sent<=0;else if(valid && ready)sent<=sent+1'b1;
endmodule

建立软件基线与输入记录

首先在独立的流式工程目录执行软件矩阵,再运行顶层自检器模型。前者包含不同读写速率、周期反压和长时间暂停,后者检验板上逻辑在冷启动及复位后的行为。模型只提供功能证据,不证明实际 MMCM、存储器映射或物理时序;进入硬件阶段前必须保留工具版本和本次构建输入。

  1. 核对接口

    预期与判定:明确一拍、一个包和有效字节的区别。

  2. 运行矩阵

    预期与判定:六个场景都逐拍校验成功。

  3. 运行顶层模型

    预期与判定:冷启动和复位后均完成 4096 拍。

  4. 冻结工程

    预期与判定:保存 BUILD_ID、源码摘要与时钟配置。

在解压后的 fpga-stream 目录执行;软件测试需要 Python 3、iverilog 和 vvp。

bash
python3 flow.py sim
# 六场景均应输出 STREAM_PASS beats=4096 bytes=15360 packets=512
# 最后 STREAM_MATRIX_PASS cases=6
python3 flow.py bist
# 两轮 STREAM_BIST_PASS ... led=01 beats=4096
python3 flow.py prepare baseline --ila

典型故障:只传数据,忘了包信息

把 TDATA 放进队列却让 TLAST 或 TKEEP 走旁路,可能在没有反压时看似正常,一旦两端速度不同就出现包尾错位。数据序号仍然连续也不能证明协议正确,必须把三个字段当作同一个记录接受、存储和输出。接收端需要同时比较数据、字节掩码和包尾,并独立统计实际有效字节。

完成检查

  • 知道 AXI4-Lite 控制面与 Stream 数据面的角色。
  • 明确三字段一起入队的契约。
  • 取得六场景软件基线和版本记录。

延伸阅读与来源

本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。

继续阅读

FPGA

从 RTL 到板上运行的完整流程

建立约束、实现、下载与观测的最小工程闭环。

10 分钟
FPGA

第一个工程的引脚与时钟约束

区分电气连接与时间要求,避免“能生成位流就算正确”。

11 分钟
FPGA

如何读懂时序报告

从起点、终点、时钟和裕量找出失败路径的原因。

10 分钟