中年|小梅哥FPGA时序分析笔记(一)学了4年才学会——废话连篇


久不见我 , 我又回来了 , 哈哈哈哈 。
这么取名字 , 大概率会被人家笑话吧 , 一个呆头呆脑哈里哈气的憨厚形象跃然纸上 。 不过呢 , 仗着自己脸皮不薄 , 又被人称为IT直男 , 也就这么写了 。
自己是从2014年开始 , 每天和FPGA打交道的 , 刚开始嘛 , 做的都是入门级的功能 , 写的都是入门级的程序 , 跑跑VGA、写写SPI也就差不多了 , 如果用到SDRAM , 也顶多跑个100MHz到顶了(虽然这个频率不高 , 但是不注意设计 , 即使是100M也有跑不动的时候) , 很少有关注性能的 。
虽然不关注性能 , 但是也还是遇到过很多次因为性能问题导致设计不稳定的情况 , 典型的例子就是之前有开发一个基于CY7C68013芯片的USB传输模块 , 写出来的程序 , 在不同的板子上工作 , 有的能正常通信 , 但是有的在通信过程中就会出现数据误码的情况 , 比如理论上连续的两个数据应该是0x5555 , 0xAAAA , 但是实际收到的时候 , 可能就变成了0x5555 , 0xEAAA 。
后来在基于CYUSB3014的USB3.0芯片上也同样遇到了这个问题 , 网友用我们的板子 , 用我们的程序一切都OK , 但是把程序移植到自己的板子上去 , 就会经常出现误码的问题 。 网友很无语 , 我也很无奈(PS:这些问题现在都已经帮客户解决了 , 毋庸担心) 。

再有一个典型的例子就是 , 使用ADV7123芯片完成数字RGB时序到模拟VGA信号的转换时候 , 必须要将输送给ADV7123芯片的时钟信号先取反再输出 , 否则当在VGA显示屏上显示时 , 就会出现图像的轮廓处出现大量杂色的情况(不知道自己是不是可以用这个思路去做个轻量级的边缘检测系统 , 哈哈) , 不仅仅是ADV7123 转VGA , 即使是普通的RGB接口的TFT屏 , 买回来的液晶厂家不一样 , 批次不一样 , 也会存在这样的现象 。 到最后就是 , 同一个程序 , 用在不同批次的显示屏上 , 有的需要将输出时钟先取反 , 有的又不能取反 。 且不说客户使用体验 , 就是自己 , 看到这种现象 , 也是钢牙崩碎不能忍 。
所以 , 这一切的一切 , 问题到底在哪里呢?当时的我就知道 , 答案是时序出了问题 。 可是 , 问题该怎么去解决呢?
中年|小梅哥FPGA时序分析笔记(一)学了4年才学会——废话连篇
本文插图

一提起时序 , 又想起了经常就会有网友跑过来问我 , 基本原话就是“小梅哥 , 我现在准备开始学习FPGA了 , 但是听别人说 , 做FPGA开发 , 最重要的就是时序 , 请问您有时序方面的资料吗?“这样的问题 , 几乎每年都会遇到几次 , 问题内容惊人相似 , 我的答案也是惊人的客(可)气:没有 。

为啥这么回答呢?一是因为哪怕是在不久之前(或者说写本文之前) , 我都确实是真的没有这方面的资料 , 或者说没有能拿得出手的资料 , 所以不怕丢面子 , 实话实说罗 , 可以说 , 到目前为止 , 网上能找到的真正能够让人一看就懂 , 真正能用的时序处理方面的资料确实比较的少 , 希望通过网络博文之类的学会时序分析和约束的细节方法 , 难度很大;二是我认为 , 刚开始学习FPGA , 一上来就问时序这些东西 , 有点心高急躁 。
要学会FPGA , 在时序之前 , 还有超级多的东西要学习呢 , FPGA可编程原理、Verilog基本语法、基于FPGA的系统设计常见方法、调试技巧、验证手段等 , 这些不学好 , 时序的资料看十遍也不一定能消化的掉 。 第三嘛 , 则是感觉大家的认知可能有一定的偏差 , 单就“时序”这两个字来说 , 其涉及的内容还是比较广的 , 从简单的说 , UART协议里面 , 一个起始位、8个数据位、1个停止位可以算作是时序定义了(当然这里更应该说是协议的时序) , 一个DAC芯片 , 使用SPI接口 , MOSI接口上输出16位数据 , 高4位为控制字 , 低12位为需要输出的电压值的数字编码也可以算作是时序(毕竟器件的规格书里面用的是timing这个词) 。


推荐阅读