电子爱好者小李
遇到过同样的问题,后来发现是采样点太靠边了。分享我的调试流程:
首先,仿真阶段不能只看功能仿真,要做时序仿真。用Vivado跑一下post-synthesis或post-implementation的仿真,看看有没有建立保持时间违规。如果有时序违例,那板上运行肯定不稳定。
其次,实际调试时,我强烈建议用ILA。但要注意,ILA本身会占用资源,可能会改变布局布线结果,所以有时候加了ILA问题就消失了(海森堡bug)。遇到这种情况,可以尝试用VIO虚拟输入输出,手动控制测试向量,比ILA更轻量。
关于亚稳态,UART接收模块一定要用同步器。但同步器会引入延迟,所以起始位检测要用过采样方法。我通常用16倍波特率时钟采样,连续检测到多个低电平才确认起始位,这样抗干扰能力强。
板级问题也不容忽视。Basys3用的是USB转串口,驱动和串口助手配置要检查。确保波特率、数据位、停止位、校验位和代码一致。还有一个常见坑:USB线供电不稳定可能导致电平波动,可以尝试给板子单独供电。
最后,数据偶尔出错,可能是偶发性亚稳态。可以在代码里加一些冗余设计,比如对接收到的数据做两次采样比较,不一致就丢弃。虽然效率低点,但调试阶段很有用。
总结一下:先用时序仿真排除明显时序问题,再用ILA抓实际波形,最后检查硬件和配置。耐心点,UART看着简单,但细节很多。
