利用条件语句实现不同占空比的分频时钟电路

来源:互联网 发布:苹果的ar软件 编辑:程序博客网 时间:2024/05/01 13:44

1,要实现的是如下的一个“产生占空比不同的分频时钟”:


(1)、建模:

module fdivision_module(clock,d_clock,reset,j);
  input clock,reset;
  output d_clock,j;
  
  reg d_clock;
  reg [2:0]j;
  
  always @(posedge clock)
  begin
    if(!reset)

//初始化过程
      begin
        d_clock<=0;
        j<=0;
      end
    else
      begin
      if(j==4)
        j<=0;
      else if(j==1)
        begin
          d_clock=1;
          j<=j+1;
        end
      else
        begin
          d_clock=0;
          j<=j+1;
        end
      end
  end
endmodule

(2)testbench:

`include "fdivision_module.v"
module fdivision_stimulus;


  reg clock,reset;
  wire d_clock;
  wire [2:0]j;
  
  fdivision_module  fd(clock,d_clock,reset,j);
  
  initial
  begin
    clock=0;
    forever #5 clock=~clock;
  end
  
  initial
  begin
    reset=0;
    #20 reset=1;
    #100 reset=1;
    #5 reset=1;
  end

(3)、正确仿真波形:


2、出现的问题及解决办法:

(1)、第一次的仿真结果如下:由图可见,在reset置0的时候,d_clock并没有置0,没有初始化


(2)、为了调试程序,我将局部变量j也作为输出变量,得到下面的仿真结果:局部起到计数的变量一直为未知量x


(3)、改动程序,将reset也放入always的敏感列表中,写成always @(posedge clock,negedge reset),得到下面的结果:很显然,尽管仿真出结果,但是占空比错误,这个错归根结底还是在于计数器的设定,开始我写成(j==5)时,j<=0;(j==2)时,d_clock=1;特别很明显0~5总共经历了6个时钟。所以,建模过程中,要特别注意计数器j的设定。


(4),现在回过头来想想最开始的建模有什么错误,在2.3中,将reset置于敏感列表中,写成always @(posedge clock,negedge reset),这相当于异步置0 ,reset的置0信号是不受时钟控制的,只要reset=0,就能将d_clock和j置0。但是在最开始错误的2.1中,敏感列表为always @(posedge clock),再在后面过程块中写,reset=0时,j=0,d_clock=0;那么这时的reset置0为同步置0,只有当上升沿出现时,才生效,给j和d_clock赋值。但是,我在testbench模块中,给reset的赋值如下图:很显然,在0~5ns时,reset=0,#5ns之后reset=1,则当#10ns,上升沿到来时,reset已经为1,不能再给j和d_clock赋值了,所以造成了2.1的错误。特别值得注意的是,在异步置0时,reset=0的保持时间可以任意,但同步置0时,reset=0的保持时间需要大于一个时钟,否则就会出现上面上升沿还没到来,reset就为1,不能赋值的错误。 



0 0
原创粉丝点击