verilog时钟使能

时钟使能是一种在数字系统设计中优化时钟信号的方法,通过分频信号控制模块的使能端口,降低时钟复杂性并减少时钟信号质量的影响。它能避免时钟毛刺,减少skew,并通过控制时钟作用时间来模拟频率降低,简化多时钟域设计。使用时钟使能可以减少设计复杂度,例如在数据转换场景中,通过时钟使能减少分频操作,从而降低系统复杂性和提高可靠性。设计时,通常会结合Verilog等硬件描述语言来实现时钟使能逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

时钟使能

1.时钟使能是用分频得到的信号作为模块的使能信号,模块原有的时钟不变。即用分频信号去控制模块的使能端口。这样做的好处是:避免过于复杂的时钟信号设计。

2.是出于对于时钟信号质量的高要求,尽量避免时钟产生毛刺,减少skew。所以推荐使用DCM,PLL之类的模块完成分频。

3.使用时钟使能也可以控制时钟作用的时间,就好像频率降低了一样。
时钟使能(CE)的原理其实很简单。逻辑实现是这样的,普通的D触发器(寄存器)的输出引回来和输入信号共同进入一个两路选择器,这个选择器的控制就是CE,选择器的输出进入普通的D触发器或者寄存器。这样,CE有效的时候,选择输入信号直接进入D触发器,CE无效的时候,上一个周期的信号输入D触发器,所以寄存器的值保持不变,就好像时钟被禁止了一样。

4.时钟使能就是使原始时钟信号的上升沿经过n次有效一次。是用来让寄存器低频采集某一路数据的,并不能完全代替一个真正的低频时钟。还有用时钟使能时,会使采样推迟一个时钟周期,这是要注意的。

5.因为系统的全局时钟资源是有限的,所以说我们尽量在片内使用同步电路的设计方法,使用同一个时钟来触发,这样可以保证不同的LE(逻辑单元)其clock skew最小,对系统进行STA分析的结果是准确的。但是不同的模块其所要求的速率是不一样的,所以我们要用时钟使能的方式,对于低速应用,只在时钟使能信号有效的情况下才触发。
对于不同的FPGA芯片,采用同样的时钟信号使能方式但综合后的结果是不一样的,有的时钟使能信号直接加在片内DFF的使能端,而有的则是与输入信号,触发器输出进行一番逻辑运算后输入到DFF的输入端口,使得使能信号为0时输出不变,输入为1时随输入信号的变化而变化。

verilog带有使能端的处理方式

always @(posedge clk)
begin
   if (en)
   .......
   else
   .......
end

举例

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

  • 设计文件(分频方法)
module clk_en1(clk, rst_n, data_in, data_out);
input clk;
input rst_n;
input [7:0] data_in;
output [31:0] data_out;

reg [31:0] data_out;
reg [31:0] data_shift;
reg [1:0] cnt;
wire clken;

always @(posedge clk or negedge rst_n)
begin
   if (!rst_n)
      cnt <= 0;
   else
      cnt <= cnt + 1;
end

assign clken = cnt[1];

always @(posedge clk or negedge rst_n)
begin
   if (!rst_n)
      data_shift <= 0;
   else 
      data_shift <= {data_shift[23:0],data_in};
end

always @(posedge clken or negedge rst_n)
begin
   if (!rst_n)
      data_out <= 0;
   else 
      data_out <= data_shift;
end

endmodule

  • 设计文件(时钟使能)
`timescale 1ns / 1ps

module clk_en(clk, rst_n, data_in, data_out);
input clk;
input rst_n;
input [7:0] data_in;
output [31:0] data_out;

reg [31:0] data_out;
reg [31:0] data_shift;
reg [1:0] cnt;
reg clken;

always @(posedge clk or negedge rst_n)
begin
   if (!rst_n)
      cnt <= 0;
   else
      cnt <= cnt + 1;
end

always @(posedge clk or negedge rst_n)
begin
   if (!rst_n)
      clken <= 0;
   else if (cnt == 2'b01)
      clken <= 1;
   else
      clken <= 0;
end

always @(posedge clk or negedge rst_n)
begin
   if (!rst_n)
      data_shift <= 0;
   else 
      data_shift <= {data_shift[23:0],data_in};
end

always @(posedge clk or negedge rst_n)
begin
   if (!rst_n)
      data_out <= 0;
   else if (clken == 1'b1)
      data_out <= data_shift;
end
  • 仿真文件
`timescale 1ns / 1ps

module test_sim();
reg         clk;            
reg         rst_n;          
reg  [7:0]  data_in=8'b1;  
wire [31:0] data_out;

initial begin
    clk=0;
    rst_n=0;
    #20 rst_n=1;
end

always
#10 clk=~clk;

clk_en clk_en_u(
    .clk(clk),
    .rst_n(rst_n),
    .data_in(data_in),
    .data_out(data_out)
);
endmodule

  • 仿真结果
    在这里插入图片描述
    来源:代码参考来源
    总结一句话:别把分频出来的时钟当时钟用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值