计数器模块

2019-04-14 15:25发布

简单的0-9计数器

  • RTL:
    0-9计数器
  • 代码片:
module cnt_0to9( CLK , // clock CNTVAL, // counter value OV ); // overflow parameter CNTVAL_MAX = 9 ;//计数器最大值 parameter CNTVAL_WL = 4 ;//位宽 input CLK; output [CNTVAL_WL-1:0] CNTVAL; output OV; reg [CNTVAL_WL-1:0] CNTVAL; reg OV; always @ (posedge CLK) begin if(CNTVAL < CNTVAL_MAX) CNTVAL <= CNTVAL + 1'b1; else CNTVAL <= 0; end always @ (CNTVAL) begin if(CNTVAL == CNTVAL_MAX) OV = 1'b1; else OV = 1'b0; end endmodule // module cnt_0to9

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

  • 时间基准电路
    • RTL:
      时间基准电路
    • 代码片:
module cnt_sync( CLK , // clock CNTVAL, // counter value OV ); // overflow input CLK; output [32-1:0] CNTVAL; output OV; parameter MAX_VAL = 25_000_000;//周期:25_000_000*0.02us=0.5s reg [32-1:0] CNTVAL; reg OV; always @ (posedge CLK) begin if(CNTVAL < MAX_VAL) CNTVAL <= CNTVAL + 1'b1; else CNTVAL <= 0; end always @ (CNTVAL) begin if(CNTVAL == MAX_VAL) OV = 1'b1; else OV = 1'b0; end endmodule // module cnt_sync
  • 带使能的多周期计数器
    • RTL:
      带使能的多周期计数器
    • 代码片:
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 @ (posedge CLK) begin if(EN) begin // work enable if(CNTVAL < 9) CNTVAL <= CNTVAL + 1'b1; else CNTVAL <= 0; 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
  • SignalTap分段触发
    分段触发
    捕获结果
    捕获原理

带清零、暂停功能的0-9.9s的计时秒表

  • 原理图
    原理图
  • 代码片(RST同步复位)
////////////////////////////////////// ////////////带有清零、暂停功能的计数器 //////////// RST EN PST 功能 //////////// 1 x x 清零(复位) //////////// 0 0 x 计数值保持:CNTVAL <= CNTVAL //////////// 0 1 1 暂停功能,计数值保持:CNTVAL <= CNTVAL //////////// 0 1 0 循环计数 //////////////////////////////////////// module cnt_RST_en_PST_0to9( CLK , // clock CNTVAL, // counter value RST , EN , PST , OV ); // overflow parameter CNTVAL_WL = 4; parameter MAX_VAL = 9; input CLK , RST , EN , PST ; output [CNTVAL_WL-1:0] CNTVAL; output OV; reg [CNTVAL_WL-1:0] CNTVAL; reg OV; always @ (posedge CLK) begin if(RST)begin CNTVAL <= 0 ; end else begin if(EN&&!PST) begin // work enable if(CNTVAL < 9) CNTVAL <= CNTVAL + 1'b1; else CNTVAL <= 0; end else CNTVAL <= CNTVAL ; // hold same value end end always @ (CNTVAL) begin if(CNTVAL == MAX_VAL) OV = 1'b1; else OV = 1'b0; end endmodule // module cnt_en_0to9
  • 手绘RTL
    手绘
  • 生成RTL
    生成

热门文章