当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]在FPGA高速数据流设计中,AXI4-Stream(AXIS)是连接DMA、DSP和视频IP的“血管”。但很多工程师只关注TDATA和TLAST,却忽略了TKEEP信号,导致在非对齐数据传输时出现数据错位、CRC校验失败等隐蔽Bug。本文将详解TKEEP在数据对齐中的实战用法,帮你避开“最后一拍”的坑。



FPGA高速数据流设计中,AXI4-Stream(AXIS)是连接DMA、DSP和视频IP的“血管”。但很多工程师只关注TDATA和TLAST,却忽略了TKEEP信号,导致在非对齐数据传输时出现数据错位、CRC校验失败等隐蔽Bug。本文将详解TKEEP在数据对齐中的实战用法,帮你避开“最后一拍”的坑。


一、TKEEP不是“摆设”:字节级有效掩码


TKEEP的本质是字节使能掩码。它解决了总线位宽与实际有效数据长度不匹配的核心矛盾。


信号定义规则:

• 位宽映射:TKEEP的位宽 = TDATA位宽 / 8。例如,64位TDATA对应TKEEP[7:0]。


- 语义:TKEEP[n] = 1表示对应的TDATA字节是有效载荷;TKEEP[n] = 0表示该字节是“空字节”(Null Byte),接收方应忽略。


常见误区:很多简单设计将TKEEP默认拉高(全1),这仅在数据始终对齐(如每次传输都是64B、128B)时有效。一旦遇到包尾非对齐或稀疏数据,必须精确控制TKEEP。


二、实战场景:包尾非对齐数据的处理


这是TKEEP最核心的应用场景。假设总线位宽为32bit(4字节),需要传输一个7字节的数据包。传输过程如下表所示:


周期 TDATA[31:0] (字节序) TKEEP[3:0] TLAST 说明


1 D0 D1 D2 D3 1111 0 前4字节满,有效


2 D4 D5 D6 XX 0111 1 关键! 仅低3字节有效,最高字节无效


避坑指南:

• 无效数据填充:第二个周期的D7位置(TKEEP[3]对应字节)可以是任意值(通常填0或保持原值),因为TKEEP[3]=0告知接收方忽略它。


• TLAST与TKEEP协同:TLAST=1仅表示“包结束”,但具体结束在哪个字节由TKEEP决定。两者必须同时生效。


三、Verilog代码实现:发送端与接收端


1. 发送端:生成非对齐TKEEP


以下代码演示了如何根据剩余字节数动态生成TKEEP掩码。

// 发送端:处理包尾非对齐数据

module axis_sender (

   input  wire        aclk,

   input  wire        aresetn,

   output reg         m_axis_tvalid,

   output reg [31:0]  m_axis_tdata,

   output reg [3:0]   m_axis_tkeep,  // 32bit总线,4字节

   output reg         m_axis_tlast,

   input  wire        m_axis_tready

);

   reg [7:0] data_buffer [0:6]; // 假设存有7字节数据

   reg [2:0] byte_counter;

   reg       is_last_beat;


   always @(posedge aclk or negedge aresetn) begin

       if (!aresetn) begin

           m_axis_tvalid <= 1'b0;

           m_axis_tlast  <= 1'b0;

           byte_counter  <= 0;

       end else begin

           if (m_axis_tvalid && m_axis_tready) begin

               // 握手成功,准备下一拍

               if (m_axis_tlast) begin

                   // 包结束,复位状态

                   m_axis_tvalid <= 1'b0;

                   m_axis_tlast  <= 1'b0;

                   byte_counter  <= 0;

               end else begin

                   byte_counter <= byte_counter + 4; // 每次推进4字节

               end

           end


           // 数据组装逻辑

           if (/* 数据就绪条件 */) begin

               m_axis_tvalid <= 1'b1;

               // 组装TDATA(略)

               // ...


               // 核心:TKEEP生成逻辑

               if (byte_counter <= 3) begin // 第一拍:满4字节

                   m_axis_tkeep <= 4'b1111;

                   m_axis_tlast <= 1'b0;

               end else begin // 第二拍:只剩3字节

                   m_axis_tkeep <= 4'b0111; // 仅低3字节有效

                   m_axis_tlast <= 1'b1;

               end

           end

       end

   end

endmodule



2. 接收端:解析TKEEP并写入FIFO


接收端必须根据TKEEP筛选有效字节,而非盲目写入整个TDATA。

// 接收端:基于TKEEP的有效字节提取

module axis_receiver (

   input  wire        aclk,

   input  wire        aresetn,

   input  wire        s_axis_tvalid,

   input  wire [31:0] s_axis_tdata,

   input  wire [3:0]  s_axis_tkeep,

   input  wire        s_axis_tlast,

   output reg         s_axis_tready

);

   reg [7:0] payload_fifo [0:255];

   reg [7:0] wr_ptr;


   always @(posedge aclk or negedge aresetn) begin

       if (!aresetn) begin

           wr_ptr <= 0;

           s_axis_tready <= 1'b1;

       end else begin

           if (s_axis_tvalid && s_axis_tready) begin

               // 遍历每个字节,仅当TKEEP[i]==1时写入

               for (integer i = 0; i < 4; i = i + 1) begin

                   if (s_axis_tkeep[i]) begin

                       payload_fifo[wr_ptr] <= s_axis_tdata[i*8 +: 8];

                       wr_ptr <= wr_ptr + 1;

                   end

               end


               if (s_axis_tlast) begin

                   // 包结束处理

                   wr_ptr <= 0;

               end

           end

       end

   end

endmodule


关键点:接收端的for循环必须严格按TKEEP掩码操作,否则会引入垃圾数据。


四、TKEEP与TSTRB的区别(易混淆点)


很多开发者分不清TKEEP和TSTRB,虽然两者位宽映射相同,但语义完全不同:


信号 语义 典型场景


TKEEP 字节存在性:0=空字节(应丢弃),1=有效字节 以太网帧尾、UDP短包


TSTRB 字节有效性:0=位置字节(占位符),1=数据字节 内存非对齐访问的填充


简单记忆:在Xilinx AXI DMA等IP中,通常只使用TKEEP。TSTRB更多用于AXI4-Lite/Full的写选通,在Stream中可忽略。


五、工程避坑与IP核配置建议


1.  Vivado IP配置:在使用AXI4-Stream Subset Converter或DMA IP时,若涉及非对齐传输,必须勾选Enable TKEEP。如果只勾选TLAST,IP核会默认整拍数据有效,导致包尾多出无效字节。

2.  仿真检查:在Testbench中,务必检查TKEEP非全1的情况。可以强制在包尾插入TKEEP=4'b0011,验证接收端是否真的只取了2个字节,防止FIFO溢出或CRC错误。

3.  位序警告:TKEEP[0]通常对应TDATA[7:0](最低字节)。在异构系统(如ARM+FPGA)中,若存在字节序转换,需同步调整TKEEP的位序映射。


六、结语


TKEEP是AXI4-Stream协议中处理数据对齐的“精确定位器”。在千兆以太网、视频行消隐、自定义协议打包等场景中,忽略TKEEP等于埋下了数据错位的隐患。请牢记:TLAST标记包的结束,TKEEP标记有效字节的边界。在非对齐传输中,两者必须协同工作,才能保证数据从发送端到接收端的比特级精确重建。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

在FPGA上构建RISC-V SoC时,从复位向量到串口打印“Hello World”的启动流程,是验证软核能否“自主呼吸”的关键。本文将基于常见的PicoRV32或VexRiscv软核,详解从硬件复位到软件驱动的完整链...

关键字: RISC-V FPGA

在软件无线电(SDR)和雷达接收机中,数字下变频(DDC)是连接高速ADC与基带处理的关键桥梁。其核心任务是将高频宽带信号搬移到基带,并降低数据率。本文将详解如何利用NCO(数控振荡器)生成正交载波,并结合CORDIC(...

关键字: FPGA DDC

在FPGA开发中,Vivado HLS(High-Level Synthesis)是将C/C++算法转化为硬件IP核的利器。然而,未经优化的C代码综合后往往性能低下。流水线(Pipelining)是打破顺序执行瓶颈、将吞...

关键字: Vivado HLS C++ FPGA

在异构计算与高速数据采集领域,PCIe Gen3 x4 提供了接近 4GB/s 的理论带宽,是连接 FPGA 与 CPU 的“高速公路”。对于大多数开发者而言,XDMA(DMA/Bridge Subsystem for...

关键字: FPGA PCIe 异构计算

在FPGA开发中,时钟域交叉(CDC)是导致亚稳态和数据错乱的“头号杀手”。当信号从clk_a跨越到异步的clk_b时,若处理不当,轻则数据跳变,重则系统死锁。本文将对比4种最核心的CDC方案,帮你从“能用”进阶到“可靠...

关键字: FPGA CDC 时钟域交叉

在工业伺服驱动与多轴运动控制系统中,EtherCAT凭借其纳秒级同步精度成为主流。为了兼顾协议处理效率与复杂控制算法的实时性,“FPGA(ESC)+ MCU(应用)”的双核架构已成为高性能从站设计的标准范式。本文将深入探...

关键字: 工业总线协议 EtherCAT FPGA

在本教程中,我将展示如何创建并使用适用于 Zynq Ultrascale+ XCZU4EV 中 GTH 传输器的示例项目。

关键字: 处理器 收发器 FPGA

另一个重要的学习要点是理解 Zynq 设备的系统级行为。由于该设计依赖于处理系统来提供时钟,因此必须对处理系统进行初始化,以便可编程逻辑能够正常运行。

关键字: LED FPGA AUP-ZU3

为回馈广大开发者长期以来的支持,米尔电子将在本次展会现场举办福利活动,限时免费赠送15套MYD-YM90G开发板。诚邀各位行业伙伴与技术爱好者前往展台了解详情并参与领取。

关键字: FPGA 开发板

在FPGA设计流程中,布局布线阶段往往是决定设计成败的关键环节。特别是对于Xilinx UltraScale+这类高端器件,资源密度高、时钟网络复杂、时序要求严格,传统的实现策略往往难以满足高性能需求。Vivado De...

关键字: Xilinx UltraScale+ Smart Exploration FPGA
关闭