FPGA定时器的计数设置,是否要减1?(精密计数)

parameter T1US = 5'd20;  //时钟晶振为20MHz

     /*******************************/

    reg [4:0]Count_1US;
     reg is1US;

    always @ ( posedge CLK or negedge RSTn )
        if( !RSTn )
              begin Count_1US <= 5'd0; is1US <= 1'b0; end
          else if( Count_1US == T1US )
              begin Count_1US <= 5'd0; is1US <= 1'b1; end
          else
              begin Count_1US <= Count_1US + 1'b1; is1US = 1'b0; end

仿真结果如下:
FPGA定时器的计数设置,是否要减1?(精密计数)_第1张图片


可以看到,第一次计数是正确的,然而在第二次计数则出现了问题。

原因是第二次开始时将1us的指示信号也包括进去了,导致多走了一个时钟。

因此,此种方式称之为 精密计数,开始触发点要在将is1US寄存器置位0的时刻开始。

实现连续 精密计时需要如下设置:
parameter T1US = 5'd20 - 1;  //时钟晶振为20MHz

你可能感兴趣的:(FPGA)