OpenCores
URL https://opencores.org/ocsvn/versatile_counter/versatile_counter/trunk

Subversion Repositories versatile_counter

[/] [versatile_counter/] [trunk/] [rtl/] [verilog/] [versatile_counter.v] - Blame information for rev 20

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 10 unneback
`include "versatile_counter_defines.v"
2 20 unneback
`define LFSR_LENGTH cnt_length
3 10 unneback
`include "lfsr_polynom.v"
4
`let CNT_INDEX=CNT_LENGTH-1
5 20 unneback
`ifndef CNT_MODULE_NAME
6
`define CNT_MODULE_NAME vcnt
7
`endif
8 10 unneback
module `CNT_MODULE_NAME
9
  (
10
`ifdef CNT_TYPE_GRAY
11 20 unneback
    output reg [cnt_length:1] q,
12 10 unneback
 `ifdef CNT_Q_BIN
13 20 unneback
    output [cnt_length:1]    q_bin,
14 10 unneback
 `endif
15
`else
16
 `ifdef CNT_Q
17 20 unneback
    output [cnt_length:1]    q,
18 10 unneback
 `endif
19
`endif
20
`ifdef CNT_CLEAR
21
    input clear,
22
`endif
23
`ifdef CNT_SET
24
    input set,
25
`endif
26
`ifdef CNT_REW
27
    input rew,
28
`endif
29
`ifdef CNT_CE
30
    input cke,
31
`endif
32
`ifdef CNT_QNEXT
33 20 unneback
    output [cnt_length:1] q_next,
34 10 unneback
`endif
35
`ifdef CNT_Z
36
    output z,
37
`endif
38
`ifdef CNT_ZQ
39
    output reg zq,
40
`endif
41 20 unneback
`ifdef CNT_LEVEL1
42
    output reg level1,
43
`endif
44
`ifdef CNT_LEVEL2
45
    output reg level2,
46
`endif
47 10 unneback
    input clk,
48
    input rst
49
   );
50
 
51 20 unneback
   parameter cnt_length = `CNT_LENGTH;
52
   parameter cnt_reset_value = `CNT_RESET_VALUE;
53 10 unneback
`ifdef CNT_SET
54 20 unneback
   parameter set_value = cnt_length'd`CNT_SET_VALUE;
55 10 unneback
`endif
56
`ifdef CNT_WRAP
57 20 unneback
   parameter wrap_value = cnt_length'd`CNT_WRAP_VALUE;
58
`endif
59
`ifdef CNT_LEVEL1
60
    parameter level1_value = cnt_length'd`CNT_LEVEL1_VALUE;
61
`endif
62
`ifdef CNT_LEVEL2
63
    parameter level2_value = cnt_length'd`CNT_LEVEL2_VALUE;
64
`endif
65 10 unneback
 
66
   // internal q reg
67 20 unneback
   reg [cnt_length:1] qi;
68 10 unneback
 
69
`ifndef CNT_QNEXT
70 20 unneback
   wire [cnt_length:1] q_next;
71 10 unneback
`endif
72
`ifdef CNT_REW
73 20 unneback
   wire [cnt_length:1] q_next_fw;
74
   wire [cnt_length:1] q_next_rew;
75 10 unneback
`endif
76
 
77
`ifndef CNT_REW
78
   assign q_next =
79
`else
80
     assign q_next_fw =
81
`endif
82
`ifdef CNT_CLEAR
83 20 unneback
       clear ? cnt_length'd0 :
84 10 unneback
`endif
85
`ifdef CNT_SET
86
         set ? set_value :
87
`endif
88
`ifdef CNT_WRAP
89 20 unneback
           (qi == wrap_value) ? cnt_length'd0 :
90 10 unneback
`endif
91
`ifdef CNT_TYPE_LFSR
92
             {qi[`CNT_INDEX:1],~(`LFSR_FB)};
93
`else
94 20 unneback
   qi + cnt_length'd1;
95 10 unneback
`endif
96
 
97
`ifdef CNT_REW
98
   assign q_next_rew =
99
 `ifdef CNT_CLEAR
100 20 unneback
     clear ? cnt_length'd0 :
101 10 unneback
 `endif
102
 `ifdef CNT_SET
103
       set ? set_value :
104
 `endif
105
 `ifdef CNT_WRAP
106 20 unneback
         (qi == cnt_length'd0) ? wrap_value :
107 10 unneback
 `endif
108
 `ifdef CNT_TYPE_LFSR
109 20 unneback
           {~(`LFSR_FB_REW),qi[cnt_length:2]};
110 10 unneback
 `else
111 20 unneback
   qi - cnt_length'd1;
112 10 unneback
 `endif
113
`endif
114
 
115
`ifdef CNT_REW
116
   assign q_next = rew ? q_next_rew : q_next_fw;
117
`endif
118
 
119
   always @ (posedge clk or posedge rst)
120
     if (rst)
121 20 unneback
       qi <= cnt_length'd0;
122 10 unneback
     else
123
`ifdef CNT_CE
124
   if (cke)
125
`endif
126 13 unneback
     qi <= q_next;
127 10 unneback
 
128
`ifdef CNT_Q
129
 `ifdef CNT_TYPE_GRAY
130
   always @ (posedge clk or posedge rst)
131
     if (rst)
132 12 unneback
       q <= `CNT_RESET_VALUE;
133 10 unneback
     else
134
  `ifdef CNT_CE
135
       if (cke)
136
  `endif
137
         q <= (q_next>>1) ^ q_next;
138
  `ifdef CNT_Q_BIN
139
   assign q_bin = qi;
140
  `endif
141
 `else
142
   assign q = q_next;
143
 `endif
144
`endif
145
 
146
`ifdef CNT_Z
147 20 unneback
   assign z = (q == cnt_length'd0);
148 10 unneback
`endif
149
 
150
`ifdef CNT_ZQ
151
   always @ (posedge clk or posedge rst)
152
     if (rst)
153
       zq <= 1'b1;
154
     else
155
 `ifdef CNT_CE
156
       if (cke)
157
 `endif
158 20 unneback
         zq <= q_next == cnt_length'd0;
159 10 unneback
`endif
160 20 unneback
 
161
`ifdef CNT_LEVEL1
162
    always @ (posedge clk or posedge rst)
163
        if (rst)
164
            level1 <= 1'b0;
165
        else
166
 `ifdef CNT_CE
167
        if (cke)
168
 `endif
169
            if (q_next == level1_value)
170
                level1 <= 1'b1;
171
            else if (q == level1_value & rew)
172
                level1 <= 1'b0;
173
`endif
174
 
175
`ifdef CNT_LEVEL2
176
    always @ (posedge clk or posedge rst)
177
        if (rst)
178
            level2 <= 1'b0;
179
        else
180
 `ifdef CNT_CE
181
        if (cke)
182
 `endif
183
            if (q_next == level2_value)
184
                level2 <= 1'b1;
185
            else if (q == level2_value & rew)
186
                level2 <= 1'b0;
187
`endif
188
 
189 10 unneback
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.