计数器是非常基本的使用,没有计数器就无法处理时序。我在学习时发现市面上有几种不同的计数器写法,非常有趣,在此记录下来:
一、时序逻辑和组合逻辑彻底分开
1.代码
1 //======================================================================
2 // --- 名称 : Count_1
3 // --- 作者 : xianyu_FPGA
4 // --- 日期 : 2018-12-10
5 // --- 描述 : 模10计数器,0到10循环累加
6 //======================================================================
7
8 module Count_1
9 (
10 input clk ,
11 input rst_n ,
12 output reg [ 3:0] cnt
13 );
14
15 //----------------------------------------------------------------------
16 //-- 组合电路
17 //----------------------------------------------------------------------
18 reg [ 3:0] cnt_n ;
19
20 always @(*)begin
21 if(cnt == 4'd9)
22 cnt_n = 4'd0;
23 else
24 cnt_n = cnt + 1'b1;
25 end
26
27 //----------------------------------------------------------------------
28 //-- 时序电路
29 //----------------------------------------------------------------------
30 always @(posedge clk or negedge rst_n)begin
31 if(!rst_n)
32 cnt ==========================================
3 (
4 //system --------------------------------------------
5 input wire clk , // 50MHz
6 input wire rst_n ,
7 //ov5640 --------------------------------------------
8 output wire ov5640_pwdn , // ov5640上电
9 output wire ov5640_rst_n , // ov5640复位
10 output wire power_done // power_ctrl全面有效,SCCB可以开始工作
11 );
12 //========================< 参数 >==========================================
13 localparam T2_6MS = 30_0000 ; // T2>5ms
14 localparam T3_2MS = 10_0000 ; // T3>1ms
15 localparam T4_21MS = 105_0000 ; // T4>20ms
16 //========================< 信号 >==========================================
17 reg [18:0] cnt_6ms ;
18 reg [16:0] cnt_2ms ;
19 reg [20:0] cnt_21ms ;
20
21 //==========================================================================
22 //== ov5640_pwdn
23 //==========================================================================
24 always @(posedge clk or negedge rst_n) begin
25 if(!rst_n) begin
26 cnt_6ms |