2026年,全国大学生集成电路创新创业大赛(集创赛)的‘芯片应用与系统设计’赛道,如果选择‘基于国产FPGA的激光雷达点云实时滤波与目标聚类系统’,在实现滤波(如体素滤波、统计滤波)和聚类(如DBSCAN)算法时,如何针对FPGA的并行架构进行硬件化改造?

开放20 回答 59 浏览

我们团队想参加集创赛,选题是激光雷达数据处理,计划使用国产FPGA(比如安路或紫光同创的型号)。点云数据处理算法在CPU上通常是串行和迭代的,比如DBSCAN聚类需要多次遍历和邻域查询,直接移植到FPGA效率很低。我们遇到的挑战是:1. 如何将体素网格化、统计滤波这类算法映射到并行的硬件逻辑中?需要设计怎样的数据流和存储架构?2. 对于DBSCAN这种密度聚类算法,有没有适合FPGA实现的近似算法或硬件友好型改造思路?比如通过空间划分(如KD-tree的硬件实现)来加速邻域搜索?3. 国产FPGA的开发工具链和IP生态与Xilinx/Intel有差距,在实现自定义计算单元时可能会遇到哪些工具上的限制?有没有相关的开源参考设计?求有相关项目或比赛经验的大神分享架构设计思路和实战经验。

分享:
  • FPGA学员4

    我们去年集创赛做过类似题目,用的是紫光同创的FPGA。针对体素滤波,核心思路是把空间划分成固定大小的体素网格,然后并行处理每个体素。具体实现时,我们设计了一个流水线:数据输入模块负责接收点云(比如通过UART或以太网),然后坐标转换模块将点映射到体素索引(这里用定点数运算,注意国产FPGA的DSP资源可能有限)。关键是体素网格的存储,我们用Block RAM实现了一个三维查找表,每个体素存储点的统计信息(如点数、质心)。并行处理多个体素时,通过分时复用BRAM端口来避免冲突。统计滤波类似,但需要计算每个点的邻域距离,我们预先对点按空间位置排序(用硬件排序网络),然后批量计算距离,剔除离群点。建议先仿真算法,再逐步映射到硬件模块,工具链上紫光同创的PDS IDE有时综合效率不高,多尝试不同的流水线打拍策略。

  • 硅农预备役2024

    从算法改造角度聊聊DBSCAN。纯软件DBScan在FPGA上直接实现确实难,因为迭代和动态内存访问多。我们的经验是采用‘分治+近似’:先把空间用均匀网格划分(比KD-Tree硬件实现简单),每个网格内的点预先存入BRAM。聚类时,以网格为单位并行处理,每个网格核心检查相邻网格内的点是否密度可达(这需要定义距离阈值)。为了减少遍历,可以预先计算网格质心或特征。另一个思路是用‘连通分量标记’的硬件算法替代DBSCAN,适合二值化后的点云。国产FPGA工具可能缺少高级综合(HLS)支持,你得写Verilog/VHDL,但开源社区有Vivado HLS的类似项目,可以借鉴其数据流思路,手动翻译成RTL。注意安路FPGA的BRAM大小,点云数据量大时可能需要外挂DDR,但带宽可能成瓶颈。

  • FPGA学员3

    我分享点实战坑和选择建议。首先,选题不错,但硬件化改造的关键是‘简化算法、拥抱并行’。滤波部分,体素滤波本质是降采样,可以设计多个并行的体素处理单元(PE),每个PE处理一个体素块,数据流采用乒乓缓冲,一边输入新点,一边处理旧点。统计滤波则更吃存储带宽,建议用片上RAM缓存局部点集,计算均值方差时用流水线加法树。聚类部分,别硬怼DBSCAN,考虑用欧氏聚类或区域生长法,它们更易于硬件实现:比如将点云投影到二维网格,用硬件友好标签传播。国产FPGA开发,安路的TD软件和紫光的PDS都还行,但IP少,自定义计算单元得从头写。遇到综合后时序不达标,常见原因是组合逻辑太长,多打拍流水线。开源参考可以看GitHub上‘FPGA-point-cloud-processing’项目,虽然基于Xilinx,但架构可借鉴。最后,比赛注重系统完整性和创新点,不必追求全算法硬件化,CPU+FPGA协同处理也许更现实。

  • 电路设计新人

    我们去年集创赛做过类似题目,用的是安路FPGA。针对你的问题,核心思路是把算法从‘过程描述’变成‘数据流图’和‘状态机’。对于体素滤波,别在FPGA里动态建网格和链表,太耗资源。我们的做法是:预处理阶段,用固定位宽的坐标(比如对X,Y,Z各用10bit)直接哈希出一个体素索引,相当于把空间划分固定了。然后设计一个流水线:第一个时钟周期计算哈希,第二个周期根据索引去片上BRAM(存储点计数和累加坐标),第三个周期更新累加值。等一帧点云流完,BRAM里存的就是每个体素的质心,再输出质心坐标。这样天然就是并行的,你可以同时开多条这样的流水线处理不同的点,只要处理好BRAM的读写冲突(比如用双端口RAM,或者分bank)。统计滤波也类似,关键是邻域搜索的优化。我们没做KD-tree,因为递归结构在FPGA里不好实现。我们用了一个比较取巧的办法:先把点云按Z-order曲线(Morton码)排序,这样空间上接近的点在存储上也接近。然后设计一个滑动窗口模块,窗口大小固定,在排序后的数据流上滑动,计算窗口内点的距离统计量。这个可以用移位寄存器和加法树实现,也是流水线。DBSCAN确实难,我们最后没用标准的,改用了基于网格的聚类,就是把空间划分成粗粒度的网格,先对网格进行密度判断,再把高密度网格连起来。虽然精度有损失,但硬件上就是一些比较器和状态机,实时性很高。国产FPGA工具链确实坑多,比如安路的TD软件,调试功能弱,仿真慢。建议先用Matlab或Python把算法定点化仿真好,再写RTL。逻辑综合时注意资源使用率别太高,否则布线会失败。开源参考可以看看OpenPCL的硬件加速部分,但直接用的不多,需要自己改。

  • Verilog练习生

    从算法改造的角度聊聊。DBSCAN在CPU上是基于点的迭代,在FPGA上直接搞确实不现实。一个可行的硬件友好思路是:将算法转化为两阶段流水线。第一阶段,空间划分与密度预计算。不要用动态的KD-tree,考虑用固定大小的三维网格(Grid)划分空间,网格尺寸根据雷达精度和聚类目标大小预先设定。每个网格单元用一个寄存器记录落入该网格的点数(密度)。这个映射过程可以并行:每个点的坐标可以独立计算其所属网格索引,然后对对应网格的计数器进行累加(这里需要注意多个点同时写入同一网格的冲突,可以用多周期仲裁或增加网格副本解决)。第二阶段,聚类标记。基于网格密度图进行连通域分析。将密度超过阈值的网格视为‘核心网格’,然后通过扫描整个网格图,将相邻的核心网格标记为同一类簇。这本质上是一个图像连通域标记的硬件实现,有成熟的硬件架构(比如并查集的硬件化)。对于落在核心网格内的点,直接赋予该类簇标签;对于边界点(密度不足但邻接核心网格),可以在后续逻辑中处理。这样改造后,算法避免了复杂的邻域查询和递归,主要操作是固定地址的计数、比较和标签传播,非常适合用状态机和流水线实现。关于国产FPGA,紫光同创和安路的器件,其DSP和BRAM资源相对有限,设计时要精打细算。比如坐标计算尽量用移位和加法代替乘法,查找表(LUT)利用率高时会影响时序。开发工具可能对高级综合(HLS)支持不好,建议直接写Verilog/VHDL,控制力更强。参考设计方面,可以搜索IEEE上关于‘FPGA加速点云聚类’或‘hardware-friendly DBSCAN’的论文,有些会提供架构框图和数据流,虽然不完全开源,但思路很有借鉴价值。

  • EE学生一枚

    我们去年集创赛做的是点云目标检测,也用了国产FPGA。针对你的问题,我的经验是:1. 体素滤波非常适合FPGA并行化。核心思路是把空间划分成体素网格,每个网格分配一个处理单元(PE)或状态机。点云数据按坐标分发到对应网格,网格内并行统计点数并判断是否保留。关键是要设计好数据分发网络和片上缓存,避免访问冲突。我们当时用了多级流水线,第一级算体素索引,第二级分发,第三级统计,第四级输出。2. DBSCAN直接硬搞很麻烦,我们改用了基于网格的聚类,类似将空间划分成粗网格,在每个网格内做密度统计,然后合并相邻高密度网格。这虽然损失了一些精度,但硬件上容易实现,只要设计好网格间通信逻辑就行。3. 国产FPGA工具链确实弱,比如高级综合(HLS)支持不好,我们基本都是写Verilog。建议先用Xilinx平台做算法原型,再移植到国产FPGA。开源参考可以看GitHub上一些用HLS实现的点云处理项目,虽然不完全匹配,但数据流设计有参考价值。

  • 单片机初学者

    从算法映射的角度说说。滤波部分,体素滤波本质是空间分桶,FPGA上可以并行做哈希映射。具体步骤:先对点云坐标进行量化(比如右移几位得到体素索引),然后用哈希表(片上BRAM实现)记录每个体素内的点数。这里要注意哈希冲突处理,可以用开放寻址法。统计滤波可以接在体素滤波之后,在每个体素内并行计算点到邻居的平均距离,再和阈值比较。DBSCAN的难点在于邻域查询和递归扩展。一个可行的改造是:先用体素网格对空间分区,每个分区内的点数量有限,然后在分区内做全连接距离计算(并行比较),标记核心点。分区之间通过边界点传递聚类信息。这样就把全局的递归搜索拆成了局部并行+全局合并。国产FPGA的BRAM和DSP资源有限,设计时要精打细算,比如距离计算用平方和代替开方,比较用平方距离。开发工具上,安路的TD软件对仿真支持较弱,建议自己搭个简单的testbench环境,多仿真。

  • 逻辑设计新人

    我们去年做过类似的项目,用的是紫光同创的FPGA。针对你的问题,分享一下我们的经验。

    首先,体素滤波和统计滤波的并行化核心是空间划分。你不能在FPGA上像CPU那样一个个点顺序处理。我们的做法是:把三维空间预先划分成体素网格,每个体素分配一个独立的处理单元(PE)或者用分时复用的方式。数据流设计上,点云数据进来后,根据XYZ坐标,通过一个“分发”模块,同时(或流水线式地)送到对应的体素缓冲区。统计滤波(比如移除离群点)可以在每个体素内部并行计算该体素内点的距离分布,然后并行的比较、标记。这里的关键是存储架构:需要大量的分布式RAM或Block RAM来缓存各个体素的数据,同时要设计好地址映射逻辑,避免访问冲突。

    对于DBSCAN,完全照搬确实不现实。我们采用了“网格化DBSCAN”的近似算法。先把空间均匀网格化,每个网格单元作为一个“超级点”。聚类首先在网格单元之间进行(判断相邻网格的密度),这比直接在原始点上做邻域搜索要快得多,而且网格邻接关系是固定的,可以预先固化在硬件里。对于网格内部的点,再做精细处理。这本质上是用空间换时间,并且非常适合FPGA的并行查找。

    国产FPGA工具链,比如紫光同创的Pango Design Suite,在高级综合(HLS)和复杂IP核方面确实弱一些。我们当时基本是手写Verilog/RTL。建议你们重点吃透它提供的RAM、DSP和时钟管理单元的手册。开源参考设计可以看看OpenCL for FPGA的一些基础架构,但需要自己大量适配。一个实用的建议:尽早把算法用MATLAB或C仿真透,然后手动拆解成可以流水线并行的步骤,再着手写硬件描述。

  • FPGA实验小白

    同学你好,我主要从算法硬件化改造的思路来聊聊。

    滤波部分,体素滤波的本质是“分桶”和“下采样”,这本身就有并行潜力。硬件化时,可以设计一个多级流水线:第一级,坐标计算和体素索引生成(用乘法器和截断逻辑);第二级,根据索引将点写入对应的体素缓冲区(这里可以用多个双端口RAM模拟多个体素桶,并行写入);第三级,对每个非空体素,并行计算其重心或随机选一个点作为输出。统计滤波可以融合在体素内部做,比如计算体素内点云的平均距离,然后同一时钟周期内比较所有点与平均值的差距,标记离群点。

    DBSCAN的痛点在于核心点判断需要查询半径内所有邻居。一个硬件友好思路是:放弃精确的DBSCAN,采用两级流水聚类。第一级,用固定大小的三维滑动窗口(比如一个立方体区域)对空间进行扫描,窗口内密度超过阈值就标记为潜在聚类区域。这个窗口扫描可以用移位寄存器链高效实现,类似于图像处理中的卷积。第二级,对标记的相邻区域进行合并(等价类合并),这个可以用并查集(Union-Find)算法的硬件加速版来实现。虽然结果是近似的,但对于实时性要求高的激光雷达应用,往往可以接受。

    国产FPGA开发,要特别注意资源限制和时序收敛。安路或紫光同创的器件,DSP和BRAM资源通常比同档次赛灵思的少。所以你的架构要更精简,多使用时序逻辑和状态机控制,减少复杂组合逻辑。开源参考方面,可以搜索IEEE上关于“FPGA point cloud processing”的论文,有些会提供架构图。但完全开源的完整设计很少,需要自己啃。建议先用小规模点云数据验证核心模块,再逐步扩展。

  • Verilog新手笔记

    我们去年做过类似的项目,用的是紫光同创的FPGA。针对你的问题,分享一下我们的思路。

    首先,体素滤波和统计滤波的并行化核心是空间划分。你不能在FPGA里像CPU那样一个个点去循环。我们的做法是:把三维空间预先划分成体素网格,每个体素分配一个独立的计算单元(或者叫处理引擎)。数据流进来的时候,根据点的坐标,通过一个硬件查找表(LUT)或者计算单元,瞬间就能确定它属于哪个体素,然后送到对应的处理单元去累加统计信息(比如点数、均值、方差)。这本质上是一个“分流”和“归约”的过程,非常适合用流水线和并行处理实现。存储架构上,我们用了多个BRAM块来缓存不同体素的中间数据,避免访问冲突。

    DBSCAN在硬件上直接实现确实难,主要是邻域查询和迭代传播。我们最终没有用标准的DBSCAN,而是用了一种“两步法”的近似方案:第一步,用上面提到的体素网格,把密度足够高的体素直接标记为潜在核心体素(这步并行做很快)。第二步,对这些核心体素进行连通性分析(类似图像处理的区域生长,硬件友好)。这样避免了逐点的、递归的邻域查询。效果上,对于结构化场景(比如道路、车辆)够用了,而且实时性极高。

    国产FPGA工具链确实是个坑。安路和紫光同创的IDE在高级综合(HLS)和IP集成方面比较弱,写RTL是主流。我们的建议是:尽早确定型号,用厂商提供的Memory Controller、DSP核等基础IP,自定义计算单元用纯Verilog/VHDL写,控制逻辑尽量简单。开源参考设计很少,但可以看看一些大学(比如电子科大、清华)在GitHub上发布的基于国产FPGA的简单图像处理项目,了解基本开发流程。最关键的是,仿真要做得非常充分,因为上板调试手段有限。

登录后可在本页底部提交回答

提问者

芯片爱好者小李查看主页

描述场景与已尝试方案,更容易获得有效解答

浏览「其他」

相关问题

同分类问答

提问建议

  • 标题写清核心疑问,避免「求助」「请问」等空泛用语
  • 正文补充环境、版本、报错信息或截图
  • 先搜索本站是否已有相近问题,减少重复提问
  • 若与课程相关,请标明课时或章节便于讲师定位

技术问答

问完之后的闭环

  • 关联课程精学高频问题往往对应章节,建议回到课程补基础。
  • 产出与互助解决过程可写成笔记,帮助后续同学。

探索全站