
时序图这个东西在FPGA开发里属于那种平时不画一画就急的活儿。写状态机要画、调接口要画、跟硬件同事对齐信号行为要画、写设计文档更要画。很多人第一反应是打开Visio或者 draw.io拖几个方框、拉几根线凑合能用但一旦信号多起来、时钟周期要对齐、要标注建立保持时间窗口这些通用绘图工具就开始拉胯了——线对不齐、周期不等宽、改一处全乱套。TimeGen 就是专门解决这个痛点的工具它把时间轴作为第一等公民画出来的波形图周期精确、信号对齐、改起来还方便。这篇内容面向刚接触 FPGA 或者一直用通用工具凑合画时序图的工程师把 TimeGen 3.2 从安装、界面、画图、导出到实际项目里怎么用完整走一遍顺带把我在实际使用中踩过的坑和总结的技巧都摊开讲。1. 为什么FPGA工程师需要一个专门的时序图工具1.1 通用绘图工具画时序图的三个硬伤先说清楚为什么不用 Visio、draw.io、PPT 这些工具。我早期做项目的时候也是 PPT 画时序图画完自我感觉良好直到有一次评审硬件同事指着图问我你这个 CLK 周期和 DATA 的建立时间是什么关系我一看完蛋PPT 里那几根线是我手动拖的周期根本不等宽DATA 相对 CLK 的相位也是随手摆的压根没有时间刻度概念。通用工具的第一个硬伤就是没有时间轴概念。它们本质上是矢量绘图工具你画的是图形不是时间关系。两根线之间隔多远完全取决于你鼠标拖了多远跟真实的时间比例没有任何关系。信号一多A 信号和 B 信号之间的时序关系就全靠脑补。第二个硬伤是周期对齐困难。时序图里最基础的要求就是时钟周期等宽、数据信号跟时钟边沿对齐。在通用工具里你要么手动复制粘贴一堆等宽线段要么用对齐工具一点点调信号一多就是灾难。改一个周期后面全得重来。第三个硬伤是修改成本极高。项目评审完老板说这个信号往前挪半个周期你在 PPT 里就得把相关的线、箭头、标注全部重新拖一遍稍不注意就漏改图就自相矛盾了。1.2 TimeGen把时间变成可计算的对象TimeGen 的设计思路跟通用工具完全不同。它把每一个信号都建模成一条基于时间刻度的波形你定义的是这个信号在第几个周期拉高、持续几个周期、第几个周期拉低而不是这条线画在哪个像素位置。这个差别是本质性的。打个比方通用工具画时序图就像用铅笔画画你画的是线条的位置TimeGen 画时序图就像用 Excel 做表格你填的是单元格里的数值位置是自动算出来的。前者自由但不可控后者约束多但精确。具体来说TimeGen 里你可以设置时钟周期、信号的高低电平持续时间以周期或纳秒为单位、信号的相位偏移工具会自动帮你把波形渲染出来。改的时候只需要改数值波形自动重绘对齐关系永远保持正确。这就是为什么我说 FPGA 工程师应该人手一个——它省下的不是画图时间是反复改图、反复对齐、反复被评审挑刺的时间。1.3 哪些场景下TimeGen的收益最明显不是所有时序图都值得上 TimeGen。画个简单的两信号握手PPT 两分钟搞定没必要开工具。但下面这几类场景TimeGen 的优势会非常明显状态机时序图一个状态机动辄七八个状态、十几个信号状态之间的跳转还跟时钟边沿强相关通用工具画这个基本是自虐。总线协议时序图SPI、I2C、UART、AXI 这类协议信号之间的建立保持关系是硬性要求画错了会误导实现必须精确。跨时钟域信号图涉及异步 FIFO、握手同步的场景信号在不同时钟域下的行为要画清楚时间刻度必须准确。设计文档和评审材料给硬件、软件、测试同事看的图精确性直接影响沟通效率画错一张图可能导致下游理解偏差。教学和笔记自己学习协议的时候画一遍比看十遍文字描述都管用。2. TimeGen 3.2的安装与界面速通2.1 安装过程与版本选择TimeGen 3.2 的安装包不大几十兆安装过程也没什么坑一路下一步就行。这里重点说版本选择的问题。TimeGen 有多个版本3.2 是很多工程师用得比较多的一个版本界面成熟、功能稳定。网上流传的版本比较多建议从可信渠道获取安装包安装前先确认一下文件完整性。安装路径建议不要放在中文目录下虽然 3.2 对中文路径的兼容性比早期版本好很多但导出文件、临时文件在某些系统环境下还是可能出问题。我一般习惯装在D:\Tools\TimeGen这种纯英文路径下省心。安装完成后第一次启动界面语言默认是英文。如果你更习惯中文界面可以在设置里切换但说实话TimeGen 的英文界面用词都很简单Signal、Clock、Period、Delay 这些看两眼就熟了没必要折腾汉化。提示安装过程中如果杀毒软件报毒先确认安装包来源是否可信。如果确认来源没问题把安装目录加入白名单即可避免工具运行中被拦截导致功能异常。2.2 主界面各区域的功能划分TimeGen 3.2 的主界面布局很清晰从上到下、从左到右大致分几个区域顶部菜单栏和工具栏文件操作、编辑、视图、信号操作、导出等功能都在这里。工具栏上最常用的几个按钮是新建信号、添加时钟、添加总线、导出图片建议先熟悉这几个。左侧信号列表区所有你添加的信号都列在这里每个信号一行显示信号名、类型、颜色。点击某个信号可以选中它然后在右侧编辑它的属性。信号多的时候这个列表就是你的图层管理器。中间波形绘制区这是主战场所有波形都在这里显示。横轴是时间纵轴是信号。你可以在这里直接拖动信号、调整周期、添加标注。右侧属性编辑区选中信号后这里显示该信号的详细属性包括信号名、类型时钟/信号/总线、周期、相位、高低电平持续时间等。改数值就在这里改。底部时间轴显示当前的时间刻度可以缩放、平移方便查看不同时间范围的波形。刚上手的时候建议先花十分钟把每个区域点一遍知道什么东西在哪里后面画图效率会高很多。2.3 新建工程与基础参数设置新建工程后第一件事是设置时间基准。TimeGen 里可以设置时间单位ns、us、ms 等和网格大小。这个设置很关键因为它决定了你画图时的最小时间粒度。我的习惯是如果画的是 RTL 级时序时间单位设成 ns网格设成时钟周期的一半或者四分之一。比如时钟是 100MHz周期 10ns网格就设成 5ns 或者 2.5ns这样画信号的时候能精确对齐到时钟边沿。设置好时间基准后先添加时钟信号。TimeGen 有专门的时钟信号类型你只需要设置周期和占空比它会自动生成连续的时钟波形。占空比默认 50%大多数场景够用特殊场景比如某些 DDR 接口可以调。时钟加好后再逐个添加数据信号、控制信号。每个信号都可以设置颜色建议按功能分组配色比如时钟用黑色、数据用蓝色、控制用红色、总线用绿色这样图看起来层次分明评审的时候别人一眼就能看懂。3. 从零画一张SPI时序图的完整过程光讲界面没意思直接拿一个实际例子走一遍。SPI 是 FPGA 里最常用的接口之一时序图也是面试和文档里的常客。我们就以 SPI Mode 0CPOL0CPHA0为例画一张完整的 SPI 读写时序图。3.1 信号规划与时间刻度设定SPI Mode 0 的核心信号有四个SCLK时钟、CS_N片选低有效、MOSI主出从入、MISO主入从出。Mode 0 的特点是时钟空闲为低数据在时钟上升沿采样在下降沿变化。先规划时间刻度。假设 SCLK 频率是 10MHz周期 100ns。一个完整的 SPI 传输假设是 8 位数据那就是 8 个时钟周期总共 800ns。再加上 CS_N 拉低和拉高的时间整个图大概覆盖 1000ns 左右。在 TimeGen 里时间单位设成 ns网格设成 50ns半个时钟周期这样画数据变化点的时候能精确对齐到时钟边沿。信号规划如下信号名类型颜色说明SCLK时钟黑色10MHz空闲低CS_N信号红色低有效传输期间拉低MOSI信号蓝色主机输出下降沿变化MISO信号绿色从机输出下降沿变化3.2 逐个信号绘制与对齐技巧先加 SCLK。在 TimeGen 里添加时钟信号周期设 100ns占空比 50%相位设成让第一个上升沿出现在 CS_N 拉低之后。这里有个细节Mode 0 下CS_N 拉低后第一个 SCLK 上升沿才采样第一位数据所以 SCLK 的第一个上升沿要稍微延后一点。然后加 CS_N。CS_N 在传输开始前拉低传输结束后拉高。在 TimeGen 里选中 CS_N设置它在第 0ns 为高第 100ns 拉低第 900ns 拉高。这样 CS_N 的低电平窗口就覆盖了整个 8 个时钟周期。接着加 MOSI。MOSI 的数据在 SCLK 下降沿变化在上升沿被采样。所以每一位数据的持续时间是一个完整的 SCLK 周期变化点对齐到下降沿。在 TimeGen 里你可以把 MOSI 设成总线类型然后逐段设置每一位的值。比如第 1 位是 1第 2 位是 0以此类推。MISO 同理只是数据方向相反。画的时候注意 MISO 的变化点也要对齐到 SCLK 下降沿。对齐技巧TimeGen 里有个很好用的功能叫对齐到网格打开后你拖动信号边沿的时候会自动吸附到最近的网格点。配合前面设好的 50ns 网格画出来的信号边沿天然对齐到时钟边沿不用手动微调。3.3 标注、总线与相位关系的处理信号画完后加标注。TimeGen 支持在波形上添加文字标注和箭头。SPI 时序图里我一般会标注这几个关键点第一个 SCLK 上升沿标注采样第1位MOSI 的变化点标注下降沿变化CS_N 拉低的位置标注传输开始CS_N 拉高的位置标注传输结束总线信号的处理是 TimeGen 的强项。MOSI 和 MISO 如果按位画8 位就是 8 段看起来比较碎。你可以把它们设成总线类型然后给每一段赋一个值0 或 1TimeGen 会自动在波形上显示数值。如果传输的是字节数据还可以直接显示十六进制值比如 0xA5、0x3C看起来更直观。相位关系是 SPI 时序图的关键。Mode 0 下数据在下降沿变化、上升沿采样这个相位关系必须画对。TimeGen 里你可以通过调整信号的变化点位置来精确控制相位。画完后放大检查一遍确认每个数据变化点都在 SCLK 下降沿每个采样点都在上升沿。注意SPI 有四种模式Mode 0-3CPOL 和 CPHA 的组合不同时序图差别很大。画之前先确认你用的是哪种模式别画错了误导实现。Mode 0 和 Mode 3 最容易混区别就在时钟空闲电平和采样边沿。4. 让时序图活起来的进阶技巧4.1 用延迟和偏移表达真实时序关系实际项目里的时序图信号之间往往不是理想对齐的存在各种延迟和偏移。比如时钟到数据的输出延迟Tco、数据到时钟的建立时间Tsu和保持时间Th。这些在 TimeGen 里都可以精确表达。TimeGen 里每个信号都可以设置延迟Delay和偏移Offset。延迟是指信号相对于参考点的时间偏移偏移是指信号内部的相位移动。比如你要表达数据在时钟上升沿之后 2ns 才有效就可以给数据信号设一个 2ns 的延迟。建立保持时间的表达稍微麻烦一点。TimeGen 本身没有专门的建立保持窗口标注功能但你可以用阴影区域或者双箭头标注来手动标。我的做法是在时钟边沿两侧各画一个窄的阴影区分别标注 Tsu 和 Th然后在旁边用文字说明具体数值。虽然不如专业时序分析工具那么自动但对于文档和沟通来说足够了。4.2 信号分组与层次化展示信号一多图就容易乱。TimeGen 支持信号分组你可以把相关的信号放在一个组里折叠起来或者用不同的背景色区分。比如画一个 AXI 总线时序你可以把 AW、W、B、AR、R 五个通道分别分组每个通道内部的信号放在一起图看起来就清爽很多。分组还有个好处是便于复用。你可以把一个画好的信号组保存成模板下次画类似协议的时候直接调用改改参数就行。我手里就存了好几个常用协议的模板SPI、I2C、UART、AXI-Lite画新图的时候直接套效率翻倍。层次化展示是另一个技巧。对于复杂的时序图你可以先画一个顶层概览只显示主要的控制信号和总线然后对每个关键阶段单独画一张放大图展示细节。TimeGen 支持多页工程你可以把概览和细节放在不同的页里导出的时候一起导出文档结构很清晰。4.3 导出格式选择与文档嵌入TimeGen 支持导出多种格式PNG、JPG、BMP、EMF、SVG 等。选哪个格式有讲究PNG最通用适合放进 Word、PPT、网页。建议导出时选高分辨率不然放大后模糊。SVG矢量格式无限放大不模糊适合放进 LaTeX 或者需要高质量打印的文档。但有些老版本 Word 对 SVG 支持不好嵌入后可能显示异常。EMFWindows 增强型图元文件矢量格式在 Office 系列里兼容性最好推荐给经常写 Word 文档的工程师。BMP无损位图文件大一般不用除非有特殊需求。导出的时候还有个细节背景色。TimeGen 默认背景是白色导出 PNG 的时候如果背景透明放进深色主题的文档里会很难看。建议导出时选白色背景或者根据文档主题调整。嵌入文档的时候建议给每张图加一个图号和图注比如图 3-1 SPI Mode 0 读写时序。图注里可以简要说明这张图表达的核心时序关系方便读者快速理解。5. 实际项目中的踩坑与经验总结5.1 时间单位混乱导致的低级错误这个坑我踩过不止一次。TimeGen 里时间单位是可以切换的ns、us、ms 都支持。有一次画一个 I2C 时序图I2C 的标准速率是 100kHz周期 10us。我习惯性地把时间单位设成了 ns然后周期填了 10结果画出来的图周期是 10ns相当于 100MHz完全不对。更坑的是TimeGen 不会报错它只是按照你填的数值画图。图看起来很正常但时间刻度完全错了。如果这张图直接拿去做文档下游同事按图实现就会出大问题。避坑方法每次新建工程第一件事就是确认时间单位。画图过程中如果发现周期数值特别大或者特别小先停下来检查单位。导出前再核对一遍时间轴上的刻度标注确认跟预期一致。5.2 信号边沿对齐的常见误区前面说了 TimeGen 有对齐到网格的功能但这个功能不是万能的。如果你把网格设得太大信号边沿会被吸附到错误的网格点上导致时序关系画错。举个例子时钟周期 10ns网格设成 10ns。这时候你想画一个在时钟上升沿之后 2ns 变化的信号但网格是 10ns信号边沿只能吸附到 0ns、10ns、20ns 这些点上2ns 的位置根本对不齐。结果就是信号变化点跟时钟边沿的关系画错了。正确做法网格大小应该设成你需要的最小时间精度。如果时序图里最细的时间关系是 2ns网格就设成 1ns 或者 2ns。网格越小对齐越精确但画图时拖动的手感会变差因为吸附点太密。折中方案是设成时钟周期的四分之一或者五分之一。5.3 版本兼容与文件管理TimeGen 的工程文件是私有格式不同版本之间可能存在兼容性问题。我用 3.2 版本保存的工程文件用其他版本打开可能会提示格式不兼容或者部分属性丢失。建议团队内部统一 TimeGen 版本避免互相打开文件出问题。如果必须跨版本协作导出成图片或者 PDF 是最稳妥的方式虽然失去了可编辑性但至少不会出错。文件管理方面建议每个项目建一个专门的时序图文件夹工程文件、导出的图片、相关的说明文档放在一起。工程文件命名带上版本号和日期比如SPI_Timing_v1.2_20240115.tgp方便追溯。我见过有同事画了几十张图文件名全是新建工程1、新建工程2过两个月自己都找不到哪张是哪张。5.4 团队协作中的时序图规范如果是团队协作时序图最好有一套统一的规范不然每个人画出来的风格都不一样文档看起来会很乱。我们团队内部总结了几条规范供参考信号命名统一时钟统一用clk或sclk复位统一用rst_n或reset_n低有效信号统一加_n后缀。颜色规范时钟黑色、数据蓝色、控制红色、总线绿色、复位橙色。全团队统一看图不用猜。时间单位统一一个项目内所有时序图用同一个时间单位避免混淆。标注规范关键时间点必须标注比如采样点、变化点、建立保持窗口。标注文字简洁不要写长句子。导出格式统一文档里统一用 EMF 或者高分辨率 PNG避免格式混乱。这套规范看起来是小事但实际执行下来团队沟通效率提升很明显。评审的时候大家看图的习惯一致不用每次花时间解释我这个图里红色代表什么。6. 时序图之外TimeGen还能怎么用6.1 用TimeGen辅助RTL调试TimeGen 画出来的时序图可以直接拿来对照 RTL 仿真波形。我调试状态机的时候习惯先用 TimeGen 画一张预期时序图然后跑仿真把仿真波形跟预期图对比。如果对不上要么是 RTL 写错了要么是预期图画错了总之能快速定位问题。这个方法特别适合调试复杂的握手协议。握手协议的状态跳转往往跟多个信号相关光看代码很难在脑子里构建出完整的时序关系。画一张图把每个状态的进入条件、退出条件、输出信号都标清楚再对照仿真波形问题一目了然。6.2 面试与教学中的时序图应用时序图在 FPGA 面试里是高频考点。面试官经常让你画一个 SPI 或者 I2C 的时序图考察你对协议的理解。如果你平时就用 TimeGen 画图面试的时候脑子里有清晰的波形图画起来会非常快。教学场景也一样。我带新人的时候第一课就是让他们用 TimeGen 画一遍 UART 的收发时序。画的过程中起始位、数据位、校验位、停止位的位置关系采样点的位置波特率的计算全都得搞清楚。画完一张图比讲十遍理论都管用。6.3 从时序图到设计文档的完整链路最后说一个稍微大一点的视角。时序图不是孤立的它是设计文档的一部分。一张好的时序图应该跟文档里的文字描述、接口定义、寄存器说明相互呼应。我的习惯是先画时序图把信号关系理清楚然后根据时序图写接口定义和寄存器说明最后把时序图嵌入文档作为文字描述的补充。这样写出来的文档逻辑清晰图文对应别人看起来不费劲。TimeGen 在这个链路里的角色是时序关系的可视化工具。它帮你把脑子里的时序关系变成精确的图再把图变成文档最后文档变成代码和测试用例。这个链路走通了FPGA 开发的效率会有质的提升。说到底TimeGen 只是一个工具工具本身不难学难的是养成先画图再写代码的习惯。我见过太多工程师拿到需求直接开写 RTL写到一半发现时序关系没理清楚回头返工。如果一开始花十分钟画张时序图很多问题在纸面上就解决了根本不会带到代码里。这个习惯比会用多少个工具都重要。