数字电路萌新007
最近刚用Zynq做过类似的东西,说点实际踩过的坑。软件算法瓶颈主要是大量浮点运算和随机内存访问,FPGA上要避免这两点。首先,考虑把浮点转定点,激光雷达数据精度用16位或20位定点基本够,能省大量资源。架构上,我用了混合方法:一个高速流水线前端做体素化(Voxelization),把点云规整到固定网格;后端用多个并行的处理单元(PE)组成计算阵列。每个PE负责一个或一组网格的邻域搜索。具体到聚类,比如欧几里得聚类,可以这么做:流水线输入点,第一个点进来,分配一个新标签,然后立刻启动对其周围网格的搜索,把找到的邻近点(距离小于阈值)推到一个FIFO里,这些点继承相同标签。然后不断从FIFO取点,重复这个“扩张”过程,直到FIFO空,这就完成了一个聚类。整个过程是流水线+并行扩张,多个聚类种子可以同时扩张,只要资源够。注意同步和冲突,比如两个扩张进程可能同时想给同一个点打标签,需要简单的仲裁逻辑。参考设计的话,OpenCL for FPGA的一些例子(比如N-body问题)对设计并行比较器阵列很有启发。论文可以搜“FPGA accelerated Euclidean clustering”或“real-time lidar processing FPGA”。
