不同类型时钟CLK信号波形的产生、与时钟频率的关系

一、时钟周期与时钟频率换算

  时间(s) = 1/时钟频率(单位换算成HZ)

例如:1GHz换算成秒

  • 单位换算 把GHz换算成 Hz
  • 1GHz = 10^3MHz = 10^6KHz = 10^9Hz 1000的数量级
  • T(s) = 1ns = 1/(10^9Hz) = 10^-9 s , 即1ns的时钟周期对应1GHz的时钟频率
  • 1s = 10^3 ms = 10^6 us = 10^9 ns
时钟频率时钟周期
10MHz100ns
50MHz20ns
100MHz10ns
1GHz1.0ns

二、不同类型CLK波形

2.1、占空比50%的时钟信号(高低电平持续时间相同)

module gen_clk_50(clk_a);
  output  reg   clk_a;
  parameter  tPERIOD = 10;

  initial
    clk_a = 0;
    
  always 
    #(tPERIOD/2)  clk_a = ~clk_a;
endmodule

在这里插入图片描述

2.2、占空比可设置时钟信号(高低电平持续时间不同)

module gen_clk(clk_b);
  parameter tON = 5, tOFF = 10;        //设置占空比
  output reg    clk_b;

  always begin
    #tON  clk_b = 0;
    #tOFF clk_b = 1;
  end
endmodule

在这里插入图片描述

2.3、带初始延迟的时钟(占空比可设置)

module gen_clk_d(clk_c);
  output reg    clk_c;
  parameter    START_DELAY = 5, LOW_TIME = 3, HIGH_TIME = 2;

  initial begin
    clk_c = 0;         //初始化
    #START_DELAY;      //设置初始延迟

    forever begin      //也可通过repeat()语句指定时钟产生个数
      clk_c = 1;
      #HIGH_TIME;
      clk_c = 0;
      #LOE_TIME;
    end
  end
endmodule

在这里插入图片描述

2.4、相移时钟(assign赋值+延迟)

module clk_phase(master_clk, slave_clk);
  output reg  master_clk;
  output wire slave_clk;         //相移始终
  parameter   tON = 2, tOFF = 3, tPHASE_DELAY = 1;

  always begin
    #tON  master_clk = 0;
    #tOFF slave_clk = 1;
  end

  assign #tPHASE_DELAY  salve_clk = master_clk;   //通过连续赋值语句生成一个时钟的相移始终
  
endmodule 

在这里插入图片描述

2.5、倍频时钟(原时钟与相移始终异或)

   为产生一个频率为原本时钟频率2倍的时钟,将原时钟相移1/4周期,新的时钟信号与原时钟信号异或得到的结果就是一个更快速的时钟。

module clk_divider(output  double_clk);
   parameter    tHALF_PERIOD = 2;
   reg     clk;
   wire    delayed_clk;

   always begin
     #tHALF_PERIOD      clk = 0;
     #tHALF_PERIOD      clk = 1;
   end

  assign   #(tHALF_PERIOD/2)  delayed_clk = clk;
  assign   double_clk = delayed_clk^clk;

endmodule 

在这里插入图片描述

2.6、检测时钟脉冲是否丢失

module check_clock#(parameter tPERIOD=3)(input   clk);
   
   time   curr_time,  last_time;    //定义时间变量

   always@(posedge  clk)begin
     curr_time = $time;

     if( (curr_time-last_tiem)>tPERIOD )
       $display("Assertion fail:: CLock not period");

     last_time = curr_time;
   end
   
endmodule
//实际检查目标clk=1536Mhz的频率方式
@(posedge clk)
    time_1 = $realtime;
@(posedge clk)
    time_2 = $realtime;
freq_tmp = 1000/(time_2 - time_1);    //获取目标clk的频率

assert((freq_tmp>1536-2)&(freq_tmp<1536+2)) else begin   //检查1536M目标频点,通常可以给±2余量
	`uvm_error("freq check failed",$sformatf("freq_tmp = %0d", freq_tmp));
end
  • 8
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SD.ZHAI

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

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

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

打赏作者

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

抵扣说明:

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

余额充值