Verilog仿真时钟

一、变量初始化

变量初始化的基本原则为:可综合代码中完成内部变量的初始化,Testbench中完成可综合代码所需的各类接口信号的初始化。

初始化的方法有两种:一种是通过initial语句块初始化;另一种是在定义时直接初始化。

当initial语句块中有多条语句时,需要用begin…end或者fork…join语句。

直接初始化,如:reg [7:0] cnt = 8'b00000000;

二、时钟信号的产生

1、普通时钟信号:

a. 基于initial语句的方法:

  1. parameter clk_period = 10;  
  2. reg clk;  
  3. initial begin  
  4.     clk = 0;  
  5.     forever  
  6.         #(clk_period/2) clk = ~clk;  
  7. end  

b. 基于always语句的方法:

  1. parameter clk_period = 10;  
  2. reg clk;  
  3. initial  
  4.     clk = 0;  
  5. always #(clk_period/2) clk = ~clk;  

2、自定义占空比的时钟信号:

  1. parameter High_time = 5,Low_time = 20;  
  2. // 占空比为High_time/(High_time+Low_time)  
  3. reg clk;  
  4. always begin  
  5.     clk = 1;  
  6.     #High_time;  
  7.     clk = 0;  
  8.     #Low_time;  
  9. end  

3、相位偏移的时钟信号:

  1. parameter High_time = 5,Low_time = 20,pshift_time = 2;  
  2. // 相位偏移为360*pshift_time/(High_time+Low_time)  
  3. reg clk_a;  
  4. wire clk_b;  
  5. always begin  
  6.     clk_a = 1;  
  7.     #High_time;  
  8.     clk_a = 0;  
  9.     #Low_time;  
  10. end  
  11. assign #pshift_time clk_b = clk_a;  

4、固定数目的时钟信号:

  1. parameter clk_cnt = 5, clk_period = 2;  
  2. reg clk;  
  3. initial begin  
  4.     clk = 0;  
  5.     repeat(clk_cnt)  
  6.         #(clk_period/2) clk = ~clk;  
  7. end  

三、复位信号的产生

1、异步复位信号:

  1. parameter rst_repiod = 100;  
  2. reg rst_n;  
  3. initial begin  
  4.     rst_n = 0;  
  5.     #rst_repiod;  
  6.     rst_n = 1;  
  7. end  

2、同步复位信号:

  1. parameter rst_repiod = 100;  
  2. reg rst_n;  
  3. initial begin  
  4.     rst_n = 1;  
  5.     @(posedge clk)  
  6.     rst_n = 0;  
  7.     #rst_repiod;  
  8.     rst_n = 1;  
  9. end 

猜你喜欢

转载自www.cnblogs.com/Edam-IC/p/9054278.html