欢迎各位朋友关注“郝旭帅电子设计团队”公众号,本公众号会定时更新相关技术类资料、软件等等,感兴趣的朋友可以浏览一下本公众号的其他“模块”,希望各位朋友都能在本公众号获得一些自己想要的“东西”。
本篇主要是讨论FPGA中的低速逻辑设计应该选择分频时钟or系统高速时钟
直接而明确的答案是:对于FPGA中的低速逻辑设计,你应该始终选择使用系统高速时钟,并通过使能信号(Clock Enable)来控制低速逻辑的节奏,而不是生成一个新的分频时钟。
方法一:使用分频产生的低速时钟(不推荐)
这种方法使用一个计数器对系统时钟(clk)进行分频,产生一个频率符合低速逻辑要求的时钟(slow_clk),然后将整个低速模块的时序逻辑用这个 slow_clk 来驱动。
缺点:
引入跨时钟域(CDC)问题:这是最致命的缺点。你的设计中现在存在两个时钟域:高速的 clk 域和低速的 slow_clk 域。当这两个域需要通信时(例如,slow_clk 域的逻辑结果需要传递给 clk 域的其他模块),你必须设计复杂的同步器(如两级触发器)来防止亚稳态。这会极大增加设计的复杂性和风险。
时钟质量差:由普通逻辑资源(如FF和LUT)产生的 slow_clk 信号,其走线路径是普通的可编程互联线,而不是专用的全局时钟网络。这会导致它时钟偏移(Skew)大、抖动(Jitter)高,时序性能非常差。
增加时序分析复杂度:你需要为 slow_clk 创建额外的时钟约束。静态时序分析(STA)工具必须同时对 clk 和 slow_clk 这两个时钟域以及它们之间的路径进行分析,使得约束和调试变得更加困难。
浪费资源:FPGA内部的全局时钟资源(时钟树)是有限且宝贵的。将 slow_clk 信号作为时钟使用会占用一个全局时钟缓冲器(BUFG),这是一种浪费。而普通的逻辑信号数量远多于全局时钟资源。
方法二:使用系统高速时钟 + 使能信号(强烈推荐)
这种方法的所有逻辑,无论是高速还是低速,都统一使用同一个系统高速时钟(clk)。通过一个计数器产生一个周期性的使能脉冲(slow_ena),该脉冲的频率等于你想要的低速逻辑的运行频率。当时钟上升沿到来时,只有使能信号有效,低速逻辑才执行操作。
优点:
单时钟域设计:整个设计都同步于同一个主时钟 clk。彻底消除了令人头疼的跨时钟域问题,模块间的数据交换简单、安全、可靠。
时钟质量最佳:clk 通过专用的全局时钟网络布线,偏移和抖动最小,能保证最好的时序性能。
时序分析简单:只需对 clk 进行约束。静态时序分析工具只需要分析一个时钟域,非常简单清晰,更容易满足时序要求。
节省时钟资源:slow_ena 是一个普通的数据信号,不需要占用宝贵的全局时钟资源。
灵活性高:你可以轻松生成多个不同频率的使能信号来控制不同的低速逻辑,而它们全都和谐地运行在同一个时钟域下。
总结对比与最终建议
在FPGA设计中,“同步设计”是黄金法则。你应该致力于构建一个由单一主时钟驱动的同步系统。对于任何低速逻辑,请永远使用 “系统高速时钟 + 使能信号” 的方案。 这不仅仅是“更好”的选择,在现代FPGA设计中被认为是唯一正确的专业做法。使用分频时钟只会给你的项目带来不必要的复杂性、可靠性风险和资源浪费。
本篇内容中有部分资源来源于网络,如有侵权,请联系作者。
如果您觉得本公众号还不错的话,可以推给身边的朋友们,感谢并祝好!
610