时间(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