我们队三个人,两个只会写Verilog基本语法,一个负责上位机。板子是安路EG4S20,采集8路DS18B20,通过UART每100ms发一帧给电脑画曲线。仿真都正常,上板后上位机经常少几个点,示波器看TX波形也有毛刺。有人说波特率分频误差大,有人说FIFO写满覆盖了,还有人说是跨时钟域没处理。赛前一个月,该怎么定位到底哪一环出的问题?
2026年电子设计竞赛FPGA赛道,队伍想用国产安路EG4S20做「多路温度采集+上位机曲线显示」,赛前一个月才发现串口丢包,是波特率误差还是FIFO深度不够?
5 个回答

先别急着归因,拿示波器量一下TX上相邻两个位的实际宽度,算出真实波特率和目标的偏差百分比,超过2%到3%基本就能定性了。毛刺多半是时序或引脚约束没做好,顺手也查下。这一步半小时能做完吧?

先别急着动代码,拿示波器量一下 TX 上相邻两个位的实际宽度,算出真实波特率和目标值的偏差百分比,超过 2%~3%基本就能定性是分频误差。毛刺顺带查一下引脚约束和时序。半小时能做的事,比三个人猜一下午强。

你们这个现象我更倾向先怀疑分频误差,因为「仿真正常、上板丢点、TX 有毛刺」这三件事凑一起,很像波特率偏了导致上位机偶尔判错位。做法是别改代码,先把系统时钟和 UART 分频参数对一遍:安路 EG4S20 上你们跑的是多少 MHz 晶振、分频系数取整后实际波特率是多少、和目标 115200 差多少 ppm。常见坑是拿 50M 去除得到非整数直接截断,误差累积到一帧十个字节就崩。算完再上示波器验证,两者对得上就基本定案,对不上再去查 FIFO 和跨时钟域。你们现在 UART 的时钟源和分频系数是怎么定的?

一个月时间,建议按「先证伪、再深挖」的顺序走,别三个人分头改三个地方,最后谁也说不清是哪个改动起了作用。
第一步做定量判断:把 8 路 DS18B20 的采集时钟和 UART 发送时钟列出来,如果两者不同源,那跨时钟域这条就先挂上号。DS18B20 单总线时序对微秒级延时敏感,很多人用计数器硬延时,主频一变时序就飘,读回来的温度本身就是错的,这时候丢点根本不是串口的问题。
第二步才是 FIFO。8 路每 100ms 一帧,数据量其实很小,FIFO 写满覆盖这种情况通常发生在你用了异步 FIFO 但满标志没接回写侧,或者写使能没做反压。查法很土但有效:把满标志引到一个 LED 或者计数器上,跑十分钟看它有没有翻转过,翻过就是深度或反压的问题,没翻过就排除。
第三步看上位机。串口助手能收到完整帧、你们自己的解析程序少点,那问题在帧头帧尾对齐或者超时切包逻辑,不在 FPGA。
毛刺这条单独说一句:如果毛刺出现在帧边界而不是数据位中间,大概率是使能信号和移位寄存器更新撞在一起,加一级寄存器打拍通常能压掉。个人感觉你们三个人里至少要有一个人专门盯示波器抓波形,别都闷头改代码。你们上位机是自己写的还是用的现成串口工具?这个决定了第三步要不要花时间。

先按最小可行路径排个序:第一步算分频误差,第二步查 FIFO 满标志和跨时钟域,第三步才动上位机解析。理由很直接:前两步不用改架构,半小时到两小时能出结论,上位机一改就容易把水搅浑。
分频误差先手算。EG4S20 开发板上常见 24M 或 50M 晶振,拿系统时钟除以目标波特率得到分频系数,取整后反算实际波特率,看偏差多少 ppm。UART 接收端一般能容忍 2% 到 3% 的累计偏差,但一帧十个字节连续发,误差会累积,偏到边界就丢字节。算完别停在纸面,用示波器量 TX 上相邻两个位的实际宽度,反推真实波特率,和手算对得上就基本定案。这一步能解释「仿真正常、上板丢点」的典型现象,因为仿真里分频系数往往取的是理想值。
如果波特率没问题,再看 FIFO。8 路每 100ms 一帧,数据量很小,FIFO 写满覆盖通常不是深度不够,而是满标志没接回写侧做反压,或者写使能没做握手。查法很土但有效:把满标志引到一个计数器或 LED,跑十分钟看它翻不翻,翻过就是反压问题,没翻过就排除。跨时钟域同理,先确认采集时钟和 UART 发送时钟是否同源,不同源才需要同步器,同源就不用自己吓自己。
最后才轮到上位机。串口助手能收到完整帧、自己写的解析程序却少点,那问题在解析逻辑,不在 FPGA。顺序别反,反了就是三个人分头改三个地方,最后谁也说不清是哪个改动起了作用。你们现在系统时钟和分频系数具体是多少?
发表回答
登录后可在本页底部提交回答