时间基准电路和带使能的多周期计数器


一.示例部分

(1)重点代码:

1.时间基准模块

modulecnt_sync(

 CLK   ,   // clock

 CNTVAL,   // counter value

 OV    );  // overflow

input CLK;

output [32-1:0] CNTVAL;

output OV;

parameter MAX_VAL = 25_000_000;

reg [32-1:0] CNTVAL;

regOV;

 

always@ (posedgeCLK) begin

  if(CNTVAL >= MAX_VAL)

   CNTVAL <= 0;

  else

   CNTVAL <= CNTVAL + 1'b1;

end

 

always@ (CNTVAL) begin

  if(CNTVAL == MAX_VAL)

   OV = 1'b1;

  else

   OV = 1'b0;

end

 

endmodule   //module cnt_sync

2.带使能端的计数器:

module cnt_en_0to9(

 CLK   ,   // clock

 CNTVAL,   //counter value

 EN    ,

 OV    );  // overflow

input CLK;

input EN;

output [4-1:0] CNTVAL;

output OV;

 

reg [4-1:0] CNTVAL;

reg OV;

 

always @ (posedgeCLK) begin

  if(EN) begin  // work enable

    if(CNTVAL >= 9)

     CNTVAL <= 0;

    else

     CNTVAL <= CNTVAL + 1'b1;

  end

  else

   CNTVAL <= CNTVAL ;  // hold same value

end

 

always @ (CNTVAL) begin

  if(CNTVAL == 9)

   OV = 1'b1;

  else

   OV = 1'b0;

end

 

endmodule   // module cnt_en_0to9

3.计数器(从带使能端的改进出来)


(2)重点问题:此时已将时间基准模块的最大计数参数(parameter MAX_VAL)改成5。此举原因:在进行仿真时,设置clk信号的Time period最大合法区间可到1微秒,不支持更长时间,因而过大则看不到想要的波形变化。仿真结果如下:

 

 

 二.学生实验:

1.2合并完成,0-15计数器寄存器宽度不变。代码参考上面模9计数器。生成的BDF图如下:(计时时间0.1秒)

3.

更新后代码如下(包括清零和暂停的代码,但3中并没有设置相应开关):

module cnt_en_0to9(

 CLK   ,   // clock

 CNTVAL,   // counter value

 EN    ,

  RESET ,

 OV    );  // overflow

input CLK;

input EN;

input RESET;

output [4-1:0] CNTVAL;

output OV;

 

reg [4-1:0] CNTVAL;

reg OV;

 

always @ (posedge CLK) begin

 if(RESET) begin

    CNTVAL <= 0;

    end

 else if(EN) begin  // work enable

   if(CNTVAL >= 9)

     CNTVAL <= 0;

   else

     CNTVAL <= CNTVAL + 1'b1;

  end

   else

   CNTVAL <= CNTVAL ;  // holdsame value

end

always @ (CNTVAL) begin

 if(CNTVAL == 9)

   OV = 1'b1;

 else

   OV = 1'b0;

end

 

endmodule  // module cnt_en_0to9

生成BDF如图所示:

管脚分配图如下:

4.

BDF图如下,代码见3.