打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
一天一个设计实例-门控时钟和使能时钟

门控时钟的简介:

组合逻辑中多用门控时钟,一般驱动门控时钟的逻辑都是只包含一个门,如果有其他的附加逻辑,就容易因竞争而产生不希望的毛刺。门控时钟通过一个时能信号控制时钟的开关。当系统不工作时可以关闭时钟,整个系统处于非激活状态,这样就能够在某种程度上降低系统功耗。

然而,使用门控时钟并不符合同步设计的思想,它可能会影响设计的实现和验证。单纯从功能上看,使用使能时钟替代门控时钟是一个不错的选择;但是使能时钟在使能信号关闭时,时钟信号仍然在工作,它无法像门控时钟那样降低系统的功耗。

Altera的解决方案:

对于上升沿有效的系统时钟clk,他的下降沿先把门控时钟打一拍,然后再用这个使能信号和系统时钟clk相与后作为后续电路的门控时钟。

173 Altera门控时钟

这样的门控时钟电路很好的解决了组合逻辑常见的一些问题。它避免了毛刺的出现,同时也有效的抑制了亚稳态可能带来的危害。但是从另一个方面来说,如果这个设计的系统时钟占空比不是很稳定,或者输出的使能信号(enable)与时钟信号(clk)的逻辑过于复杂,那么它也会带来一些功能和时序上的问题。总得来说,只要设计者控制好这个设计中时钟占空比和门控逻辑复杂度,还是比下面这个简单的门控时钟电路方案可行。

174 简单的门控时钟电路方案

时钟使能电路是同步设计的基本电路。在很多设计中,虽然内部不同模块的处理速度不同,但由于这些时钟是同源的,可以将它们转化为单一时钟处理。在ASIC中可以通过STA约束让分频始终和源时钟同相,但FPGA由于器件本身和工具的限制,分频时钟和源时钟的Skew不容易控制(使用锁相环分频是个例外),难以保证分频时钟和源时钟同相,因此推荐的方法是使用时钟使能,通过使用时钟使能可以避免时钟“满天飞”的情况,进而避免了不必要的亚稳态发生,在降低设计复杂度的同时也提高了设计的可靠性。 

带使能端的D触发器,比一般D触发器多了使能端,只有在使能信号ENA有效时,数据才能从D端被打入D触发器,否则Q端输出不改变。

 我们可以用带使能端的D触发器来实现时钟使能的功能。

Verilog模型举例:

在某系统中,前级数据输入位宽为8位,而后级的数据输出位宽为32,我们需要将8bit数据转换为32bit,由于后级的处理位宽为前级的4倍,因此后级处理的时钟频率也将下降为前级的1/4,若不使用时钟使能,则要将前级的时钟进行4分频来作后级处理的时钟。这种设计方法会引入新的时钟域,处理上需要采取多时钟域处理的方式,因而在设计复杂度提高的同时系统的可靠性也将降低。为了避免以上问题,我们采用了时钟使能以减少设计复杂度。

代码14 采用时钟使能

1.module clk_en(clk, rst_n, data_in, data_out);  

2.input clk;  

3.input rst_n;  

4.input [7:0] data_in;  

5.output [31:0] data_out;  

6.   

7.reg [31:0] data_out;  

8.reg [31:0] data_shift;  

9.reg [1:0] cnt;  

10.reg clken;  

11.   

12.always @(posedge clk or negedge rst_n)  

13.begin  

14.   if (!rst_n)  

15.      cnt <= 0;  

16.   else  

17.      cnt <= cnt + 1;  

18.end  

19.   

20.always @(posedge clk or negedge rst_n)  

21.begin  

22.   if (!rst_n)  

23.      clken <= 0;  

24.   else if (cnt == 2'b01)  

25.      clken <= 1;  

26.   else  

27.      clken <= 0;  

28.end  

29.   

30.always @(posedge clk or negedge rst_n)  

31.begin  

32.   if (!rst_n)  

33.      data_shift <= 0;  

34.   else   

35.      data_shift <= {data_shift[23:0],data_in};  

36.end  

37.   

38.always @(posedge clk or negedge rst_n)  

39.begin  

40.   if (!rst_n)  

41.      data_out <= 0;  

42.   else if (clken == 1'b1)  

43.      data_out <= data_shift;  

44.end  

45.   

46.endmodule  

代码15 采用分频方法

1.module clk_en1(clk, rst_n, data_in, data_out);  

2.input clk;  

3.input rst_n;  

4.input [7:0] data_in;  

5.output [31:0] data_out;  

6.   

7.reg [31:0] data_out;  

8.reg [31:0] data_shift;  

9.reg [1:0] cnt;  

10.wire clken;  

11.   

12.always @(posedge clk or negedge rst_n)  

13.begin  

14.   if (!rst_n)  

15.      cnt <= 0;  

16.   else  

17.      cnt <= cnt + 1;  

18.end  

19.   

20.assign clken = cnt[1];  

21.   

22.always @(posedge clk or negedge rst_n)  

23.begin  

24.   if (!rst_n)  

25.      data_shift <= 0;  

26.   else   

27.      data_shift <= {data_shift[23:0],data_in};  

28.end  

29.   

30.always @(posedge clken or negedge rst_n)  

31.begin  

32.   if (!rst_n)  

33.      data_out <= 0;  

34.   else   

35.      data_out <= data_shift;  

36.end  

37.   

38.endmodule  

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【精品博文】详细解析基于FPGA的任意分频
Manchester Decoder曼切斯特解码
从计数器到分频电路(完结)
【接口时序】2、Verilog实现流水灯及与C语言的对比
串口协议FPGA实现
【设计开发】 典型同步电路设计
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服