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

Subversion Repositories crcahb

[/] [crcahb/] [trunk/] [rtl/] [crc_control_unit.v] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 julioameri
module crc_control_unit
2
(
3
 //OUTPUTS
4
 output reg [1:0] byte_sel,
5
 output bypass_byte0,
6
 output buffer_full,
7
 output read_wait,
8
 output bypass_size,
9
 output set_crc_init_sel,
10
 output clear_crc_init_sel,
11
 output crc_out_en,
12
 output byte_en,
13
 output reset_pending,
14
 //INPUTS
15
 input [1:0] size_in,
16
 input write,
17
 input reset_chain,
18
 input clk,
19
 input rst_n
20
);
21
 
22
//States definition for state_full
23
localparam EMPTY   = 2'b00;
24
localparam WRITE_1 = 2'b01;
25
localparam WRITE_2 = 2'b10;
26
localparam BYPASS  = 2'b11;
27
 
28
//States definition for state_byte
29
localparam IDLE   = 3'b100;
30
localparam BYTE_0 = 3'b000;
31
localparam BYTE_1 = 3'b001;
32
localparam BYTE_2 = 3'b010;
33
localparam BYTE_3 = 3'b011;
34
 
35
//States definition for state_reset
36
localparam NO_RESET = 3'b000;
37
localparam RESET    = 3'b001;
38
localparam WAIT     = 3'b010;
39
localparam WRITE    = 3'b011;
40
localparam RESET_2  = 3'b100;
41
 
42
//Coding for size signal
43
localparam BYTE      = 2'b00;
44
localparam HALF_WORD = 2'b01;
45
localparam WORD      = 2'b10;
46
 
47
//Flops Definition
48
reg [1:0] state_full;
49
reg [2:0] state_byte;
50
reg [2:0] state_reset;
51
 
52
//Internal signals
53
reg [1:0] next_state_full;
54
reg [2:0] next_state_byte;
55
reg [2:0] next_state_reset;
56
 
57
wire last_byte;
58
wire has_data;
59
 
60
 
61
//FSM for management of writes in the input buffers 
62
//Definition of state register
63
always @(posedge clk)
64
 begin
65
  if(!rst_n)
66
   state_full <= EMPTY;
67
  else
68
   state_full <= next_state_full;
69
 end
70
 
71
//This signal indicates that the last byte is in processing
72
assign last_byte = (size_in == BYTE      && state_byte == BYTE_0) ||
73
                   (size_in == HALF_WORD && state_byte == BYTE_1) ||
74
                   (size_in == WORD      && state_byte == BYTE_3) ;
75
 
76
//Next state Logic
77
always @(*)
78
 begin
79
  next_state_full = state_full;
80
  case(state_full)
81
   EMPTY  : next_state_full = (write) ? WRITE_1 : EMPTY;
82
   WRITE_1:
83
    begin
84
     if(last_byte)
85
      begin
86
       if(!write)
87
        next_state_full = EMPTY;
88
      end
89
     else
90
      begin
91
       if(write)
92
        next_state_full = WRITE_2;
93
      end
94
    end
95
   WRITE_2:
96
    begin
97
     if(last_byte)
98
      next_state_full = (write) ? BYPASS : WRITE_1;
99
    end
100
   BYPASS :
101
    begin
102
     if(last_byte && !write)
103
      next_state_full = WRITE_1;
104
    end
105
  endcase
106
 end
107
 
108
//The flag full indicates that buffer is full and any attempt of writing must wait
109
assign buffer_full = (state_full == WRITE_2 && !last_byte) ||
110
                     (state_full == BYPASS  && !last_byte);
111
 
112
assign read_wait = (state_byte != IDLE);
113
 
114
//This signal controls the selection of the byte0 
115
//When bypass_byte0 = 1 the input of byte_ff is taken
116
//Otherwise, its output is taken
117
assign bypass_byte0 = (state_full != BYPASS);
118
 
119
//This signal indicates that there are data in the second position of the buffer
120
assign has_data = (state_full == WRITE_2) ||
121
                  (state_full == BYPASS ) ;
122
 
123
 
124
//FSM for management of readings in the buffer
125
//Definition of state register
126
always @(posedge clk)
127
 begin
128
  if(!rst_n)
129
   state_byte <= IDLE;
130
  else
131
   state_byte <= next_state_byte;
132
 end
133
 
134
always @(*)
135
 begin
136
  next_state_byte = state_byte;
137
  case(state_byte)
138
   IDLE: next_state_byte = (write) ? BYTE_0 : IDLE;
139
   BYTE_0:
140
    begin
141
     if(size_in == BYTE)
142
      begin
143
       if(!write && !has_data)
144
        next_state_byte = IDLE;
145
      end
146
     else
147
      begin
148
       next_state_byte = BYTE_1;
149
      end
150
    end
151
   BYTE_1:
152
    begin
153
     if(size_in == HALF_WORD)
154
      begin
155
       if(has_data || (write && !buffer_full))
156
        next_state_byte = BYTE_0;
157
       else
158
        next_state_byte = IDLE;
159
      end
160
     else
161
      begin
162
       next_state_byte = BYTE_2;
163
      end
164
    end
165
   BYTE_2:
166
    begin
167
     next_state_byte = BYTE_3;
168
    end
169
   BYTE_3:
170
    begin
171
     if(has_data || (write && !buffer_full))
172
      next_state_byte = BYTE_0;
173
     else
174
      next_state_byte = IDLE;
175
    end
176
  endcase
177
 end
178
 
179
//The signal byte_sel controls the number of byte that will be processed by CRC Unit
180
always @(*)
181
 begin
182
  byte_sel = 2'b00;
183
  case(state_byte)
184
   BYTE_0: byte_sel = BYTE_0;
185
   BYTE_1: byte_sel = BYTE_1;
186
   BYTE_2: byte_sel = BYTE_2;
187
   BYTE_3: byte_sel = BYTE_3;
188
  endcase
189
 end
190
//This signal controls the selection of the metadata size 
191
//When bypass_size = 1 the input of size_ff is taken
192
//Otherwise, its output is taken
193
assign bypass_size = !( (state_full != BYPASS && state_byte != BYTE_0) ||
194
                        (state_full == BYPASS)
195
                      );
196
 
197
//This signal enables the write in the crc_out register
198
assign crc_out_en = (state_byte != IDLE);
199
 
200
//
201
assign byte_en = (state_byte == BYTE_0 && (size_in == HALF_WORD || size_in == WORD) && state_full != BYPASS) ||
202
                 (last_byte && has_data);
203
 
204
//FSM for control of reset of chained operation
205
//Definition of state register
206
always @(posedge clk)
207
 begin
208
  if(!rst_n)
209
   state_reset <= NO_RESET;
210
  else
211
   state_reset <= next_state_reset;
212
 end
213
 
214
always @(*)
215
 begin
216
  next_state_reset = state_reset;
217
  case(state_reset)
218
   NO_RESET:
219
    begin
220
     if((reset_chain && !has_data && state_byte != IDLE && !last_byte) || (reset_chain && has_data && last_byte))
221
      next_state_reset = RESET;
222
     if(reset_chain  && has_data && !last_byte)
223
      next_state_reset = WAIT;
224
    end
225
   RESET:
226
    begin
227
     if(last_byte)
228
      next_state_reset = NO_RESET;
229
     else
230
      next_state_reset = (write) ? WRITE : RESET;
231
    end
232
   WAIT:
233
    begin
234
     if(last_byte)
235
      next_state_reset = (write) ? WRITE : RESET;
236
     else
237
      next_state_reset = WAIT;
238
    end
239
   WRITE:
240
    begin
241
     if(reset_chain)
242
      next_state_reset = (last_byte) ? RESET : RESET_2;
243
     else
244
      next_state_reset = (last_byte) ? NO_RESET : WRITE;
245
    end
246
   RESET_2:
247
    begin
248
     if(last_byte)
249
      next_state_reset = (write) ? WRITE : RESET;
250
     else
251
      next_state_reset = RESET_2;
252
    end
253
  endcase
254
 end
255
 
256
//This signal set the crc_init_sel flop
257
//When seted this flop turn on the chained operation of crc 
258
assign set_crc_init_sel = (state_byte == BYTE_0);
259
 
260
//This signal clear the crc_init_sel
261
//The clear get priority over set
262
assign clear_crc_init_sel = (state_reset == NO_RESET && last_byte && reset_chain) ||
263
                            (state_byte  == IDLE     && reset_chain             ) ||
264
                            (state_reset == RESET    && last_byte               ) ||
265
                            (state_reset == WRITE    && last_byte               ) ||
266
                            (state_reset == RESET_2  && last_byte               ) ;
267
 
268
assign reset_pending = (state_reset != NO_RESET);
269
 
270
endmodule

powered by: WebSVN 2.1.0

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