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 或前章寄存器外设;这一边界让工程师能够专注分析数据吞吐、反压和跨域存储。
定义每一拍与每一个包
数据宽度为三十二位,TKEEP 表示四个字节是否有效,TLAST 标记包尾。基准源每八拍形成一包,前七拍四字节有效,尾拍只保留两个字节,所以每包有效载荷是三十字节。传输总计四千零九十六拍、五百一十二包,期望有效字节总数为一万五千三百六十;这些数字贯穿代码、性能表和排障步骤。
| 项目 | 工程含义 |
|---|---|
| TDATA | 第 i 拍为 0x60000000 + i*17 + 3 |
| TKEEP | 普通拍 0xf;包尾 0x3 |
| TLAST | 序号低三位等于 7 时为 1 |
| TVALID/TREADY | 两者为 1 才接受一拍;等待时保持全部字段 |
| 容量 | 16 个 RAM 槽位加 1 个读端输出槽 |
| 接口范围 | 没有 TID、TDEST、TUSER;不是 AXI 存储器映射突发 |
可综合源,只在实际接受一拍后推进序号。
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、存储器映射或物理时序;进入硬件阶段前必须保留工具版本和本次构建输入。
- 核对接口
预期与判定:明确一拍、一个包和有效字节的区别。
- 运行矩阵
预期与判定:六个场景都逐拍校验成功。
- 运行顶层模型
预期与判定:冷启动和复位后均完成 4096 拍。
- 冻结工程
预期与判定:保存 BUILD_ID、源码摘要与时钟配置。
在解压后的 fpga-stream 目录执行;软件测试需要 Python 3、iverilog 和 vvp。
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 数据面的角色。
- 明确三字段一起入队的契约。
- 取得六场景软件基线和版本记录。
延伸阅读与来源
本文为黄河电子原创教学说明。产品命令与支持范围请以实际安装版本的官方文档为准。
- Arm IHI0051A · AXI4-Stream Protocol
握手、字节限定与包尾;本文工程与测试为原创实现。
- AMD UG903 · CDC Constraints
跨域最大延时与总线偏斜约束。
- AMD UG474 · Distributed RAM Timing
分布式 RAM 的写入与异步读取时序特性。
- AMD UG908 · Programming and Debugging
ILA、探针文件与采集流程。
继续阅读
FPGA从 RTL 到板上运行的完整流程
建立约束、实现、下载与观测的最小工程闭环。
第一个工程的引脚与时钟约束
区分电气连接与时间要求,避免“能生成位流就算正确”。
如何读懂时序报告
从起点、终点、时钟和裕量找出失败路径的原因。
黄河电子