2026年FPGA大赛只剩两周,用安路FPGA做实时视频拼接,4路720p输入DDR3带宽不够,怎么用行缓冲乒乓和分时复用硬挤?求具体架构

开放5 回答 53 浏览

我们队伍用安路国产FPGA做电赛题目,4路720p摄像头输入,要做实时视频拼接输出到HDMI。现在DDR3带宽算下来只有理论值的60%左右,4路同时读写直接爆了。队长说用行缓冲乒乓加DDR3分时复用能硬挤进去,但具体怎么划分时间片、行缓冲开多大、仲裁优先级怎么设,我们完全没底。有没有大佬做过类似架构?求具体参数和代码思路,救急!

分享:

5 个回答

  • Verilog新手村

    两周时间别想太多,先跑通最小系统。行缓冲就开2行,一行1280×2字节,乒乓用BRAM双口实现,写侧收摄像头数据,读侧按仲裁结果往DDR3发。时间片固定分成8个槽:4个写槽各占8us,4个读槽各占4us,读槽里HDMI读一行、拼接读一行轮着来。仲裁就写优先,读请求攒着等写槽结束再一起放行,丢帧靠读侧FIFO深度扛,开512×32位够撑两个行周期。带宽别算理论值,按实际测的60%再留20%余量,也就是总带宽的48%当可用,4路720p@60大概需要1.2GB/s,安路DDR3跑800MHz双通道应该能摸到。先这么干,跑起来再调。你们DDR3具体跑多少频率?

  • 数字系统新人

    别急着上乒乓,先算一笔账再动手。4路720p@60,每行1280×2=2560字节,行频约45kHz,单路像素率74.25MHz,数据率148.5MB/s。四路合计594MB/s写入,HDMI输出1080p@60要148.5MB/s,拼接逻辑读回还要594MB/s,总流量约1.34GB/s。DDR3理论带宽按800MHz、16bit算就是1.6GB/s,但刷新损耗约7%,读写切换损失约10%,实际可用大概1.3GB/s,确实紧。你的60%是什么时候测的?如果是不带刷新纯读写测试,那实际会更低。行缓冲乒乓的核心是让DDR3端口永远顺序读写,避免随机寻址。每路开2行缓冲,写侧填满一行就发起burst写,长度256字节,读侧提前预取下一行,仲裁用固定优先级给写,读请求在写间隙插入。时间片别固定死,用状态机动态判断:写FIFO半满优先,读FIFO快空才插读。这样带宽利用率能到85%以上。另外,安路FPGA的DDR3控制器IP一般支持自动刷新,别自己管刷新,让IP处理。最后留20%余量,也就是把输入帧率限制到48Hz,或者输出降到50Hz,别硬冲60。代码思路:写侧用两个计数器分别管行号和列号,行号奇偶决定写入bank,列号连续burst;读侧同理。仲裁就是一个case语句,状态0-3写,状态4-6读,状态7空闲。你们现在DDR3跑多少位宽?如果是32bit会宽裕很多,16bit就真的得抠时序了。

  • 电子爱好者

    说个容易翻车的点:行缓冲乒乓不是万能的,如果DDR3控制器IP的写读切换有固定死区,你的时间片划分可能白搭。安路有些型号的DDR3控制器在写转读时会有额外的tWTR延时,大概3-4个时钟周期,如果仲裁切换频率太高,这些死区累加起来带宽损耗很大。常见做法是让写burst长度尽量长,比如一次写512字节而不是256字节,减少切换次数。另外,你们有没有考虑过把4路输入先做MIPI或BT1120转并行,再进FPGA?如果摄像头是MIPI,接收IP本身会占用不少逻辑资源,留给行缓冲的BRAM可能不够。建议先查安路手册里BRAM容量,720p一行2560字节,2行需要5120字节,4路就是20KB,加上FIFO和拼接缓冲,总共至少30KB,如果型号是EG4系列应该够,如果是更低端的可能紧张。还有,仲裁别用固定优先级,写死会饿死读。用轮询+写优先的混合:每个时间片开始先检查写FIFO,有数据就写,没有就切读,读侧用轮询保证三路(HDMI、拼接、预留)公平。最后两周,建议先拿单路+单DDR3测试带宽,跑通后再扩到4路,别一上来就全接。你们用的是安路哪款型号?BRAM总量多少?这个决定行缓冲能不能开到3行。

  • 电子萌新小张

    先把4路输入的行缓冲都开到2行,够用。DDR3仲裁别搞复杂时间片,直接写优先,读侧用FIFO兜底,写满一行就发一次长burst,读请求在写间隙插空。安路DDR3控制器写转读有死区,所以burst长度往大了设,512字节起步。两天内跑通这个最小框架,剩下时间全用来调FIFO深度和仲裁时序,别纠结理论带宽。

  • 电路板新手

    个人感觉你们最大的坑不是带宽,是仲裁状态机的切换开销。别用固定时间片,那玩意儿一遇到行场消隐就浪费。建议每路输入独立一个写请求FIFO,存满一行就置位,仲裁器轮询这4个flag,谁满了先写谁,写的时候一次burst拉满到1KB。读侧单独开一个读请求队列,HDMI和拼接逻辑要哪一行就预取哪一行,读请求只在没有写请求的时钟周期里插入。行缓冲开3行:一行在收、一行在等仲裁、一行在写DDR3,这样能把写DDR3的延时完全藏掉。带宽按实际测的60%再打八折算,如果还超,就把4路输入先降帧率到50Hz,肉眼基本看不出区别。你们DDR3跑的是533还是800?这个对burst长度和预取策略影响很大,先确认一下再调参数。

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

提问者

FPGA小学生查看主页
浏览「其他」

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

相关问题

同分类

提问建议

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