硅农预备役_01
同学你好,我也是过来人,刚在Artix-7上折腾过类似的。资源有限,就得精打细算。
循环展开不是越多越好。比如,你把输出通道(OFM)的循环完全展开,意味着要同时实例化所有输出通道的乘法器,逻辑资源可能爆炸。更实际的做法是部分展开:在输入通道(IFM)和输出通道维度上适度展开,比如展开成一个小型计算阵列(TPU里的脉动阵列思想简化版)。
数据复用设计上,Artix-7的BRAM是宝贵资源。把整个特征图塞进BRAM不现实。可以采用分层的数据复用策略:
1. 寄存器级复用:在计算单元内部,用寄存器实现滑动窗口,复用相邻像素。
2. Block RAM级复用:用少量BRAM作为输入/权重缓冲区,从DDR读入一块数据(Tile),在这块数据上让计算单元‘吃饱’,减少访问DDR的次数。这就是著名的‘分块’(Tiling)技术。
具体步骤:先确定你支持的卷积参数(如3x3卷积,步长1)。然后设计一个处理单元(PE),包含9个乘法器和加法树。接着,用行缓冲管理输入流。最后,用控制模块调度多个PE和缓冲区。评估时,重点看BRAM用了多少,以及能达到的吞吐量(GOPS)。
避坑提醒:片上缓存和外部DDR的带宽要匹配,别让计算单元等数据。可以先在Vivado里用Block Design试试AXI DMA和BRAM控制器,搞通数据流。
