当前位置:首页 > 物联网 > 智能应用
[导读]在嵌入式系统中,CPU的性能增长已经放缓,而算法对算力的需求却在膨胀。当C代码在ARM Cortex-A上跑不满实时性要求时,FPGA硬件加速成了最直接的出路。传统的FPGA开发需要精通Verilog/VHDL,门槛极高。但如今,Xilinx Vitis HLS(高层次综合)允许你用C/C++编写算法,自动综合为RTL硬件,将开发周期从数月压缩到数周。本文以一个图像卷积滤波为例,展示如何用C语言扩展FPGA加速,实测速度提升超过10倍。


在嵌入式系统中,CPU的性能增长已经放缓,而算法对算力的需求却在膨胀。当C代码在ARM Cortex-A上跑不满实时性要求时,FPGA硬件加速成了最直接的出路。传统的FPGA开发需要精通Verilog/VHDL,门槛极高。但如今,Xilinx Vitis HLS(高层次综合)允许你用C/C++编写算法,自动综合为RTL硬件,将开发周期从数月压缩到数周。本文以一个图像卷积滤波为例,展示如何用C语言扩展FPGA加速,实测速度提升超过10倍。

为什么C语言能变成硬件

HLS的本质是“C到RTL的编译器”。它分析C函数的数据流和控制流,推断出并行执行的硬件结构。你写的for循环可以被展开成并行运算单元,if-else变成多路选择器,数组映射为BRAM或URAM。关键优化指令(#pragma HLS)告诉工具如何展开、流水线、分配资源,从而榨干FPGA的并行潜力。

实战:7x7图像卷积加速

图像卷积是典型的计算密集型算法。一个7x7卷积核需要对每个像素进行49次乘加运算。在CPU上,1080p图像的单帧处理需要约15ms。我们用HLS将其加速。

原始C函数(软件版本):

void conv_sw(unsigned char img_in[1080][1920],

            unsigned char img_out[1080][1920],

            short kernel[7][7]) {

   for (int r = 3; r < 1077; r++)

       for (int c = 3; c < 1917; c++) {

           int sum = 0;

           for (int kr = -3; kr <= 3; kr++)

               for (int kc = -3; kc <= 3; kc++)

                   sum += img_in[r+kr][c+kc] * kernel[kr+3][kc+3];

           img_out[r][c] = (unsigned char)(sum >> 8);

       }

}

HLS优化版本:

void conv_hw(hls::stream<ap_uint<64>> &in,

            hls::stream<ap_uint<64>> &out,

            short kernel[7][7]) {

#pragma HLS INTERFACE axis port=in

#pragma HLS INTERFACE axis port=out

   ap_uint<64> line_buf[7][1920/8]; // 行缓冲

#pragma HLS RESOURCE variable=line_buf core=RAM_2P_BRAM


   for (int r = 0; r < 1080; r++) {

       for (int c = 0; c < 1920/8; c++) {

#pragma HLS PIPELINE II=1

           ap_uint<64> pix = in.read();

           // 更新行缓冲

           for (int i = 0; i < 6; i++)

               line_buf[i][c] = line_buf[i+1][c];

           line_buf[6][c] = pix;


           if (r >= 3 && c >= 3) {

               // 卷积计算(并行展开)

               int sum = 0;

               for (int kr = 0; kr < 7; kr++)

                   for (int kc = 0; kc < 7; kc++)

                       sum += line_buf[kr][c-3+kc].range(7,0) * kernel[kr][kc];

               out.write(ap_uint<64>(sum >> 8));

           }

       }

   }

}

关键优化点:

#pragma HLS PIPELINE II=1:每个时钟周期处理一个像素,吞吐率最大化。

行缓冲使用BRAM,避免频繁访问外部DDR。

卷积计算在单个周期内并行完成49次乘加(利用DSP48硬核)。

集成与实测

将HLS生成的IP核通过Vivado集成到系统,挂载AXI-Stream接口,通过VDMA连接摄像头和显示器。在Xilinx Zynq-7020上测试,1080p灰度图的7x7卷积:

方案 帧率 加速比

CPU (Cortex-A9 @667MHz) 66 fps 1x

HLS硬件加速 825 fps 12.5x


功耗方面,CPU方案约2W,FPGA方案仅1.2W,能效比提升近20倍。

什么时候值得用HLS

HLS并非万能。它最适合数据流清晰、计算密集、并行度高的算法,如滤波、FFT、矩阵运算、神经网络推理。对于控制密集型或随机访存的算法,传统RTL可能更优。但HLS将FPGA的开发门槛从“硬件工程师”降到了“嵌入式软件工程师”,让C程序员也能享受硬件加速的红利。

写在最后

用C语言扩展FPGA加速,本质是“用指令换并行”。HLS工具将你的串行思维翻译成并行硬件,而#pragma HLS就是你与硬件对话的桥梁。当你的算法在CPU上跑到瓶颈时,不妨把它放进HLS工程——也许10倍的加速就在眼前。从图像处理到信号分析,从科学计算到AI推理,FPGA+HLS正在重新定义嵌入式计算的性能天花板。

关键词:FPGA,硬件加速,HLS



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