Note:文章内容以 Xilinx 系列 FPGA 进行讲解
1、什么是安全启动时钟
通常情况下,在MMCM/PLL的LOCKED信号抬高之后(由0变为1),MMCM/PLL就处于锁定状态,输出时钟已保持稳定。但在此之前,输出时钟会发生持续翻转且不稳定。而在某些场合下,需要LOCKED信号为1之后才发生时钟翻转,这就是所谓的安全启动时钟。
2、安全启动时钟方式一
在xilinx FPGA中,Clocking Wizard IP提供了Safe Clock Startup这个选项,用于实现安全启动时钟,如下图所示:
一旦勾选Safe Clock Startup选项,Clocking Wizard IP会生成如下图所示的电路:
可以看到每个时钟输出端口会出现并联的时钟缓冲器BUFGCE(此处只能是BUFGCE,这是因为 BUFGCE 提供了全局时钟缓冲,有助于确保时钟信号的稳定性和可靠性)和一个深度为8的移位寄存器。移位寄存器的数据输入端口由MMCM的LOCKED信号提供。最终输出时钟clka和clkb对应的全局时钟缓冲器BUFGCE的时钟使能端口由移位寄存器的数据输出端口提供。因此,对于clka,只有当LOCKED信号为高电平,且经过8个clka周期后,clka才稳定输出,clkb亦是如此。
Safe Clock Startup选项通常用于需要模块一个接一个地系统操作的场景,以确保系统在时钟稳定后才进行后续操作。这对于需要严格时序控制的系统,如多核处理器或需要精确同步的并行处理系统,尤为关键。
在勾选Safe Clock Startup选项之后,在Output Clocks页面可勾选USE CLOCK SEQUENCING,如下图所示。该选项的功能是使输出时钟按指定顺序依次输出,标记为1的先输出,其他的依次输出。例如下图中clk_200M在LOCKED为高电平之后,经过8个clk_200M时钟周期后输出;clk_160M是在clk_200M有效之后,经过8个clk_160M时钟周期后输出;clk_50M是在clk_160M有效之后,经过8个clk_50M时钟周期后输出。
另外还要注意,序列号的范围是从1到所选时钟的最大数量,且序列中不允许出现任何中断,必须连续。同时序列中输出时钟的频率不应超过序列中下一个输出时钟频率的八倍。
之所以会形成顺序时钟,是因为勾选USE CLOCK SEQUENCING选项之后会形成如下的电路:
相比于勾选USE CLOCK SEQUENCING选项之前的电路,勾选该选项之后,移位寄存器由并联关系变为级联关系。
3、安全启动时钟方式二
通过外部复位信号控制也可以安全的启动时钟。具体电路如下图所示:
这里的输入时钟clk因扇出很小而不用插入全局时钟缓冲器,这可以通过在代码或约束文件中添加属性CLOCK_BUFFER_TYPE实现。同时,对这4个异步复位寄存器添加属性ASYNC_REG,以保证它们最终在一个SLICE内。代码如下所示:
其中的参数DELAY_NUM应小于或等于8(7系列FPGA的一个SLICE内有8个触发器)。
~End~