门控时钟和时钟MUX
1.门控时钟
最近做ASIC的FPGA原型验证,遇到了门控时钟的问题。在这里记录下来。
门控时钟在ASIC设计中经常使用。门控时钟可以通过时钟使能信号关闭模块,进而降低功耗。
但是在FPGA里面门控时钟会占用较多的时钟资源,按照我的理解FPGA使用组合逻辑生成的门控时钟驱动能力弱,会导致延时较大,时序违例。
一般的思路是将门控时钟替换为使能时钟。就是将时钟使能信号改为寄存器使能信号。
Vivado软件比较智能,可以通过综合策略中设置“gated_ clock_conversion”为auto,让软件自动推断优化门控时钟。
上图是典型的门控时钟代码和综合出来的原理图。门控时钟经组合逻辑输出。
下面打开Vivado中的门控时钟优化选项。
这里提一下打开门控时钟优化有两种方法,一种是综合策略中设置,另一种是代码中在门控时钟信号声明前添加属性**( gated clock =“true”*)**
可以看到原理图中使能信号连接到了FDRE的CE(时钟使能信号端),被优化为了时钟使能寄存器。
关于更多综合策略的选项设置可以参考Xilinx的官方文档《ug901-vivado-synthesis》的第49页。
2.时钟MUX
ASIC设计中也经常用到时钟MUX结构,在FPGA里面我们使用时钟选择BUF进行替换。
首先查看时钟MUX的原始代码和综合出的原理图:
时钟MUX采用简单的组合逻辑实现,这样时钟切换的时候有很大隐患。可能导致毛刺,时钟驱动能力减弱。
上图是采用Vivado器件原语实现的时钟MUX。能做到时钟的无缝切换,同时可以提高时钟的驱动能力。 BUFGMUX的参数设置为“SYNC”的时候,会在另一个时钟上升沿完成切换,如果设置为“ASYNC”,即便其中一个时钟是空的也能正常切换。