数字电路入门者
你好,我也在做类脑视觉相关的项目,分享一下我的经验。核心思路是抛弃传统的同步、帧式处理架构,拥抱‘事件驱动’和‘无时钟’或‘准异步’的设计。
首先,数据入口是关键。DVS输出的是(x, y, pol, t)格式的地址事件,数据率变化剧烈。直接用传统同步FIFO可能会在事件爆发时溢出,或在空闲时浪费资源。一种思路是采用‘弹性FIFO’或基于寄存器链的小型缓冲池,配合背压信号(back-pressure)来控制数据流。更激进的做法是采用异步FIFO(使用握手协议,如req/ack),但设计复杂度高,作为毕业设计,我建议先用双缓冲(ping-pong buffer)结合流控信号来平滑数据流。
对于处理架构,不要想着把事件攒成一帧再做卷积,那样就失去了事件流的低延迟优势。可以考虑‘基于地址映射的累加更新’架构。具体来说:
1. 在FPGA的Block RAM里维护一个或多个‘表面’(Surface),比如当前时刻的卷积特征图。
2. 每个到来的事件,根据其坐标(x, y),直接索引到BRAM中对应的一个或多个位置(取决于卷积核大小)。
3. 根据事件的极性(pol)和可能携带的时间衰减信息,更新这些位置的值(做加法或减法)。这本质上是一个由事件触发的、稀疏的、随机的内存读写操作。
4. 设计一个高效的仲裁器来处理可能同时到达的多个事件对同一内存区域的访问冲突。简单的轮询(round-robin)或固定优先级可能就够用。
这样,特征图是随着事件流‘动态演化’的,你可以定期(比如每毫秒)或者当某个区域的累计值超过阈值时,输出一个处理结果,实现真正的异步处理。
注意事项:这种随机访问模式对BRAM的带宽要求高,如果事件率很高,可以考虑将特征图拆分到多个双端口BRAM中,根据坐标低位进行分区,以并行处理多个事件。另外,时间信息的处理(比如衰减)很重要,需要在更新值时加入时间衰减因子,这可能需要一个全局的时间戳计数器。
先从一个小型网络(比如一个5x5的滤波)开始验证这个架构,再慢慢扩展。希望对你有所帮助!
