知方号

知方号

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

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

文章目录 一、时钟周期与时钟频率换算二、不同类型CLK波形2.1、占空比50%的时钟信号(高低电平持续时间相同)2.2、占空比可设置时钟信号(高低电平持续时间不同)2.3、带初始延迟的时钟(占空比可设置)2.4、相移时钟(assign赋值+延迟)2.5、倍频时钟(原时钟与相移始终异或)2.6、检测时钟脉冲是否丢失

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

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

例如:1GHz换算成秒

单位换算 把GHz换算成 Hz1GHz = 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 时钟频率时钟周期10MHz100ns50MHz20ns100MHz10ns1GHz1.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; endendmodule

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 endendmodule

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。