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

Vivado HLS中仅RGB转灰度为何延迟过高?求优化方案

优化Vivado HLS图像灰度转换延迟的方案

你现在的瓶颈很明显:当前代码里所有处理步骤都是串行执行的——不仅单张图像的AXIvideo2Mat→CvtColor→Mat2AXI是一步步等前一个做完才开始,连两张图像的处理也是先跑完第一张的全流程再处理第二张。这就导致总延迟是多个阶段的叠加,自然会达到311k时钟周期左右。要把总延迟降到单阶段的78k左右,核心就是用流水线并行让不同阶段、不同图像的处理重叠起来。

核心优化思路

我们要做两件事:

  1. 对单张图像的三个处理阶段做流水线,让它们并行工作(比如前一行的灰度转换还在处理时,下一行的AXI读取已经开始,同时上一行的AXI输出也在进行)。
  2. 让两张图像的完整处理流并行执行,不再串行等待。

修改后的代码

直接在函数里加入#pragma HLS DATAFLOW指令,同时把两张图像的处理流明确分开:

#include <hls_video.h> 
#include <hls/hls_video_types.h> 
#include "top.h" 

void toGray(AXI_IN_STREAM &IN_STREAM_1, AXI_IN_STREAM &IN_STREAM_2, 
            AXI_OUT_STREAM &OUT_STREAM_1, AXI_OUT_STREAM &OUT_STREAM_2, 
            unsigned int cols, unsigned int rows){
    #pragma HLS INTERFACE axis port=IN_STREAM_1
    #pragma HLS INTERFACE axis port=OUT_STREAM_1
    #pragma HLS INTERFACE axis port=IN_STREAM_2
    #pragma HLS INTERFACE axis port=OUT_STREAM_2
    #pragma HLS RESOURCE core=AXI_SLAVE variable=rows metadata="-bus_bundle CONTROL"
    #pragma HLS RESOURCE core=AXI_SLAVE variable=cols metadata="-bus_bundle CONTROL"
    #pragma HLS RESOURCE core=AXI_SLAVE variable=return metadata="-bus_bundle CONTROL"
    #pragma HLS INTERFACE ap_stable port=rows
    #pragma HLS INTERFACE ap_stable port=cols

    // 关键:启用DATAFLOW,让各个Mat操作模块流水线并行
    #pragma HLS DATAFLOW

    // 第一张图像的独立处理流
    hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC3> inMat_1(rows, cols);
    hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC1> grayMat_1(rows, cols);
    hls::AXIvideo2Mat(IN_STREAM_1, inMat_1);
    hls::CvtColor<HLS_BGR2GRAY, HLS_8UC3, HLS_8UC1>(inMat_1, grayMat_1);
    hls::Mat2AXIvideo(grayMat_1, OUT_STREAM_1);

    // 第二张图像的独立处理流
    hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC3> inMat_2(rows, cols);
    hls::Mat<MAX_HEIGHT, MAX_WIDTH, HLS_8UC1> grayMat_2(rows, cols);
    hls::AXIvideo2Mat(IN_STREAM_2, inMat_2);
    hls::CvtColor<HLS_BGR2GRAY, HLS_8UC3, HLS_8UC1>(inMat_2, grayMat_2);
    hls::Mat2AXIvideo(grayMat_2, OUT_STREAM_2);
}

优化原理解释

  • #pragma HLS DATAFLOW的作用:这个指令会告诉Vivado HLS把每个基于hls::Mat的操作(比如AXIvideo2Mat、CvtColor)拆成独立的硬件模块,并且通过数据流的方式让它们并行协作。打个比方,就像工厂的流水线:当第一个工位(AXI读取)在处理第N行图像时,第二个工位(灰度转换)已经在处理第N-1行,第三个工位(AXI输出)在处理第N-2行。这样单张图像的总延迟就从三个阶段的总和(78k*3)变成接近单个模块的延迟(流水线启动开销可以忽略)。
  • 两张图像的并行:因为我们把两张图像的处理流完全独立开来,DATAFLOW会同时调度这两个流,它们不会互相等待。所以最终总延迟就由单张图像的流水线延迟决定,也就是你期望的78k左右时钟周期。

后续验证与注意事项

  1. 综合完成后,查看综合报告的Performance部分,确认各个模块的流水线II(启动间隔)是否为1,以及总延迟是否符合预期。
  2. 检查资源占用情况:如果FPGA资源不足(比如LUT、BRAM不够),可以适当调整图像的MAX_HEIGHT/MAX_WIDTH,或者对CvtColor模块做进一步的资源优化(比如用定点运算代替浮点,但这里RGB转灰度是整数运算,应该没问题)。
  3. 确保AXI Stream接口的位宽与你的图像数据格式匹配,避免带宽瓶颈影响流水线效率。

内容的提问来源于stack exchange,提问作者A.k.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:41:40