码电路的张同学
我们当年也这么干过,最后延迟压到了8ms左右。核心就一句话:别让数据在片外DRAM里来回倒腾。很多新手一上来就想着用DDR缓存整帧图像,再读出来处理,这光读写延迟就奔着几毫秒去了,根本没法玩。我们的做法是,摄像头数据进来(比如OV7725的RGB565),直接用FPGA内部的FIFO或者Block RAM做行缓冲,实现一个“流式处理”流水线。第一级流水:色彩转换(如果需要灰度)和二值化,这个可以像素级并行,每个时钟周期处理一个像素,二值化阈值可以动态调整。第二级流水:边缘提取,我们用的是改进的扫描线法,不是等整帧,而是攒够几行就开始扫,用几个并行的窗口同时检测左右边缘,这样边缘坐标是“实时”出来的。第三级流水:中线拟合,边缘点坐标攒够一批(比如一行里的)就送进一个流水线的最小二乘模块,这个模块也可以深度流水,做到每个时钟周期吞入一对坐标,吐出更新后的拟合参数。整个流水线就像个“拉链”,像素从左边流入,中线参数从右边流出,中间几乎没有停顿。关键是要仔细平衡各级流水线的处理时间,别让某一级成为瓶颈。资源方面,主要消耗Block RAM做行缓存和FIFO,逻辑资源其实用得不多。选型上,Artix-7系列中等规模的芯片就足够,性价比高。注意时钟频率别太低,我们当时用100MHz主频,一帧640480的图像,理论像素时钟就差不多10ms了,但因为我们流式处理,实际输出结果的延迟远小于一帧时间,大概在几行图像的时间量级。
