时钟信号的几种设计方法

时钟信号是FPGA时序逻辑设计中必不可少的条件,一般情况下在FPGA始终资源充裕的情况下通常采用FPGA内部自带的内核生成时钟信号,例如DLL/MMC,但是一旦出现资源不够的情况,就只能另寻他法了,为了保证良好的阅读效果,建议在阅读本文之前看一下我之前写的几篇博文,FPGA的输入、输出、扇出的那些琐事,clocking wizard配置(PLL/MMC内核配置)。本文先介绍一下内核产生的时钟,然后介绍三种时钟的产生方式和介绍,分别是内部逻辑生成、使能时钟、门控时钟。

一、时钟FPGA自带硬核产生时钟

就我目前的小白水平来看,个人觉得使用内核生成的时钟是最简便、最稳定的时钟资源,具体的产生方式参考【FPGA】FPGA的输入、输出、扇出的那些琐事,通过DLL这些内核产生的时钟信号不但可以稳定准确进行倍频、分频,而且可准确的实现相移控制、占空比控制等时钟信号内部操作,并且可选择输出buff方式。强烈建议这种时钟生成方式!

二、内部逻辑生成时钟

对于所有在FPGA内生成时钟方式来说,均需要参考时钟或者同步时钟来生成,而且内部逻辑生成时钟信号,必须包含时序逻辑,也可包含组合逻辑,但是一旦有组合逻辑就有可能产生毛刺,会导致整个系统变得不稳定,另外时序逻辑产生的时钟信号也会产生固定的时延,导致后续的时许约束问题。这些问题在设计时一定要慎重考虑,另外就是驱动问题,一般情况下TTL驱动能力较弱在10个扇出信号以内,所以如果扇出较大,建议逻辑复制或者过一次BUFF。对于组合逻辑产生毛刺的问题,建议使用触发器利用原时钟进行同步一拍。

所以,一般情况下不建议使用内部逻辑产生的时钟,如果必须使用,建议使用上述操作。

三、在分频时钟信号中使用使能时钟

一般设计时钟信号我们使用参考时钟或者同步时钟,使能时钟在一方面很好的解决了组合逻辑毛刺问题、时序逻辑延时问题。代码如下:
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
cnt<=3'd0;
end else
if(cnt<3'd4)
begin
cnt<=cnt+1'b1;
end else
cnt<=3'd0;
end
assign en=(cnt == 3'd4);
always@(posedge clk or negedge rst)
begin
if(!rst)
begin

end else
if(en)
begin
使能之后的操作
end else
begin
对信号进行保持
end
end

使能时钟通过判断en使能信号,进行保持输出还是通过输入信号更新输出。这样就避免了使用分频时钟,通过分频出的使能信号对后续时序逻辑进行判断。

四、门控时钟

对于门控时钟,是一个很好的低功耗解决方案,通过对将时钟信号与始终使能信号进行与之后再输入到各个触发器上,当这部分器件不用的时候可以将时钟信号置0,因为每一次的时钟电平反转都会产生功耗,这样很好的降低了功耗,另外尽量将时钟使能信号过一拍时钟同步,预防亚稳态!

本文转载自:https://blog.csdn.net/u011327754/article/details/80519837