Vivado HLS中仅RGB转灰度为何延迟过高?求优化方案
优化Vivado HLS图像灰度转换延迟的方案
你现在的瓶颈很明显:当前代码里所有处理步骤都是串行执行的——不仅单张图像的AXIvideo2Mat→CvtColor→Mat2AXI是一步步等前一个做完才开始,连两张图像的处理也是先跑完第一张的全流程再处理第二张。这就导致总延迟是多个阶段的叠加,自然会达到311k时钟周期左右。要把总延迟降到单阶段的78k左右,核心就是用流水线并行让不同阶段、不同图像的处理重叠起来。
核心优化思路
我们要做两件事:
- 对单张图像的三个处理阶段做流水线,让它们并行工作(比如前一行的灰度转换还在处理时,下一行的AXI读取已经开始,同时上一行的AXI输出也在进行)。
- 让两张图像的完整处理流并行执行,不再串行等待。
修改后的代码
直接在函数里加入#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左右时钟周期。
后续验证与注意事项
- 综合完成后,查看综合报告的Performance部分,确认各个模块的流水线II(启动间隔)是否为1,以及总延迟是否符合预期。
- 检查资源占用情况:如果FPGA资源不足(比如LUT、BRAM不够),可以适当调整图像的
MAX_HEIGHT/MAX_WIDTH,或者对CvtColor模块做进一步的资源优化(比如用定点运算代替浮点,但这里RGB转灰度是整数运算,应该没问题)。 - 确保AXI Stream接口的位宽与你的图像数据格式匹配,避免带宽瓶颈影响流水线效率。
内容的提问来源于stack exchange,提问作者A.k.
相关产品推荐
相关产品推荐

