我们队三个人,两个只会写状态机和UART,一个刚学完Verilog语法。今年电赛FPGA题看起来要实时处理信号,前三天如果全花在调ADC和FFT IP上,后面算法和显示肯定来不及。想问问有经验的人,电赛这种限时任务,时间应该怎么切块?前两天先搭什么框架才能保证最后能交上一个能跑的作品?
2026年电赛FPGA赛题公布后,队伍发现要求「自适应滤波+实时频谱」,前三天该怎么分配时间才不至于最后一天通宵改代码?
6 个回答

先说个容易被忽略的点:电赛这种限时题,最怕的不是算法难,是「没有能演示的东西」。所以前三天我建议按「可交付倒推」来切,而不是按技术模块切。
第一天上午别急着碰ADC和FFT IP,先把整条链路的骨架用假数据跑通:一个产生正弦/含噪信号的假数据源,接到你的滤波模块,再接到频谱计算,最后接到显示或串口输出。哪怕滤波一开始只是直通、频谱只是取绝对值,只要数据能从头流到尾,你就有了一条能改的骨架。这一步的价值在于:后面所有模块都是往这个骨架里替换,而不是从零拼。
第一天下午到第二天,集中攻ADC采样和FFT IP这两个「卡脖子」环节。这里有个取舍:如果ADC调不通,果断先用板上DAC或ROM里的预存数据顶上,别死磕。FFT IP优先用厂商提供的例化模板,先保证能出结果,精度和吞吐后面再优化。
第二天后半到第三天,才是自适应滤波算法真正落地的时间。LMS这类算法结构简单,但定点位宽和收敛步长要试,建议留出半天专门调参数。显示部分如果时间紧,串口打印频谱数值也能交差,不一定要上VGA。
关键是把「能跑」和「跑得好」分成两个里程碑,前者必须在前三天结束前达成。你们队三个人可以这样分:一人守数据链路和顶层,一人攻ADC+FFT,一人写滤波和显示,每天固定时间合一次。
顺便问一句,你们板子上ADC是外置芯片还是FPGA自带的,这个会直接影响第一天要不要先绕开它。

先说个反直觉的:你们队最大的风险不是算法难,而是三个人里没人能独立把一条数据通路从头跑到尾。所以前三天别按「ADC→FFT→算法→显示」这种教科书顺序切,按「谁能交付什么」切。第一天上午开个短会,把任务拆成三块互不阻塞的:采样前端、频谱计算、显示/串口输出。两个会状态机和UART的人,一个去啃ADC时序,另一个直接把UART输出和显示做掉——注意,显示这块可以先用固定假数据驱动,先让屏幕能刷新,后面换真数据只是改接口。刚学Verilog的那个,别让他闲着,让他用ROM造一段含噪正弦,把FFT IP的例化模板跑通,输入输出都用文件比对验证。这样第一天结束时你们应该有一条「假数据→FFT→UART」的链路,哪怕ADC还没通。第二天集中攻ADC,如果到下午还没出波形,果断切方案:用板上DAC自环或者预存采样数据顶上,把真ADC降级成加分项。第三天开始才碰自适应滤波,先做最简单的LMS定点版本,抽头数别贪多,8到16个够演示就行。这里容易踩的坑是:自适应滤波的收敛速度和步长因子强相关,定点化以后很容易发散,建议先在MATLAB或Python里把定点行为仿真一遍再上板。追问一句,你们板子上有现成的DAC或者足够大的BRAM吗?这直接决定备用方案好不好走。

我按一条主线说,就是「让每一步都留下能演示的东西」。电赛限时任务和平时做项目最大的区别在于,评委只看你最后交上去那一刻能不能跑,中间你调得多优雅没人知道。所以时间切块的核心原则是:任何时刻,工程里都要有一个能编译、能上板、能出画面的版本,哪怕它是假的。
具体到你们这个题,前三天我建议这样切。第一天上午不写一行算法,先把工程骨架搭起来:顶层模块、时钟、复位、一个假数据发生器、一个输出模块。假数据发生器可以用计数器加查找表造一个正弦,输出模块先接UART打印数值或者接VGA/HDMI画个波形。这一步的意义在于,你们三个人从第一天起就有共同接口,谁改了自己的模块都能立刻看到整体有没有崩。
第一天下午到第二天,主攻ADC和FFT这两个硬骨头,但要有止损线。ADC调不通是电赛最常见的卡点,常见原因是采样时钟相位、引脚约束或者电平标准没配对。给自己定个规矩:如果第二天中午ADC还出不来干净波形,立刻切到备用数据源,把ADC当加分项往后放。FFT这边优先用厂商IP的例化模板,别自己手写蝶形运算,除非你们有人非常熟。IP配置里注意数据位宽和缩放因子,溢出是很隐蔽的坑。
第二天下午到第三天,做自适应滤波。这里给个取舍:LMS比RLS好实现得多,定点化也更容易收敛,演示效果对评委来说够用。抽头数、步长、数据位宽这三个参数先在Python里扫一遍,找到能明显看出滤波前后频谱差异的组合,再搬到FPGA。很多时候算法本身没问题,是定点位宽截断把收敛性搞没了。
最后留半天做联调和演示脚本,把「按哪个键切哪种模式」这种细节固定下来,别到最后一天还在改交互。你们现在FFT IP用的是哪家的、有没有现成例程?这个会明显影响第二天的节奏。

我先不聊具体怎么切三天,先聊一个更底层的问题:你们队现在的能力结构,决定了前三天不能按技术模块切,只能按「接口」切。两个会状态机和UART的人,其实是你们最大的资产,因为电赛最后能拿分的东西,往往不是算法多牛,而是数据能不能稳定地从A点走到B点。那个刚学完Verilog的,短期内产不出可靠模块,但可以当「验证工」,专门写testbench和造激励数据。
所以我的主线是:第一天结束前,必须有一个三人都能独立调用的接口约定。比如统一用valid/ready握手,数据位宽、定点格式、帧头帧尾全部写死在一张纸上贴墙上,谁都不许私自改。这一步看着像形式主义,但它决定了后面两个人并行改代码时不会互相踩。
第二天才是真正攻ADC和FFT。这里有个取舍很多人没想明白:ADC调不通的概率远高于FFT,因为FFT有厂商IP和例程,ADC却常常卡在时钟相位、引脚约束、采样沿这些看不见的地方。所以第二天上午ADC必须设硬止损点,比如下午三点还没出稳定波形,立刻切到ROM预存数据或者板上DAC自环,把整条链路先跑通。这不是放弃,是把风险从「可能全盘崩」降级成「精度差一点但能演示」。
第三天留给自适应滤波本身。注意,自适应滤波在FPGA上落地,很多队伍会掉进「先推公式再写RTL」的坑。更实际的做法是先做一个最简的LMS或者NLMS定点版本,系数更新用移位代替乘法,先把收敛行为在MATLAB或Python里跑出来,再把定点参数搬进RTL。频谱显示反而可以放到最后半天,因为它是纯展示层,改起来最快。
一句话收束:前三天你们要保的不是算法先进,而是「任何时刻都有一个能上板出画面的版本」。你们现在用的板子是哪个系列的,ADC是外置还是板上集成的?这个会直接影响要不要第一天就碰采样。
补一句,通宵改代码这件事,本质上是前几天没留下可回退的版本。建议每天收工前用Git打一个tag,哪怕只是本地仓库,最后一天你至少知道哪个版本是能跑的。

别按模块切,按「谁能独立交付」切。第一天必须有一条假数据到串口或屏幕的完整链路,ADC和FFT放第二天集中啃,设死止损点。刚学Verilog的那个别碰算法,去写testbench和造激励。

我换一个角度说,可能跟前面几位不太一样:你们最大的敌人不是时间不够,是「三个人对同一个信号的理解不一致」。
自适应滤波加实时频谱这种题,最怕的是采样前端的人以为数据是Q15,算法的人按浮点写,显示的人又按无符号画图,最后联调时谁都不认账。所以前两天先别急着调ADC,先花半天把数据格式、帧结构、时钟域全部定死,写成一页纸。这页纸定下来之后,三个人才能真正并行,否则就是三个人一起在同一个坑里打转。
框架上我建议先搭一条纯假数据的通路:ROM产生含噪正弦,过一个直通模块,再进FFT,最后出到串口或者VGA。这条通路跑通的意义是,后面ADC通了只是换数据源,算法写好了只是换中间模块,显示永远是最后一个被替换的。
你们板子的采样率打算定在多少,这个数直接决定FFT点数和后面算法能不能实时。
发表回答
登录后可在本页底部提交回答