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

Subversion Repositories can

[/] [can/] [tags/] [rel_3/] [rtl/] [verilog/] [can_bsp.v] - Blame information for rev 36

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

Line No. Rev Author Line
1 2 mohor
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  can_bsp.v                                                   ////
4
////                                                              ////
5
////                                                              ////
6 9 mohor
////  This file is part of the CAN Protocol Controller            ////
7 2 mohor
////  http://www.opencores.org/projects/can/                      ////
8
////                                                              ////
9
////                                                              ////
10
////  Author(s):                                                  ////
11
////       Igor Mohor                                             ////
12
////       igorm@opencores.org                                    ////
13
////                                                              ////
14
////                                                              ////
15 9 mohor
////  All additional information is available in the README.txt   ////
16 2 mohor
////  file.                                                       ////
17
////                                                              ////
18
//////////////////////////////////////////////////////////////////////
19
////                                                              ////
20 9 mohor
//// Copyright (C) 2002, 2003 Authors                             ////
21 2 mohor
////                                                              ////
22
//// This source file may be used and distributed without         ////
23
//// restriction provided that this copyright statement is not    ////
24
//// removed from the file and that any derivative work contains  ////
25
//// the original copyright notice and the associated disclaimer. ////
26
////                                                              ////
27
//// This source file is free software; you can redistribute it   ////
28
//// and/or modify it under the terms of the GNU Lesser General   ////
29
//// Public License as published by the Free Software Foundation; ////
30
//// either version 2.1 of the License, or (at your option) any   ////
31
//// later version.                                               ////
32
////                                                              ////
33
//// This source is distributed in the hope that it will be       ////
34
//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
35
//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
36
//// PURPOSE.  See the GNU Lesser General Public License for more ////
37
//// details.                                                     ////
38
////                                                              ////
39
//// You should have received a copy of the GNU Lesser General    ////
40
//// Public License along with this source; if not, download it   ////
41
//// from http://www.opencores.org/lgpl.shtml                     ////
42
////                                                              ////
43 28 mohor
//// The CAN protocol is developed by Robert Bosch GmbH and       ////
44
//// protected by patents. Anybody who wants to implement this    ////
45
//// CAN IP core on silicon has to obtain a CAN protocol license  ////
46
//// from Bosch.                                                  ////
47
////                                                              ////
48 2 mohor
//////////////////////////////////////////////////////////////////////
49
//
50
// CVS Revision History
51
//
52
// $Log: not supported by cvs2svn $
53 36 mohor
// Revision 1.23  2003/02/14 20:17:01  mohor
54
// Several registers added. Not finished, yet.
55
//
56 35 mohor
// Revision 1.22  2003/02/12 14:23:59  mohor
57
// abort_tx added. Bit destuff fixed.
58
//
59 32 mohor
// Revision 1.21  2003/02/11 00:56:06  mohor
60
// Wishbone interface added.
61
//
62 31 mohor
// Revision 1.20  2003/02/10 16:02:11  mohor
63
// CAN is working according to the specification. WB interface and more
64
// registers (status, IRQ, ...) needs to be added.
65
//
66 30 mohor
// Revision 1.19  2003/02/09 18:40:29  mohor
67
// Overload fixed. Hard synchronization also enabled at the last bit of
68
// interframe.
69
//
70 29 mohor
// Revision 1.18  2003/02/09 02:24:33  mohor
71
// Bosch license warning added. Error counters finished. Overload frames
72
// still need to be fixed.
73
//
74 28 mohor
// Revision 1.17  2003/02/04 17:24:41  mohor
75
// Backup.
76
//
77 26 mohor
// Revision 1.16  2003/02/04 14:34:52  mohor
78
// *** empty log message ***
79
//
80 25 mohor
// Revision 1.15  2003/01/31 01:13:37  mohor
81
// backup.
82
//
83 24 mohor
// Revision 1.14  2003/01/16 13:36:19  mohor
84
// Form error supported. When receiving messages, last bit of the end-of-frame
85
// does not generate form error. Receiver goes to the idle mode one bit sooner.
86
// (CAN specification ver 2.0, part B, page 57).
87
//
88 22 mohor
// Revision 1.13  2003/01/15 21:59:45  mohor
89
// Data is stored to fifo at the end of ack stage.
90
//
91 21 mohor
// Revision 1.12  2003/01/15 21:05:11  mohor
92
// CRC checking fixed (when bitstuff occurs at the end of a CRC sequence).
93
//
94 20 mohor
// Revision 1.11  2003/01/15 14:40:23  mohor
95 31 mohor
// RX state machine fixed to receive "remote request" frames correctly.
96
// No data bytes are written to fifo when such frames are received.
97 20 mohor
//
98 19 mohor
// Revision 1.10  2003/01/15 13:16:47  mohor
99 31 mohor
// When a frame with "remote request" is received, no data is stored to
100
// fifo, just the frame information (identifier, ...). Data length that
101
// is stored is the received data length and not the actual data length
102
// that is stored to fifo.
103 19 mohor
//
104 18 mohor
// Revision 1.9  2003/01/14 12:19:35  mohor
105
// rx_fifo is now working.
106
//
107 16 mohor
// Revision 1.8  2003/01/10 17:51:33  mohor
108
// Temporary version (backup).
109
//
110 15 mohor
// Revision 1.7  2003/01/09 21:54:45  mohor
111
// rx fifo added. Not 100 % verified, yet.
112
//
113 14 mohor
// Revision 1.6  2003/01/09 14:46:58  mohor
114
// Temporary files (backup).
115
//
116 13 mohor
// Revision 1.5  2003/01/08 13:30:31  mohor
117
// Temp version.
118
//
119 12 mohor
// Revision 1.4  2003/01/08 02:10:53  mohor
120
// Acceptance filter added.
121
//
122 11 mohor
// Revision 1.3  2002/12/28 04:13:23  mohor
123
// Backup version.
124
//
125 10 mohor
// Revision 1.2  2002/12/27 00:12:52  mohor
126
// Header changed, testbench improved to send a frame (crc still missing).
127
//
128 9 mohor
// Revision 1.1.1.1  2002/12/20 16:39:21  mohor
129
// Initial
130 2 mohor
//
131
//
132 9 mohor
//
133 2 mohor
 
134
// synopsys translate_off
135
`include "timescale.v"
136
// synopsys translate_on
137
`include "can_defines.v"
138
 
139
module can_bsp
140
(
141
  clk,
142 10 mohor
  rst,
143
 
144
  sample_point,
145
  sampled_bit,
146
  sampled_bit_q,
147 24 mohor
  tx_point,
148 11 mohor
  hard_sync,
149
 
150 14 mohor
  addr,
151 35 mohor
  data_in,
152 14 mohor
  data_out,
153 35 mohor
 
154 14 mohor
 
155
 
156 11 mohor
  /* Mode register */
157 10 mohor
  reset_mode,
158 36 mohor
  listen_only_mode,
159 11 mohor
  acceptance_filter_mode,
160 36 mohor
  self_test_mode,
161 11 mohor
 
162 15 mohor
  /* Command register */
163
  release_buffer,
164 25 mohor
  tx_request,
165 32 mohor
  abort_tx,
166 36 mohor
  self_rx_request,
167
  single_shot_transmission,
168 15 mohor
 
169 35 mohor
  /* Error Warning Limit register */
170
  error_warning_limit,
171
 
172
  /* Rx Error Counter register */
173
  we_rx_err_cnt,
174
 
175
  /* Tx Error Counter register */
176
  we_tx_err_cnt,
177
 
178 15 mohor
  /* Clock Divider register */
179 11 mohor
  extended_mode,
180
 
181
  rx_idle,
182 24 mohor
  transmitting,
183 29 mohor
  last_bit_of_inter,
184 35 mohor
  set_reset_mode,
185
  node_bus_off,
186
  error_status,
187
  rx_err_cnt,
188
  tx_err_cnt,
189
  transmit_status,
190
  receive_status,
191
  tx_successful,
192
  need_to_tx,
193
  overrun,
194
  info_empty,
195 36 mohor
  go_error_frame,
196
  priority_lost,
197
  node_error_passive,
198
  node_error_active,
199 11 mohor
 
200 35 mohor
 
201 36 mohor
 
202 11 mohor
  /* This section is for BASIC and EXTENDED mode */
203
  /* Acceptance code register */
204
  acceptance_code_0,
205
 
206
  /* Acceptance mask register */
207
  acceptance_mask_0,
208
  /* End: This section is for BASIC and EXTENDED mode */
209 10 mohor
 
210 11 mohor
  /* This section is for EXTENDED mode */
211
  /* Acceptance code register */
212
  acceptance_code_1,
213
  acceptance_code_2,
214
  acceptance_code_3,
215 10 mohor
 
216 11 mohor
  /* Acceptance mask register */
217
  acceptance_mask_1,
218
  acceptance_mask_2,
219 18 mohor
  acceptance_mask_3,
220 11 mohor
  /* End: This section is for EXTENDED mode */
221 10 mohor
 
222 18 mohor
  /* Tx data registers. Holding identifier (basic mode), tx frame information (extended mode) and data */
223
  tx_data_0,
224
  tx_data_1,
225
  tx_data_2,
226
  tx_data_3,
227
  tx_data_4,
228
  tx_data_5,
229
  tx_data_6,
230
  tx_data_7,
231
  tx_data_8,
232
  tx_data_9,
233
  tx_data_10,
234
  tx_data_11,
235 24 mohor
  tx_data_12,
236 18 mohor
  /* End: Tx data registers */
237 24 mohor
 
238
  /* Tx signal */
239 28 mohor
  tx,
240
  tx_oen
241 18 mohor
 
242 2 mohor
);
243
 
244
parameter Tp = 1;
245
 
246 10 mohor
input         clk;
247
input         rst;
248
input         sample_point;
249
input         sampled_bit;
250
input         sampled_bit_q;
251 24 mohor
input         tx_point;
252 11 mohor
input         hard_sync;
253 14 mohor
input   [7:0] addr;
254 35 mohor
input   [7:0] data_in;
255 14 mohor
output  [7:0] data_out;
256 11 mohor
 
257 14 mohor
 
258 10 mohor
input         reset_mode;
259 36 mohor
input         listen_only_mode;
260 11 mohor
input         acceptance_filter_mode;
261
input         extended_mode;
262 36 mohor
input         self_test_mode;
263 2 mohor
 
264 35 mohor
 
265 15 mohor
/* Command register */
266
input         release_buffer;
267 25 mohor
input         tx_request;
268 32 mohor
input         abort_tx;
269 36 mohor
input         self_rx_request;
270
input         single_shot_transmission;
271 11 mohor
 
272 35 mohor
/* Error Warning Limit register */
273
input   [7:0] error_warning_limit;
274
 
275
/* Rx Error Counter register */
276
input         we_rx_err_cnt;
277
 
278
/* Tx Error Counter register */
279
input         we_tx_err_cnt;
280
 
281 10 mohor
output        rx_idle;
282 24 mohor
output        transmitting;
283 29 mohor
output        last_bit_of_inter;
284 35 mohor
output        set_reset_mode;
285
output        node_bus_off;
286
output        error_status;
287
output  [8:0] rx_err_cnt;
288
output  [8:0] tx_err_cnt;
289
output        transmit_status;
290
output        receive_status;
291
output        tx_successful;
292
output        need_to_tx;
293
output        overrun;
294
output        info_empty;
295 36 mohor
output        go_error_frame;
296
output        priority_lost;
297
output        node_error_passive;
298
output        node_error_active;
299 2 mohor
 
300 29 mohor
 
301 11 mohor
/* This section is for BASIC and EXTENDED mode */
302
/* Acceptance code register */
303
input   [7:0] acceptance_code_0;
304
 
305
/* Acceptance mask register */
306
input   [7:0] acceptance_mask_0;
307
 
308
/* End: This section is for BASIC and EXTENDED mode */
309
 
310
 
311
/* This section is for EXTENDED mode */
312
/* Acceptance code register */
313
input   [7:0] acceptance_code_1;
314
input   [7:0] acceptance_code_2;
315
input   [7:0] acceptance_code_3;
316
 
317
/* Acceptance mask register */
318
input   [7:0] acceptance_mask_1;
319
input   [7:0] acceptance_mask_2;
320
input   [7:0] acceptance_mask_3;
321
/* End: This section is for EXTENDED mode */
322
 
323 24 mohor
/* Tx data registers. Holding identifier (basic mode), tx frame information (extended mode) and data */
324 18 mohor
input   [7:0] tx_data_0;
325
input   [7:0] tx_data_1;
326
input   [7:0] tx_data_2;
327
input   [7:0] tx_data_3;
328
input   [7:0] tx_data_4;
329
input   [7:0] tx_data_5;
330
input   [7:0] tx_data_6;
331
input   [7:0] tx_data_7;
332
input   [7:0] tx_data_8;
333
input   [7:0] tx_data_9;
334
input   [7:0] tx_data_10;
335
input   [7:0] tx_data_11;
336
input   [7:0] tx_data_12;
337 24 mohor
/* End: Tx data registers */
338 11 mohor
 
339 24 mohor
/* Tx signal */
340
output        tx;
341 28 mohor
output        tx_oen;
342 11 mohor
 
343 10 mohor
reg           reset_mode_q;
344
reg     [5:0] bit_cnt;
345 2 mohor
 
346 10 mohor
reg     [3:0] data_len;
347
reg    [28:0] id;
348
reg     [2:0] bit_stuff_cnt;
349 25 mohor
reg     [2:0] bit_stuff_cnt_tx;
350
reg           tx_point_q;
351 10 mohor
 
352
reg           rx_idle;
353
reg           rx_id1;
354
reg           rx_rtr1;
355
reg           rx_ide;
356
reg           rx_id2;
357
reg           rx_rtr2;
358
reg           rx_r1;
359
reg           rx_r0;
360
reg           rx_dlc;
361
reg           rx_data;
362
reg           rx_crc;
363 11 mohor
reg           rx_crc_lim;
364 10 mohor
reg           rx_ack;
365 11 mohor
reg           rx_ack_lim;
366 10 mohor
reg           rx_eof;
367 24 mohor
reg           rx_inter;
368 10 mohor
 
369 19 mohor
reg           rtr1;
370
reg           ide;
371
reg           rtr2;
372
reg    [14:0] crc_in;
373
 
374 24 mohor
reg     [7:0] tmp_data;
375
reg     [7:0] tmp_fifo [0:7];
376
reg           write_data_to_tmp_fifo;
377
reg     [2:0] byte_cnt;
378
reg           bit_stuff_cnt_en;
379 35 mohor
reg           bit_stuff_cnt_tx_en;
380 11 mohor
reg           crc_enable;
381
 
382 10 mohor
reg     [2:0] eof_cnt;
383 28 mohor
reg     [2:0] passive_cnt;
384
 
385 24 mohor
reg           transmitting;
386 10 mohor
 
387 24 mohor
reg           error_frame;
388 28 mohor
reg           error_frame_q;
389 24 mohor
reg           enable_error_cnt2;
390
reg     [2:0] error_cnt1;
391
reg     [2:0] error_cnt2;
392 29 mohor
reg     [2:0] delayed_dominant_cnt;
393
reg           enable_overload_cnt2;
394 30 mohor
reg           overload_frame;
395
reg           overload_frame_blocked;
396 29 mohor
reg     [2:0] overload_cnt1;
397
reg     [2:0] overload_cnt2;
398 24 mohor
reg           tx;
399 28 mohor
reg           crc_err;
400 24 mohor
 
401 25 mohor
reg           priority_lost;
402
reg           tx_q;
403
 
404 28 mohor
reg           need_to_tx;   // When the CAN core has something to transmit and a dominant bit is sampled at the third bit
405 25 mohor
reg     [3:0] data_cnt;     // Counting the data bytes that are written to FIFO
406
reg     [2:0] header_cnt;   // Counting header length
407
reg           wr_fifo;      // Write data and header to 64-byte fifo
408
reg     [7:0] data_for_fifo;// Multiplexed data that is stored to 64-byte fifo
409
 
410
reg     [5:0] tx_pointer;
411
reg           tx_bit;
412
reg           tx_state;
413 28 mohor
reg           transmitter;
414 25 mohor
reg           finish_msg;
415
 
416 35 mohor
reg     [8:0] rx_err_cnt;
417
reg     [8:0] tx_err_cnt;
418 28 mohor
reg           rx_err_cnt_blocked;
419 35 mohor
reg     [3:0] bus_free_cnt;
420
reg           bus_free_cnt_en;
421
reg           bus_free;
422
reg           waiting_for_bus_free;
423 28 mohor
 
424
reg           node_error_passive;
425
reg           node_bus_off;
426 35 mohor
reg           node_bus_off_q;
427 28 mohor
reg           ack_err_latched;
428
reg           bit_err_latched;
429
reg           stuff_err_latched;
430
reg           form_err_latched;
431
reg           rule5;
432
reg           rule3_exc1_1;
433
reg           rule3_exc1_2;
434
reg           rule3_exc2;
435
reg           suspend;
436
reg           susp_cnt_en;
437
reg     [2:0] susp_cnt;
438
reg           go_error_frame_q;
439
reg           error_flag_over_blocked;
440
 
441
wire          bit_de_stuff;
442
wire          bit_de_stuff_tx;
443
 
444
 
445
/* Rx state machine */
446
wire          go_rx_idle;
447
wire          go_rx_id1;
448
wire          go_rx_rtr1;
449
wire          go_rx_ide;
450
wire          go_rx_id2;
451
wire          go_rx_rtr2;
452
wire          go_rx_r1;
453
wire          go_rx_r0;
454
wire          go_rx_dlc;
455
wire          go_rx_data;
456
wire          go_rx_crc;
457
wire          go_rx_crc_lim;
458
wire          go_rx_ack;
459
wire          go_rx_ack_lim;
460
wire          go_rx_eof;
461
wire          go_overload_frame;
462
wire          go_rx_inter;
463
 
464
wire          go_crc_enable;
465
wire          rst_crc_enable;
466
 
467
wire          bit_de_stuff_set;
468
wire          bit_de_stuff_reset;
469
 
470
wire          go_early_tx;
471
wire          go_tx;
472
 
473
wire   [14:0] calculated_crc;
474
wire   [15:0] r_calculated_crc;
475
wire          remote_rq;
476
wire    [3:0] limited_data_len;
477
wire          form_err;
478
 
479
wire          error_frame_ended;
480
wire          overload_frame_ended;
481
wire          bit_err;
482
wire          ack_err;
483
wire          stuff_err;
484 29 mohor
                                    // of intermission, it starts reading the identifier (and transmitting its own).
485
wire          overload_needed = 0;  // When receiver is busy, it needs to send overload frame. Only 2 overload frames are allowed to
486 36 mohor
                                    // be send in a row. This is not implemented because host can not send an overload request.
487 28 mohor
 
488 29 mohor
wire          id_ok;                // If received ID matches ID set in registers
489
wire          no_byte0;             // There is no byte 0 (RTR bit set to 1 or DLC field equal to 0). Signal used for acceptance filter.
490
wire          no_byte1;             // There is no byte 1 (RTR bit set to 1 or DLC field equal to 1). Signal used for acceptance filter.
491 28 mohor
 
492 25 mohor
wire    [2:0] header_len;
493
wire          storing_header;
494
wire    [3:0] limited_data_len_minus1;
495
wire          reset_wr_fifo;
496 28 mohor
wire          err;
497 25 mohor
 
498 28 mohor
wire          arbitration_field;
499 25 mohor
 
500 28 mohor
wire   [18:0] basic_chain;
501
wire   [63:0] basic_chain_data;
502
wire   [18:0] extended_chain_std;
503
wire   [38:0] extended_chain_ext;
504
wire   [63:0] extended_chain_data;
505
 
506
wire          rst_tx_pointer;
507
 
508
wire    [7:0] r_tx_data_0;
509
wire    [7:0] r_tx_data_1;
510
wire    [7:0] r_tx_data_2;
511
wire    [7:0] r_tx_data_3;
512
wire    [7:0] r_tx_data_4;
513
wire    [7:0] r_tx_data_5;
514
wire    [7:0] r_tx_data_6;
515
wire    [7:0] r_tx_data_7;
516
wire    [7:0] r_tx_data_8;
517
wire    [7:0] r_tx_data_9;
518
wire    [7:0] r_tx_data_10;
519
wire    [7:0] r_tx_data_11;
520
wire    [7:0] r_tx_data_12;
521
 
522
wire          send_ack;
523
wire          bit_err_exc1;
524
wire          bit_err_exc2;
525
wire          bit_err_exc3;
526
wire          bit_err_exc4;
527 30 mohor
wire          bit_err_exc5;
528 28 mohor
wire          error_flag_over;
529 29 mohor
wire          overload_flag_over;
530 28 mohor
 
531
 
532 35 mohor
assign go_rx_idle     =                   sample_point &  sampled_bit & last_bit_of_inter | bus_free & (~node_bus_off);
533 29 mohor
assign go_rx_id1      =                   sample_point &  (~sampled_bit) & (rx_idle | last_bit_of_inter);
534 11 mohor
assign go_rx_rtr1     = (~bit_de_stuff) & sample_point &  rx_id1  & (bit_cnt == 10);
535
assign go_rx_ide      = (~bit_de_stuff) & sample_point &  rx_rtr1;
536
assign go_rx_id2      = (~bit_de_stuff) & sample_point &  rx_ide  &   sampled_bit;
537
assign go_rx_rtr2     = (~bit_de_stuff) & sample_point &  rx_id2  & (bit_cnt == 17);
538
assign go_rx_r1       = (~bit_de_stuff) & sample_point &  rx_rtr2;
539
assign go_rx_r0       = (~bit_de_stuff) & sample_point & (rx_ide  & (~sampled_bit) | rx_r1);
540
assign go_rx_dlc      = (~bit_de_stuff) & sample_point &  rx_r0;
541 19 mohor
assign go_rx_data     = (~bit_de_stuff) & sample_point &  rx_dlc  & (bit_cnt == 3) &  (sampled_bit   |   (|data_len[2:0])) & (~remote_rq);
542
assign go_rx_crc      = (~bit_de_stuff) & sample_point & (rx_dlc  & (bit_cnt == 3) & ((~sampled_bit) & (~(|data_len[2:0])) | remote_rq) |
543
                                                          rx_data & (bit_cnt == ((limited_data_len<<3) - 1'b1)));
544 20 mohor
assign go_rx_crc_lim  = (~bit_de_stuff) & sample_point &  rx_crc  & (bit_cnt == 14);
545 11 mohor
assign go_rx_ack      =                   sample_point &  rx_crc_lim;
546
assign go_rx_ack_lim  =                   sample_point &  rx_ack;
547 35 mohor
assign go_rx_eof      =                   sample_point &  rx_ack_lim;
548 30 mohor
assign go_rx_inter    =                 ((sample_point &  rx_eof  & (eof_cnt == 6)) | error_frame_ended | overload_frame_ended) & (~overload_needed);
549 10 mohor
 
550 28 mohor
assign go_error_frame = (form_err | stuff_err | bit_err | ack_err | (crc_err & go_rx_eof));
551 24 mohor
assign error_frame_ended = (error_cnt2 == 7) & tx_point;
552 29 mohor
assign overload_frame_ended = (overload_cnt2 == 7) & tx_point;
553 24 mohor
 
554 30 mohor
assign go_overload_frame = (   ((sample_point &  rx_eof  & (eof_cnt == 6)) | error_frame_ended | overload_frame_ended) & overload_needed |
555
                               sample_point & (~sampled_bit) & rx_inter & (bit_cnt < 2)                                                  |
556
                               sample_point & (~sampled_bit) & ((error_cnt2 == 7) | (overload_cnt2 == 7))
557
                           )
558
                           & (~overload_frame_blocked)
559
                           ;
560 24 mohor
 
561 25 mohor
 
562
assign go_crc_enable  = hard_sync | go_tx;
563 11 mohor
assign rst_crc_enable = go_rx_crc;
564 10 mohor
 
565 32 mohor
assign bit_de_stuff_set   = go_rx_id1 & (~go_error_frame);
566 30 mohor
assign bit_de_stuff_reset = go_rx_crc_lim | reset_mode | go_error_frame | go_overload_frame;
567 11 mohor
 
568 19 mohor
assign remote_rq = ((~ide) & rtr1) | (ide & rtr2);
569
assign limited_data_len = (data_len < 8)? data_len : 4'h8;
570 11 mohor
 
571 36 mohor
assign ack_err = rx_ack & sample_point & sampled_bit & tx_state & (~self_test_mode);
572 30 mohor
assign bit_err = (tx_state | error_frame | overload_frame | rx_ack) & sample_point & (tx !== sampled_bit) & (~bit_err_exc1) & (~bit_err_exc2) & (~bit_err_exc3) & (~bit_err_exc4) & (~bit_err_exc5);
573 28 mohor
assign bit_err_exc1 = tx_state & arbitration_field & tx;
574
assign bit_err_exc2 = rx_ack & tx;
575
assign bit_err_exc3 = error_frame & node_error_passive & (error_cnt1 < 7);
576 29 mohor
assign bit_err_exc4 = (error_frame & (error_cnt1 == 7) & (~enable_error_cnt2)) | (overload_frame & (overload_cnt1 == 7) & (~enable_overload_cnt2));
577 30 mohor
assign bit_err_exc5 = (error_frame & (error_cnt2 == 7)) | (overload_frame & (overload_cnt2 == 7));
578 19 mohor
 
579 28 mohor
assign arbitration_field = rx_id1 | rx_rtr1 | rx_ide | rx_id2 | rx_rtr2;
580 25 mohor
 
581 29 mohor
assign last_bit_of_inter = rx_inter & (bit_cnt == 2);
582 25 mohor
 
583 26 mohor
 
584 10 mohor
// Rx idle state
585
always @ (posedge clk or posedge rst)
586
begin
587
  if (rst)
588 24 mohor
    rx_idle <= 1'b0;
589
  else if (reset_mode | go_rx_id1 | error_frame)
590 10 mohor
    rx_idle <=#Tp 1'b0;
591
  else if (go_rx_idle)
592
    rx_idle <=#Tp 1'b1;
593
end
594
 
595
 
596
// Rx id1 state
597
always @ (posedge clk or posedge rst)
598
begin
599
  if (rst)
600
    rx_id1 <= 1'b0;
601 24 mohor
  else if (reset_mode | go_rx_rtr1 | error_frame)
602 10 mohor
    rx_id1 <=#Tp 1'b0;
603
  else if (go_rx_id1)
604
    rx_id1 <=#Tp 1'b1;
605
end
606
 
607
 
608
// Rx rtr1 state
609
always @ (posedge clk or posedge rst)
610
begin
611
  if (rst)
612
    rx_rtr1 <= 1'b0;
613 24 mohor
  else if (reset_mode | go_rx_ide | error_frame)
614 10 mohor
    rx_rtr1 <=#Tp 1'b0;
615
  else if (go_rx_rtr1)
616
    rx_rtr1 <=#Tp 1'b1;
617
end
618
 
619
 
620
// Rx ide state
621
always @ (posedge clk or posedge rst)
622
begin
623
  if (rst)
624
    rx_ide <= 1'b0;
625 24 mohor
  else if (reset_mode | go_rx_r0 | go_rx_id2 | error_frame)
626 10 mohor
    rx_ide <=#Tp 1'b0;
627
  else if (go_rx_ide)
628
    rx_ide <=#Tp 1'b1;
629
end
630
 
631
 
632
// Rx id2 state
633
always @ (posedge clk or posedge rst)
634
begin
635
  if (rst)
636
    rx_id2 <= 1'b0;
637 24 mohor
  else if (reset_mode | go_rx_rtr2 | error_frame)
638 10 mohor
    rx_id2 <=#Tp 1'b0;
639
  else if (go_rx_id2)
640
    rx_id2 <=#Tp 1'b1;
641
end
642
 
643
 
644
// Rx rtr2 state
645
always @ (posedge clk or posedge rst)
646
begin
647
  if (rst)
648
    rx_rtr2 <= 1'b0;
649 24 mohor
  else if (reset_mode | go_rx_r1 | error_frame)
650 10 mohor
    rx_rtr2 <=#Tp 1'b0;
651
  else if (go_rx_rtr2)
652
    rx_rtr2 <=#Tp 1'b1;
653
end
654
 
655
 
656
// Rx r0 state
657
always @ (posedge clk or posedge rst)
658
begin
659
  if (rst)
660
    rx_r1 <= 1'b0;
661 24 mohor
  else if (reset_mode | go_rx_r0 | error_frame)
662 10 mohor
    rx_r1 <=#Tp 1'b0;
663
  else if (go_rx_r1)
664
    rx_r1 <=#Tp 1'b1;
665
end
666
 
667
 
668
// Rx r0 state
669
always @ (posedge clk or posedge rst)
670
begin
671
  if (rst)
672
    rx_r0 <= 1'b0;
673 24 mohor
  else if (reset_mode | go_rx_dlc | error_frame)
674 10 mohor
    rx_r0 <=#Tp 1'b0;
675
  else if (go_rx_r0)
676
    rx_r0 <=#Tp 1'b1;
677
end
678
 
679
 
680
// Rx dlc state
681
always @ (posedge clk or posedge rst)
682
begin
683
  if (rst)
684
    rx_dlc <= 1'b0;
685 24 mohor
  else if (reset_mode | go_rx_data | go_rx_crc | error_frame)
686 10 mohor
    rx_dlc <=#Tp 1'b0;
687
  else if (go_rx_dlc)
688
    rx_dlc <=#Tp 1'b1;
689
end
690
 
691
 
692
// Rx data state
693
always @ (posedge clk or posedge rst)
694
begin
695
  if (rst)
696
    rx_data <= 1'b0;
697 24 mohor
  else if (reset_mode | go_rx_crc | error_frame)
698 10 mohor
    rx_data <=#Tp 1'b0;
699
  else if (go_rx_data)
700
    rx_data <=#Tp 1'b1;
701
end
702
 
703
 
704
// Rx crc state
705
always @ (posedge clk or posedge rst)
706
begin
707
  if (rst)
708
    rx_crc <= 1'b0;
709 24 mohor
  else if (reset_mode | go_rx_crc_lim | error_frame)
710 10 mohor
    rx_crc <=#Tp 1'b0;
711
  else if (go_rx_crc)
712
    rx_crc <=#Tp 1'b1;
713
end
714
 
715
 
716 11 mohor
// Rx crc delimiter state
717
always @ (posedge clk or posedge rst)
718
begin
719
  if (rst)
720
    rx_crc_lim <= 1'b0;
721 24 mohor
  else if (reset_mode | go_rx_ack | error_frame)
722 11 mohor
    rx_crc_lim <=#Tp 1'b0;
723
  else if (go_rx_crc_lim)
724
    rx_crc_lim <=#Tp 1'b1;
725
end
726
 
727
 
728 10 mohor
// Rx ack state
729
always @ (posedge clk or posedge rst)
730
begin
731
  if (rst)
732
    rx_ack <= 1'b0;
733 24 mohor
  else if (reset_mode | go_rx_ack_lim | error_frame)
734 10 mohor
    rx_ack <=#Tp 1'b0;
735
  else if (go_rx_ack)
736
    rx_ack <=#Tp 1'b1;
737
end
738
 
739
 
740 11 mohor
// Rx ack delimiter state
741
always @ (posedge clk or posedge rst)
742
begin
743
  if (rst)
744
    rx_ack_lim <= 1'b0;
745 24 mohor
  else if (reset_mode | go_rx_eof | error_frame)
746 11 mohor
    rx_ack_lim <=#Tp 1'b0;
747
  else if (go_rx_ack_lim)
748
    rx_ack_lim <=#Tp 1'b1;
749
end
750
 
751
 
752 10 mohor
// Rx eof state
753
always @ (posedge clk or posedge rst)
754
begin
755
  if (rst)
756
    rx_eof <= 1'b0;
757 30 mohor
  else if (go_rx_inter | error_frame | go_overload_frame)
758 10 mohor
    rx_eof <=#Tp 1'b0;
759
  else if (go_rx_eof)
760
    rx_eof <=#Tp 1'b1;
761
end
762
 
763
 
764 24 mohor
 
765
// Interframe space
766
always @ (posedge clk or posedge rst)
767
begin
768
  if (rst)
769
    rx_inter <= 1'b0;
770 35 mohor
  else if (reset_mode | go_rx_idle | go_rx_id1 | go_overload_frame | go_error_frame)
771 24 mohor
    rx_inter <=#Tp 1'b0;
772
  else if (go_rx_inter)
773
    rx_inter <=#Tp 1'b1;
774
end
775
 
776
 
777 10 mohor
// ID register
778
always @ (posedge clk or posedge rst)
779
begin
780
  if (rst)
781
    id <= 0;
782 11 mohor
  else if (sample_point & (rx_id1 | rx_id2) & (~bit_de_stuff))
783 10 mohor
    id <=#Tp {id[27:0], sampled_bit};
784
end
785
 
786 11 mohor
 
787
// rtr1 bit
788
always @ (posedge clk or posedge rst)
789
begin
790
  if (rst)
791
    rtr1 <= 0;
792
  else if (sample_point & rx_rtr1 & (~bit_de_stuff))
793
    rtr1 <=#Tp sampled_bit;
794
end
795
 
796
 
797
// rtr2 bit
798
always @ (posedge clk or posedge rst)
799
begin
800
  if (rst)
801
    rtr2 <= 0;
802
  else if (sample_point & rx_rtr2 & (~bit_de_stuff))
803
    rtr2 <=#Tp sampled_bit;
804
end
805
 
806
 
807
// ide bit
808
always @ (posedge clk or posedge rst)
809
begin
810
  if (rst)
811
    ide <= 0;
812
  else if (sample_point & rx_ide & (~bit_de_stuff))
813
    ide <=#Tp sampled_bit;
814
end
815
 
816
 
817 10 mohor
// Data length
818
always @ (posedge clk or posedge rst)
819
begin
820
  if (rst)
821
    data_len <= 0;
822
  else if (sample_point & rx_dlc & (~bit_de_stuff))
823
    data_len <=#Tp {data_len[2:0], sampled_bit};
824
end
825
 
826
 
827 11 mohor
// Data
828
always @ (posedge clk or posedge rst)
829
begin
830
  if (rst)
831
    tmp_data <= 0;
832
  else if (sample_point & rx_data & (~bit_de_stuff))
833
    tmp_data <=#Tp {tmp_data[6:0], sampled_bit};
834
end
835
 
836
 
837
always @ (posedge clk or posedge rst)
838
begin
839
  if (rst)
840
    write_data_to_tmp_fifo <= 0;
841
  else if (sample_point & rx_data & (~bit_de_stuff) & (&bit_cnt[2:0]))
842
    write_data_to_tmp_fifo <=#Tp 1'b1;
843
  else
844
    write_data_to_tmp_fifo <=#Tp 0;
845
end
846
 
847
 
848
always @ (posedge clk or posedge rst)
849
begin
850
  if (rst)
851
    byte_cnt <= 0;
852 36 mohor
  else if (write_data_to_tmp_fifo)
853 11 mohor
    byte_cnt <=#Tp byte_cnt + 1;
854 36 mohor
  else if (reset_mode | (sample_point & go_rx_crc_lim))
855 11 mohor
    byte_cnt <=#Tp 0;
856
end
857
 
858
 
859 24 mohor
always @ (posedge clk)
860 11 mohor
begin
861
  if (write_data_to_tmp_fifo)
862
    tmp_fifo[byte_cnt] <=#Tp tmp_data;
863
end
864
 
865
 
866
 
867
// CRC
868
always @ (posedge clk or posedge rst)
869
begin
870
  if (rst)
871
    crc_in <= 0;
872
  else if (sample_point & rx_crc & (~bit_de_stuff))
873
    crc_in <=#Tp {crc_in[13:0], sampled_bit};
874
end
875
 
876
 
877 10 mohor
// bit_cnt
878
always @ (posedge clk or posedge rst)
879
begin
880
  if (rst)
881
    bit_cnt <= 0;
882 24 mohor
  else if (go_rx_id1 | go_rx_id2 | go_rx_dlc | go_rx_data | go_rx_crc |
883
           go_rx_ack | go_rx_eof | go_rx_inter | go_error_frame | go_overload_frame)
884 10 mohor
    bit_cnt <=#Tp 0;
885 11 mohor
  else if (sample_point & (~bit_de_stuff))
886 10 mohor
    bit_cnt <=#Tp bit_cnt + 1'b1;
887
end
888
 
889
 
890
// eof_cnt
891
always @ (posedge clk or posedge rst)
892
begin
893
  if (rst)
894
    eof_cnt <= 0;
895
  else if (sample_point)
896
    begin
897 35 mohor
      if (reset_mode | go_rx_inter | go_error_frame | go_overload_frame)
898 28 mohor
        eof_cnt <=#Tp 0;
899
      else if (rx_eof)
900 10 mohor
        eof_cnt <=#Tp eof_cnt + 1'b1;
901
    end
902
end
903
 
904
 
905 11 mohor
// Enabling bit de-stuffing
906
always @ (posedge clk or posedge rst)
907
begin
908
  if (rst)
909
    bit_stuff_cnt_en <= 1'b0;
910
  else if (bit_de_stuff_set)
911
    bit_stuff_cnt_en <=#Tp 1'b1;
912
  else if (bit_de_stuff_reset)
913
    bit_stuff_cnt_en <=#Tp 1'b0;
914
end
915 10 mohor
 
916 24 mohor
 
917 10 mohor
// bit_stuff_cnt
918
always @ (posedge clk or posedge rst)
919
begin
920
  if (rst)
921
    bit_stuff_cnt <= 1;
922 15 mohor
  else if (bit_de_stuff_reset)
923
    bit_stuff_cnt <=#Tp 1;
924 11 mohor
  else if (sample_point & bit_stuff_cnt_en)
925 10 mohor
    begin
926
      if (bit_stuff_cnt == 5)
927
        bit_stuff_cnt <=#Tp 1;
928
      else if (sampled_bit == sampled_bit_q)
929
        bit_stuff_cnt <=#Tp bit_stuff_cnt + 1'b1;
930
      else
931
        bit_stuff_cnt <=#Tp 1;
932
    end
933
end
934
 
935
 
936 35 mohor
// Enabling bit de-stuffing for tx
937
always @ (posedge clk or posedge rst)
938
begin
939
  if (rst)
940
    bit_stuff_cnt_tx_en <= 1'b0;
941
  else if (bit_de_stuff_set & transmitting)
942
    bit_stuff_cnt_tx_en <=#Tp 1'b1;
943
  else if (bit_de_stuff_reset)
944
    bit_stuff_cnt_tx_en <=#Tp 1'b0;
945
end
946
 
947
 
948 25 mohor
// bit_stuff_cnt_tx
949
always @ (posedge clk or posedge rst)
950
begin
951
  if (rst)
952
    bit_stuff_cnt_tx <= 1;
953
  else if (bit_de_stuff_reset)
954
    bit_stuff_cnt_tx <=#Tp 1;
955
  else if (tx_point_q & bit_stuff_cnt_en)
956
    begin
957
      if (bit_stuff_cnt_tx == 5)
958
        bit_stuff_cnt_tx <=#Tp 1;
959
      else if (tx == tx_q)
960
        bit_stuff_cnt_tx <=#Tp bit_stuff_cnt_tx + 1'b1;
961
      else
962
        bit_stuff_cnt_tx <=#Tp 1;
963
    end
964
end
965
 
966
 
967 10 mohor
assign bit_de_stuff = bit_stuff_cnt == 5;
968 25 mohor
assign bit_de_stuff_tx = bit_stuff_cnt_tx == 5;
969 10 mohor
 
970
 
971 24 mohor
 
972 28 mohor
// stuff_err
973
assign stuff_err = sample_point & bit_stuff_cnt_en & bit_de_stuff & (sampled_bit == sampled_bit_q);
974 10 mohor
 
975
 
976 28 mohor
 
977 35 mohor
// Generating delayed signals
978 10 mohor
always @ (posedge clk)
979
begin
980
  reset_mode_q <=#Tp reset_mode;
981 35 mohor
  node_bus_off_q <=#Tp node_bus_off;
982 10 mohor
end
983
 
984
 
985 11 mohor
 
986
always @ (posedge clk or posedge rst)
987
begin
988
  if (rst)
989
    crc_enable <= 1'b0;
990
  else if (go_crc_enable)
991
    crc_enable <=#Tp 1'b1;
992
  else if (reset_mode | rst_crc_enable)
993
    crc_enable <=#Tp 1'b0;
994
end
995
 
996
 
997
// CRC error generation
998
always @ (posedge clk or posedge rst)
999
begin
1000
  if (rst)
1001 28 mohor
    crc_err <= 1'b0;
1002 12 mohor
  else if (go_rx_ack)
1003 28 mohor
    crc_err <=#Tp crc_in != calculated_crc;
1004
  else if (reset_mode | error_frame_ended)
1005
    crc_err <=#Tp 1'b0;
1006 11 mohor
end
1007
 
1008
 
1009 22 mohor
// Conditions for form error
1010 28 mohor
assign form_err = sample_point & ( ((~bit_de_stuff) & rx_ide     &   sampled_bit & (~rtr1)      ) |
1011
                                   (                  rx_crc_lim & (~sampled_bit)               ) |
1012
                                   (                  rx_ack_lim & (~sampled_bit)               ) |
1013
                                   ((eof_cnt < 6)   & rx_eof     & (~sampled_bit) & (~tx_state) ) |
1014
                                   (                & rx_eof     & (~sampled_bit) &   tx_state  )
1015
                                 );
1016 11 mohor
 
1017 22 mohor
 
1018 28 mohor
always @ (posedge clk or posedge rst)
1019
begin
1020
  if (rst)
1021
    ack_err_latched <= 1'b0;
1022 30 mohor
  else if (reset_mode | error_frame_ended | go_overload_frame)
1023 28 mohor
    ack_err_latched <=#Tp 1'b0;
1024
  else if (ack_err)
1025
    ack_err_latched <=#Tp 1'b1;
1026
end
1027
 
1028
 
1029
always @ (posedge clk or posedge rst)
1030
begin
1031
  if (rst)
1032
    bit_err_latched <= 1'b0;
1033 30 mohor
  else if (reset_mode | error_frame_ended | go_overload_frame)
1034 28 mohor
    bit_err_latched <=#Tp 1'b0;
1035
  else if (bit_err)
1036
    bit_err_latched <=#Tp 1'b1;
1037
end
1038
 
1039
 
1040
// Rule 5 (Fault confinement).
1041
always @ (posedge clk or posedge rst)
1042
begin
1043
  if (rst)
1044
    rule5 <= 1'b0;
1045
  else if (reset_mode | error_flag_over)
1046
    rule5 <=#Tp 1'b0;
1047 29 mohor
  else if ((~node_error_passive) & bit_err & (~bit_err_latched) &  (error_frame    & (error_cnt1    < 7) |
1048
                                                                    overload_frame & (overload_cnt1 < 7) )
1049
          )
1050 28 mohor
    rule5 <=#Tp 1'b1;
1051
end
1052
 
1053
 
1054
// Rule 3 exception 1 - first part (Fault confinement).
1055
always @ (posedge clk or posedge rst)
1056
begin
1057
  if (rst)
1058
    rule3_exc1_1 <= 1'b0;
1059
  else if (reset_mode | error_flag_over | rule3_exc1_2)
1060
    rule3_exc1_1 <=#Tp 1'b0;
1061
  else if (transmitter & node_error_passive & ack_err)
1062
    rule3_exc1_1 <=#Tp 1'b1;
1063
end
1064
 
1065
 
1066
// Rule 3 exception 1 - second part (Fault confinement).
1067
always @ (posedge clk or posedge rst)
1068
begin
1069
  if (rst)
1070
    rule3_exc1_2 <= 1'b0;
1071
  else if (reset_mode | error_flag_over)
1072
    rule3_exc1_2 <=#Tp 1'b0;
1073
  else if (rule3_exc1_1)
1074
    rule3_exc1_2 <=#Tp 1'b1;
1075
  else if ((error_cnt1 < 7) & sample_point & (~sampled_bit))
1076
    rule3_exc1_2 <=#Tp 1'b0;
1077
end
1078
 
1079
 
1080
// Rule 3 exception 2 (Fault confinement).
1081
always @ (posedge clk or posedge rst)
1082
begin
1083
  if (rst)
1084
    rule3_exc2 <= 1'b0;
1085
  else if (reset_mode | error_flag_over)
1086
    rule3_exc2 <=#Tp 1'b0;
1087
  else if (transmitter & stuff_err & arbitration_field & sample_point & tx & (~sampled_bit))
1088
    rule3_exc2 <=#Tp 1'b1;
1089
end
1090
 
1091
 
1092
 
1093
always @ (posedge clk or posedge rst)
1094
begin
1095
  if (rst)
1096
    stuff_err_latched <= 1'b0;
1097 30 mohor
  else if (reset_mode | error_frame_ended | go_overload_frame)
1098 28 mohor
    stuff_err_latched <=#Tp 1'b0;
1099
  else if (stuff_err)
1100
    stuff_err_latched <=#Tp 1'b1;
1101
end
1102
 
1103
 
1104
 
1105
always @ (posedge clk or posedge rst)
1106
begin
1107
  if (rst)
1108
    form_err_latched <= 1'b0;
1109 30 mohor
  else if (reset_mode | error_frame_ended | go_overload_frame)
1110 28 mohor
    form_err_latched <=#Tp 1'b0;
1111
  else if (form_err)
1112
    form_err_latched <=#Tp 1'b1;
1113
end
1114
 
1115
 
1116
 
1117 11 mohor
// Instantiation of the RX CRC module
1118
can_crc i_can_crc_rx
1119
(
1120
  .clk(clk),
1121 25 mohor
  .data(sampled_bit),
1122 11 mohor
  .enable(crc_enable & sample_point & (~bit_de_stuff)),
1123 35 mohor
  .initialize(go_crc_enable),
1124 11 mohor
  .crc(calculated_crc)
1125
);
1126
 
1127
 
1128
 
1129
 
1130 16 mohor
assign no_byte0 = rtr1 | (data_len<1);
1131
assign no_byte1 = rtr1 | (data_len<2);
1132 11 mohor
 
1133
can_acf i_can_acf
1134
(
1135
  .clk(clk),
1136
  .rst(rst),
1137
 
1138
  .id(id),
1139
 
1140
  /* Mode register */
1141
  .reset_mode(reset_mode),
1142
  .acceptance_filter_mode(acceptance_filter_mode),
1143
 
1144 12 mohor
  // Clock Divider register
1145 11 mohor
  .extended_mode(extended_mode),
1146
 
1147
  /* This section is for BASIC and EXTENDED mode */
1148
  /* Acceptance code register */
1149
  .acceptance_code_0(acceptance_code_0),
1150
 
1151
  /* Acceptance mask register */
1152
  .acceptance_mask_0(acceptance_mask_0),
1153
  /* End: This section is for BASIC and EXTENDED mode */
1154
 
1155
  /* This section is for EXTENDED mode */
1156
  /* Acceptance code register */
1157
  .acceptance_code_1(acceptance_code_1),
1158
  .acceptance_code_2(acceptance_code_2),
1159
  .acceptance_code_3(acceptance_code_3),
1160
 
1161
  /* Acceptance mask register */
1162
  .acceptance_mask_1(acceptance_mask_1),
1163
  .acceptance_mask_2(acceptance_mask_2),
1164
  .acceptance_mask_3(acceptance_mask_3),
1165
  /* End: This section is for EXTENDED mode */
1166
 
1167
  .go_rx_crc_lim(go_rx_crc_lim),
1168 29 mohor
  .go_rx_inter(go_rx_inter),
1169 30 mohor
  .go_error_frame(go_error_frame),
1170 11 mohor
 
1171
  .data0(tmp_fifo[0]),
1172
  .data1(tmp_fifo[1]),
1173
  .rtr1(rtr1),
1174
  .rtr2(rtr2),
1175
  .ide(ide),
1176 16 mohor
  .no_byte0(no_byte0),
1177
  .no_byte1(no_byte1),
1178 11 mohor
 
1179
  .id_ok(id_ok)
1180
 
1181
);
1182
 
1183
 
1184
 
1185
 
1186 16 mohor
assign header_len[2:0] = extended_mode ? (ide? (3'h5) : (3'h3)) : 3'h2;
1187 13 mohor
assign storing_header = header_cnt < header_len;
1188 19 mohor
assign limited_data_len_minus1[3:0] = remote_rq? 4'hf : ((data_len < 8)? (data_len -1'b1) : 4'h7);   // - 1 because counter counts from 0
1189 25 mohor
assign reset_wr_fifo = (data_cnt == (limited_data_len_minus1 + header_len)) | reset_mode;
1190 12 mohor
 
1191 28 mohor
assign err = form_err | stuff_err | bit_err | ack_err | form_err_latched | stuff_err_latched | bit_err_latched | ack_err_latched | crc_err;
1192 24 mohor
 
1193
 
1194 28 mohor
 
1195 13 mohor
// Write enable signal for 64-byte rx fifo
1196
always @ (posedge clk or posedge rst)
1197
begin
1198
  if (rst)
1199
    wr_fifo <= 1'b0;
1200 16 mohor
  else if (reset_wr_fifo)
1201
    wr_fifo <=#Tp 1'b0;
1202 36 mohor
  else if (go_rx_inter & id_ok & (~error_frame_ended) & ((~tx_state) | self_rx_request))
1203 13 mohor
    wr_fifo <=#Tp 1'b1;
1204
end
1205 12 mohor
 
1206
 
1207 13 mohor
// Header counter. Header length depends on the mode of operation and frame format.
1208 12 mohor
always @ (posedge clk or posedge rst)
1209
begin
1210
  if (rst)
1211 13 mohor
    header_cnt <= 0;
1212 16 mohor
  else if (reset_wr_fifo)
1213
    header_cnt <=#Tp 0;
1214
  else if (wr_fifo & storing_header)
1215 13 mohor
    header_cnt <=#Tp header_cnt + 1;
1216 12 mohor
end
1217
 
1218
 
1219 13 mohor
// Data counter. Length of the data is limited to 8 bytes.
1220 12 mohor
always @ (posedge clk or posedge rst)
1221
begin
1222
  if (rst)
1223 13 mohor
    data_cnt <= 0;
1224 16 mohor
  else if (reset_wr_fifo)
1225
    data_cnt <=#Tp 0;
1226
  else if (wr_fifo)
1227 13 mohor
    data_cnt <=#Tp data_cnt + 1;
1228 12 mohor
end
1229
 
1230
 
1231 13 mohor
// Multiplexing data that is stored to 64-byte fifo depends on the mode of operation and frame format
1232 24 mohor
always @ (extended_mode or ide or data_cnt or header_cnt or  header_len or
1233
          storing_header or id or rtr1 or rtr2 or data_len or
1234 13 mohor
          tmp_fifo[0] or tmp_fifo[2] or tmp_fifo[4] or tmp_fifo[6] or
1235
          tmp_fifo[1] or tmp_fifo[3] or tmp_fifo[5] or tmp_fifo[7])
1236 12 mohor
begin
1237 13 mohor
  if (storing_header)
1238 12 mohor
    begin
1239 13 mohor
      if (extended_mode)      // extended mode
1240 12 mohor
        begin
1241 13 mohor
          if (ide)              // extended format
1242
            begin
1243 24 mohor
              case (header_cnt) // synthesis parallel_case 
1244
                3'h0  : data_for_fifo <= {1'b1, rtr2, 2'h0, data_len};
1245
                3'h1  : data_for_fifo <= id[28:21];
1246
                3'h2  : data_for_fifo <= id[20:13];
1247
                3'h3  : data_for_fifo <= id[12:5];
1248
                3'h4  : data_for_fifo <= {id[4:0], 3'h0};
1249
                default: data_for_fifo <= 0;
1250 13 mohor
              endcase
1251
            end
1252
          else                  // standard format
1253
            begin
1254 24 mohor
              case (header_cnt) // synthesis parallel_case 
1255
                3'h0  : data_for_fifo <= {1'b0, rtr1, 2'h0, data_len};
1256
                3'h1  : data_for_fifo <= id[10:3];
1257
                3'h2  : data_for_fifo <= {id[2:0], 5'h0};
1258
                default: data_for_fifo <= 0;
1259 13 mohor
              endcase
1260
            end
1261 12 mohor
        end
1262 13 mohor
      else                    // normal mode
1263 12 mohor
        begin
1264 24 mohor
          case (header_cnt) // synthesis parallel_case 
1265
            3'h0  : data_for_fifo <= id[10:3];
1266
            3'h1  : data_for_fifo <= {id[2:0], rtr1, data_len};
1267
            default: data_for_fifo <= 0;
1268 12 mohor
          endcase
1269
        end
1270
    end
1271 13 mohor
  else
1272 16 mohor
    data_for_fifo <= tmp_fifo[data_cnt-header_len];
1273 12 mohor
end
1274
 
1275
 
1276
 
1277
 
1278
// Instantiation of the RX fifo module
1279 13 mohor
can_fifo i_can_fifo
1280 12 mohor
(
1281
  .clk(clk),
1282
  .rst(rst),
1283
 
1284 13 mohor
  .wr(wr_fifo),
1285 12 mohor
 
1286 13 mohor
  .data_in(data_for_fifo),
1287 14 mohor
  .addr(addr),
1288
  .data_out(data_out),
1289 12 mohor
 
1290
  .reset_mode(reset_mode),
1291 15 mohor
  .release_buffer(release_buffer),
1292 35 mohor
  .extended_mode(extended_mode),
1293
  .overrun(overrun),
1294
  .info_empty(info_empty)
1295 12 mohor
 
1296
 
1297
);
1298
 
1299
 
1300 29 mohor
// Transmitting error frame.
1301 24 mohor
always @ (posedge clk or posedge rst)
1302
begin
1303
  if (rst)
1304
    error_frame <= 1'b0;
1305 30 mohor
  else if (reset_mode | error_frame_ended | go_overload_frame)
1306 24 mohor
    error_frame <=#Tp 1'b0;
1307 28 mohor
  else if (go_error_frame)
1308 24 mohor
    error_frame <=#Tp 1'b1;
1309
end
1310 12 mohor
 
1311 13 mohor
 
1312 28 mohor
always @ (posedge clk)
1313
begin
1314
  if (sample_point)
1315
    error_frame_q <=#Tp error_frame;
1316
end
1317
 
1318
 
1319
always @ (posedge clk)
1320
begin
1321
    go_error_frame_q <=#Tp go_error_frame;
1322
end
1323
 
1324
 
1325 24 mohor
always @ (posedge clk or posedge rst)
1326
begin
1327
  if (rst)
1328
    error_cnt1 <= 1'b0;
1329 30 mohor
  else if (reset_mode | error_frame_ended | go_error_frame | go_overload_frame)
1330 24 mohor
    error_cnt1 <=#Tp 1'b0;
1331 29 mohor
  else if (error_frame & tx_point & (error_cnt1 < 7))
1332 24 mohor
    error_cnt1 <=#Tp error_cnt1 + 1'b1;
1333
end
1334
 
1335
 
1336 28 mohor
 
1337 30 mohor
assign error_flag_over = ((~node_error_passive) & sample_point & (error_cnt1 == 7) | node_error_passive  & sample_point & (passive_cnt == 5)) & (~enable_error_cnt2);
1338 28 mohor
 
1339
 
1340 24 mohor
always @ (posedge clk or posedge rst)
1341
begin
1342
  if (rst)
1343 28 mohor
    error_flag_over_blocked <= 1'b0;
1344 30 mohor
  else if (reset_mode | error_frame_ended | go_error_frame | go_overload_frame)
1345 28 mohor
    error_flag_over_blocked <=#Tp 1'b0;
1346
  else if (error_flag_over)
1347
    error_flag_over_blocked <=#Tp 1'b1;
1348
end
1349
 
1350
 
1351
 
1352
always @ (posedge clk or posedge rst)
1353
begin
1354
  if (rst)
1355 24 mohor
    enable_error_cnt2 <= 1'b0;
1356 30 mohor
  else if (reset_mode | error_frame_ended | go_error_frame | go_overload_frame)
1357 24 mohor
    enable_error_cnt2 <=#Tp 1'b0;
1358 30 mohor
  else if (error_frame & (error_flag_over & sampled_bit))
1359 24 mohor
    enable_error_cnt2 <=#Tp 1'b1;
1360
end
1361
 
1362
 
1363
always @ (posedge clk or posedge rst)
1364
begin
1365
  if (rst)
1366 28 mohor
    error_cnt2 <= 0;
1367 30 mohor
  else if (reset_mode | error_frame_ended | go_error_frame | go_overload_frame)
1368 28 mohor
    error_cnt2 <=#Tp 0;
1369 24 mohor
  else if (enable_error_cnt2 & tx_point)
1370
    error_cnt2 <=#Tp error_cnt2 + 1'b1;
1371
end
1372
 
1373
 
1374 28 mohor
always @ (posedge clk or posedge rst)
1375
begin
1376
  if (rst)
1377 29 mohor
    delayed_dominant_cnt <= 0;
1378
  else if (reset_mode | enable_error_cnt2 | go_error_frame | enable_overload_cnt2 | go_overload_frame)
1379
    delayed_dominant_cnt <=#Tp 0;
1380
  else if (sample_point & (~sampled_bit) & ((error_cnt1 == 7) | (overload_cnt1 == 7)))
1381
    delayed_dominant_cnt <=#Tp delayed_dominant_cnt + 1'b1;
1382 28 mohor
end
1383 24 mohor
 
1384 25 mohor
 
1385 28 mohor
// passive_cnt
1386
always @ (posedge clk or posedge rst)
1387
begin
1388
  if (rst)
1389
    passive_cnt <= 0;
1390 30 mohor
  else if (reset_mode | error_frame_ended | go_error_frame | go_overload_frame)
1391 28 mohor
    passive_cnt <=#Tp 0;
1392
  else if (sample_point & (passive_cnt < 5))
1393
    begin
1394
      if (error_frame_q & (~enable_error_cnt2) & (sampled_bit == sampled_bit_q))
1395
        passive_cnt <=#Tp passive_cnt + 1'b1;
1396
      else
1397
        passive_cnt <=#Tp 0;
1398
    end
1399
end
1400 25 mohor
 
1401
 
1402 29 mohor
 
1403
// Transmitting overload frame.
1404
always @ (posedge clk or posedge rst)
1405
begin
1406
  if (rst)
1407
    overload_frame <= 1'b0;
1408
  else if (reset_mode | overload_frame_ended | go_error_frame)
1409
    overload_frame <=#Tp 1'b0;
1410
  else if (go_overload_frame)
1411
    overload_frame <=#Tp 1'b1;
1412
end
1413
 
1414
 
1415
always @ (posedge clk or posedge rst)
1416
begin
1417
  if (rst)
1418
    overload_cnt1 <= 1'b0;
1419 30 mohor
  else if (reset_mode | overload_frame_ended | go_error_frame | go_overload_frame)
1420 29 mohor
    overload_cnt1 <=#Tp 1'b0;
1421
  else if (overload_frame & tx_point & (overload_cnt1 < 7))
1422
    overload_cnt1 <=#Tp overload_cnt1 + 1'b1;
1423
end
1424
 
1425
 
1426 30 mohor
assign overload_flag_over = sample_point & (overload_cnt1 == 7) & (~enable_overload_cnt2);
1427 29 mohor
 
1428
 
1429
always @ (posedge clk or posedge rst)
1430
begin
1431
  if (rst)
1432
    enable_overload_cnt2 <= 1'b0;
1433 30 mohor
  else if (reset_mode | overload_frame_ended | go_error_frame | go_overload_frame)
1434 29 mohor
    enable_overload_cnt2 <=#Tp 1'b0;
1435 30 mohor
  else if (overload_frame & (overload_flag_over & sampled_bit))
1436 29 mohor
    enable_overload_cnt2 <=#Tp 1'b1;
1437
end
1438
 
1439
 
1440
always @ (posedge clk or posedge rst)
1441
begin
1442
  if (rst)
1443
    overload_cnt2 <= 0;
1444 30 mohor
  else if (reset_mode | overload_frame_ended | go_error_frame | go_overload_frame)
1445 29 mohor
    overload_cnt2 <=#Tp 0;
1446
  else if (enable_overload_cnt2 & tx_point)
1447
    overload_cnt2 <=#Tp overload_cnt2 + 1'b1;
1448
end
1449
 
1450
 
1451 30 mohor
always @ (posedge clk or posedge rst)
1452
begin
1453
  if (rst)
1454
    overload_frame_blocked <= 0;
1455
  else if (reset_mode | go_error_frame | go_rx_id1)
1456
    overload_frame_blocked <=#Tp 0;
1457
  else if (go_overload_frame & overload_frame)            // This is a second sequential overload
1458
    overload_frame_blocked <=#Tp 1'b1;
1459
end
1460
 
1461
 
1462 36 mohor
assign send_ack = (~tx_state) & rx_ack & (~err) & (~listen_only_mode);
1463 25 mohor
 
1464
 
1465 24 mohor
always @ (posedge clk or posedge rst)
1466
begin
1467
  if (rst)
1468
    tx <= 1'b1;
1469 30 mohor
  else if (reset_mode)                                                          // Reset
1470 24 mohor
    tx <=#Tp 1'b1;
1471 25 mohor
  else if (tx_point)
1472 24 mohor
    begin
1473 25 mohor
      if (tx_state)                                                             // Transmitting message
1474
        tx <=#Tp ((~bit_de_stuff_tx) & tx_bit) | (bit_de_stuff_tx & (~tx_q));
1475 28 mohor
      else if (send_ack)                                                        // Acknowledge
1476 25 mohor
        tx <=#Tp 1'b0;
1477 30 mohor
      else if (overload_frame)                                                  // Transmitting overload frame
1478
        begin
1479
          if (overload_cnt1 < 6)
1480
            tx <=#Tp 1'b0;
1481
          else
1482
            tx <=#Tp 1'b1;
1483
        end
1484 29 mohor
      else if (error_frame)                                                     // Transmitting error frame
1485 24 mohor
        begin
1486 25 mohor
          if (error_cnt1 < 6)
1487
            begin
1488 29 mohor
              if (node_error_passive)
1489 25 mohor
                tx <=#Tp 1'b1;
1490
              else
1491
                tx <=#Tp 1'b0;
1492
            end
1493 29 mohor
          else
1494 24 mohor
            tx <=#Tp 1'b1;
1495
        end
1496 25 mohor
      else
1497 24 mohor
        tx <=#Tp 1'b1;
1498
    end
1499
end
1500
 
1501
 
1502 25 mohor
always @ (posedge clk)
1503
begin
1504
  if (tx_point)
1505
    tx_q <=#Tp tx;
1506
end
1507 24 mohor
 
1508
 
1509 25 mohor
/* Delayed tx point */
1510
always @ (posedge clk)
1511
begin
1512
  tx_point_q <=#Tp tx_point;
1513
end
1514 24 mohor
 
1515
 
1516 25 mohor
/* Changing bit order from [7:0] to [0:7] */
1517
can_ibo i_ibo_tx_data_0  (.di(tx_data_0),  .do(r_tx_data_0));
1518
can_ibo i_ibo_tx_data_1  (.di(tx_data_1),  .do(r_tx_data_1));
1519
can_ibo i_ibo_tx_data_2  (.di(tx_data_2),  .do(r_tx_data_2));
1520
can_ibo i_ibo_tx_data_3  (.di(tx_data_3),  .do(r_tx_data_3));
1521
can_ibo i_ibo_tx_data_4  (.di(tx_data_4),  .do(r_tx_data_4));
1522
can_ibo i_ibo_tx_data_5  (.di(tx_data_5),  .do(r_tx_data_5));
1523
can_ibo i_ibo_tx_data_6  (.di(tx_data_6),  .do(r_tx_data_6));
1524
can_ibo i_ibo_tx_data_7  (.di(tx_data_7),  .do(r_tx_data_7));
1525
can_ibo i_ibo_tx_data_8  (.di(tx_data_8),  .do(r_tx_data_8));
1526
can_ibo i_ibo_tx_data_9  (.di(tx_data_9),  .do(r_tx_data_9));
1527
can_ibo i_ibo_tx_data_10 (.di(tx_data_10), .do(r_tx_data_10));
1528
can_ibo i_ibo_tx_data_11 (.di(tx_data_11), .do(r_tx_data_11));
1529
can_ibo i_ibo_tx_data_12 (.di(tx_data_12), .do(r_tx_data_12));
1530 24 mohor
 
1531 25 mohor
/* Changing bit order from [14:0] to [0:14] */
1532
can_ibo i_calculated_crc0 (.di(calculated_crc[14:7]), .do(r_calculated_crc[7:0]));
1533
can_ibo i_calculated_crc1 (.di({calculated_crc[6:0], 1'b0}), .do(r_calculated_crc[15:8]));
1534 24 mohor
 
1535
 
1536 25 mohor
assign basic_chain = {r_tx_data_1[7:4], 2'h0, r_tx_data_1[3:0], r_tx_data_0[7:0], 1'b0};
1537
assign basic_chain_data = {r_tx_data_9, r_tx_data_8, r_tx_data_7, r_tx_data_6, r_tx_data_5, r_tx_data_4, r_tx_data_3, r_tx_data_2};
1538
assign extended_chain_std = {r_tx_data_0[7:4], 2'h0, r_tx_data_0[1], r_tx_data_2[2:0], r_tx_data_1[7:0], 1'b0};
1539
assign extended_chain_ext = {r_tx_data_0[7:4], 2'h0, r_tx_data_0[1], r_tx_data_4[4:0], r_tx_data_3[7:0], r_tx_data_2[7:3], 1'b1, 1'b1, r_tx_data_2[2:0], r_tx_data_1[7:0], 1'b0};
1540
assign extended_chain_data = {r_tx_data_12, r_tx_data_11, r_tx_data_10, r_tx_data_9, r_tx_data_8, r_tx_data_7, r_tx_data_6, r_tx_data_5};
1541
 
1542
always @ (extended_mode or rx_data or tx_pointer or extended_chain_data or rx_crc or r_calculated_crc or
1543
          r_tx_data_0   or extended_chain_ext or extended_chain_std or basic_chain_data or basic_chain or
1544
          finish_msg)
1545
begin
1546
  if (extended_mode)
1547
    begin
1548
      if (rx_data)  // data stage
1549
        tx_bit = extended_chain_data[tx_pointer];
1550
      else if (rx_crc)
1551
        tx_bit = r_calculated_crc[tx_pointer];
1552
      else if (finish_msg)
1553
        tx_bit = 1'b1;
1554
      else
1555
        begin
1556
          if (r_tx_data_0[0])    // Extended frame
1557
            tx_bit = extended_chain_ext[tx_pointer];
1558
          else
1559
            tx_bit = extended_chain_std[tx_pointer];
1560
        end
1561
    end
1562
  else  // Basic mode
1563
    begin
1564
      if (rx_data)  // data stage
1565
        tx_bit = basic_chain_data[tx_pointer];
1566
      else if (rx_crc)
1567
        tx_bit = r_calculated_crc[tx_pointer];
1568
      else if (finish_msg)
1569
        tx_bit = 1'b1;
1570
      else
1571
        tx_bit = basic_chain[tx_pointer];
1572
    end
1573
end
1574
 
1575 36 mohor
assign rst_tx_pointer = ((~bit_de_stuff_tx) & tx_point & (~rx_data) &   extended_mode  &   r_tx_data_0[0]   & tx_pointer == 38                      ) |   // arbitration + control for extended format
1576
                        ((~bit_de_stuff_tx) & tx_point & (~rx_data) &   extended_mode  & (~r_tx_data_0[0])  & tx_pointer == 18                      ) |   // arbitration + control for extended format
1577
                        ((~bit_de_stuff_tx) & tx_point & (~rx_data) & (~extended_mode)                      & tx_pointer == 18                      ) |   // arbitration + control for standard format
1578
                        ((~bit_de_stuff_tx) & tx_point &   rx_data  &   extended_mode                       & tx_pointer == (8 * tx_data_0[3:0] - 1)) |   // data
1579
                        ((~bit_de_stuff_tx) & tx_point &   rx_data  & (~extended_mode)                      & tx_pointer == (8 * tx_data_1[3:0] - 1)) |   // data
1580
                        (                     tx_point &   rx_crc_lim                                                                               ) |   // crc
1581
                        (go_rx_idle                                                                                                                 ) |   // at the end
1582
                        (reset_mode                                                                                                                 ) |
1583
                        (overload_frame                                                                                                              ) |
1584
                        (error_frame                                                                                                                ) ;
1585 25 mohor
 
1586
always @ (posedge clk or posedge rst)
1587
begin
1588
  if (rst)
1589
    tx_pointer <= 'h0;
1590
  else if (rst_tx_pointer)
1591
    tx_pointer <=#Tp 'h0;
1592
  else if (go_early_tx | (tx_point & tx_state & (~bit_de_stuff_tx)))
1593
    tx_pointer <=#Tp tx_pointer + 1'b1;
1594
end
1595
 
1596
 
1597 36 mohor
assign tx_successful = transmitter & go_rx_inter & ((~error_frame_ended) & (~overload_frame_ended) & (~priority_lost) | single_shot_transmission);
1598 28 mohor
 
1599
 
1600 25 mohor
always @ (posedge clk or posedge rst)
1601
begin
1602
  if (rst)
1603
    need_to_tx <= 1'b0;
1604 35 mohor
  else if (tx_successful | reset_mode | (abort_tx & (~transmitting)))
1605 28 mohor
    need_to_tx <=#Tp 1'h0;
1606 32 mohor
  else if (tx_request & sample_point)
1607 25 mohor
    need_to_tx <=#Tp 1'b1;
1608
end
1609
 
1610
 
1611
 
1612 36 mohor
assign go_early_tx = (~listen_only_mode) & need_to_tx & (~tx_state) & (~suspend) & sample_point & (~sampled_bit) & (rx_idle | last_bit_of_inter);
1613
assign go_tx       = (~listen_only_mode) & need_to_tx & (~tx_state) & (~suspend) & (go_early_tx | rx_idle);
1614 25 mohor
 
1615
 
1616
// Tx state
1617
always @ (posedge clk or posedge rst)
1618
begin
1619
  if (rst)
1620
    tx_state <= 1'b0;
1621 35 mohor
  else if (reset_mode | go_rx_inter | error_frame | priority_lost)
1622 25 mohor
    tx_state <=#Tp 1'b0;
1623
  else if (go_tx)
1624
    tx_state <=#Tp 1'b1;
1625
end
1626
 
1627
 
1628
 
1629 28 mohor
// Node is a transmitter
1630 25 mohor
always @ (posedge clk or posedge rst)
1631
begin
1632
  if (rst)
1633 28 mohor
    transmitter <= 1'b0;
1634
  else if (go_tx)
1635
    transmitter <=#Tp 1'b1;
1636 35 mohor
  else if (reset_mode | go_rx_inter)
1637 28 mohor
    transmitter <=#Tp 1'b0;
1638
end
1639
 
1640
 
1641
 
1642
// Signal "transmitting" signals that the core is a transmitting (message, error frame or overload frame). No synchronization is done meanwhile.
1643
// Node might be both transmitter or receiver (sending error or overload frame)
1644
always @ (posedge clk or posedge rst)
1645
begin
1646
  if (rst)
1647 26 mohor
    transmitting <= 1'b0;
1648 28 mohor
  else if (go_error_frame | go_overload_frame | go_tx)
1649
    transmitting <=#Tp 1'b1;
1650
  else if (reset_mode | go_rx_idle | (go_rx_id1 & (~tx_state)) | (priority_lost & tx_state))
1651 26 mohor
    transmitting <=#Tp 1'b0;
1652
end
1653
 
1654
 
1655 28 mohor
always @ (posedge clk or posedge rst)
1656
begin
1657
  if (rst)
1658
    suspend <= 0;
1659
  else if (reset_mode | (sample_point & (susp_cnt == 7)))
1660
    suspend <=#Tp 0;
1661
  else if (go_rx_inter & transmitter & node_error_passive)
1662
    suspend <=#Tp 1'b1;
1663
end
1664 26 mohor
 
1665 28 mohor
 
1666 26 mohor
always @ (posedge clk or posedge rst)
1667
begin
1668
  if (rst)
1669 28 mohor
    susp_cnt_en <= 0;
1670
  else if (reset_mode | (sample_point & (susp_cnt == 7)))
1671
    susp_cnt_en <=#Tp 0;
1672 29 mohor
  else if (suspend & sample_point & last_bit_of_inter)
1673 28 mohor
    susp_cnt_en <=#Tp 1'b1;
1674
end
1675
 
1676
 
1677
always @ (posedge clk or posedge rst)
1678
begin
1679
  if (rst)
1680
    susp_cnt <= 0;
1681
  else if (reset_mode | (sample_point & (susp_cnt == 7)))
1682
    susp_cnt <=#Tp 0;
1683
  else if (susp_cnt_en & sample_point)
1684
    susp_cnt <=#Tp susp_cnt + 1'b1;
1685
end
1686
 
1687
 
1688
 
1689
 
1690
always @ (posedge clk or posedge rst)
1691
begin
1692
  if (rst)
1693 25 mohor
    finish_msg <= 1'b0;
1694 28 mohor
  else if (go_rx_idle | go_rx_id1 | error_frame | reset_mode)
1695 25 mohor
    finish_msg <=#Tp 1'b0;
1696
  else if (go_rx_crc_lim)
1697
    finish_msg <=#Tp 1'b1;
1698
end
1699
 
1700
 
1701
always @ (posedge clk or posedge rst)
1702
begin
1703
  if (rst)
1704
    priority_lost <= 1'b0;
1705
  else if (go_rx_idle | error_frame | reset_mode)
1706
    priority_lost <=#Tp 1'b0;
1707 28 mohor
  else if (tx_state & sample_point & tx & arbitration_field)
1708 25 mohor
    priority_lost <=#Tp (~sampled_bit);
1709
end
1710
 
1711
 
1712
 
1713 28 mohor
always @ (posedge clk or posedge rst)
1714
begin
1715
  if (rst)
1716
    rx_err_cnt <= 'h0;
1717 35 mohor
  else if (we_rx_err_cnt & (~node_bus_off))
1718
    rx_err_cnt <=#Tp {1'b0, data_in};
1719
  else if (set_reset_mode)
1720 28 mohor
    rx_err_cnt <=#Tp 'h0;
1721
  else
1722
    begin
1723 36 mohor
      if (~listen_only_mode)
1724 28 mohor
        begin
1725 36 mohor
          if ((~transmitter) & go_rx_ack_lim & (~err) & (rx_err_cnt > 0))
1726
            begin
1727
              if (rx_err_cnt > 127)
1728
                rx_err_cnt <=#Tp 127;
1729
              else
1730
                rx_err_cnt <=#Tp rx_err_cnt - 1'b1;
1731
            end
1732
          else if ((rx_err_cnt < 248) & (~transmitter))   // 248 + 8 = 256
1733
            begin
1734
              if (go_error_frame_q & (~rule5))                                                                          // 1  (rule 5 is just the opposite then rule 1 exception
1735
                rx_err_cnt <=#Tp rx_err_cnt + 1'b1;
1736
              else if ( (error_frame & sample_point & (~sampled_bit) & (error_cnt1 == 7) & (~rx_err_cnt_blocked)  ) |   // 2
1737
                        (go_error_frame_q & rule5                                                                 ) |   // 5
1738
                        (error_frame & sample_point & (~sampled_bit) & (delayed_dominant_cnt == 7)                )     // 6
1739
                      )
1740
                rx_err_cnt <=#Tp rx_err_cnt + 4'h8;
1741
            end
1742 30 mohor
        end
1743 28 mohor
    end
1744
end
1745
 
1746
 
1747
always @ (posedge clk or posedge rst)
1748
begin
1749
  if (rst)
1750
    tx_err_cnt <= 'h0;
1751 35 mohor
  else if (we_tx_err_cnt)
1752
    tx_err_cnt <=#Tp {1'b0, data_in};
1753 28 mohor
  else
1754
    begin
1755 35 mohor
      if (set_reset_mode)
1756
        tx_err_cnt <=#Tp 127;
1757
      else if ((tx_err_cnt > 0) & (tx_successful | bus_free))
1758 30 mohor
        tx_err_cnt <=#Tp tx_err_cnt - 1'h1;
1759 35 mohor
      else if (transmitter)
1760 28 mohor
        begin
1761 29 mohor
          if ( (sample_point & (~sampled_bit) & (delayed_dominant_cnt == 7)                     ) |       // 6
1762 28 mohor
               (error_flag_over & (~error_flag_over_blocked) & rule5                            ) |       // 4  (rule 5 is the same as rule 4)
1763
               (error_flag_over & (~error_flag_over_blocked) & (~rule3_exc1_2) & (~rule3_exc2)  )         // 3
1764
             )
1765
            tx_err_cnt <=#Tp tx_err_cnt + 4'h8;
1766
        end
1767
    end
1768
end
1769
 
1770
 
1771
 
1772
always @ (posedge clk or posedge rst)
1773
begin
1774
  if (rst)
1775
    rx_err_cnt_blocked <= 1'b0;
1776
  else if (reset_mode | error_frame_ended)
1777
    rx_err_cnt_blocked <=#Tp 1'b0;
1778
  else if (sample_point & (error_cnt1 == 7))
1779
    rx_err_cnt_blocked <=#Tp 1'b1;
1780
end
1781
 
1782
 
1783
 
1784
always @ (posedge clk or posedge rst)
1785
begin
1786
  if (rst)
1787
    node_error_passive <= 1'b0;
1788 35 mohor
  else if ((rx_err_cnt < 128) & (tx_err_cnt < 128) & error_frame_ended)
1789 28 mohor
    node_error_passive <=#Tp 1'b0;
1790 35 mohor
  else if (((rx_err_cnt >= 128) | (tx_err_cnt >= 128)) & (error_frame_ended | (~reset_mode) & reset_mode_q) & (~node_bus_off))
1791 28 mohor
    node_error_passive <=#Tp 1'b1;
1792
end
1793
 
1794
 
1795 36 mohor
assign node_error_active = ~(node_error_passive | node_bus_off);
1796
 
1797
 
1798 28 mohor
always @ (posedge clk or posedge rst)
1799
begin
1800
  if (rst)
1801
    node_bus_off <= 1'b0;
1802 35 mohor
  else if ((rx_err_cnt == 0) & (tx_err_cnt == 0) & (~reset_mode) | (we_tx_err_cnt & (data_in < 255)))
1803 28 mohor
    node_bus_off <=#Tp 1'b0;
1804 35 mohor
  else if ((tx_err_cnt >= 256) | (we_tx_err_cnt & (data_in == 255)))
1805 28 mohor
    node_bus_off <=#Tp 1'b1;
1806
end
1807
 
1808
 
1809 35 mohor
 
1810 28 mohor
always @ (posedge clk or posedge rst)
1811
begin
1812
  if (rst)
1813 35 mohor
    bus_free_cnt <= 0;
1814
  else if (reset_mode)
1815
    bus_free_cnt <=#Tp 0;
1816 30 mohor
  else if (sample_point)
1817
    begin
1818 35 mohor
      if (sampled_bit & bus_free_cnt_en & (bus_free_cnt < 10))
1819
        bus_free_cnt <=#Tp bus_free_cnt + 1'b1;
1820 30 mohor
      else
1821 35 mohor
        bus_free_cnt <=#Tp 0;
1822 30 mohor
    end
1823 28 mohor
end
1824
 
1825
 
1826 35 mohor
always @ (posedge clk or posedge rst)
1827
begin
1828
  if (rst)
1829
    bus_free_cnt_en <= 1'b0;
1830
  else if ((~reset_mode) & reset_mode_q | node_bus_off_q & (~reset_mode))
1831
    bus_free_cnt_en <=#Tp 1'b1;
1832
  else if (sample_point &  (bus_free_cnt==10) & (~node_bus_off))
1833
    bus_free_cnt_en <=#Tp 1'b0;
1834
end
1835 28 mohor
 
1836
 
1837 35 mohor
always @ (posedge clk or posedge rst)
1838
begin
1839
  if (rst)
1840
    bus_free <= 1'b0;
1841
  else if (sample_point & sampled_bit & (bus_free_cnt==10))
1842
    bus_free <=#Tp 1'b1;
1843
  else
1844
    bus_free <=#Tp 1'b0;
1845
end
1846
 
1847
 
1848
always @ (posedge clk or posedge rst)
1849
begin
1850
  if (rst)
1851
    waiting_for_bus_free <= 1'b1;
1852
  else if (bus_free & (~node_bus_off))
1853
    waiting_for_bus_free <=#Tp 1'b0;
1854
  else if ((~reset_mode) & reset_mode_q | node_bus_off_q & (~reset_mode))
1855
    waiting_for_bus_free <=#Tp 1'b1;
1856
end
1857
 
1858
 
1859 28 mohor
assign tx_oen = node_bus_off;
1860
 
1861 35 mohor
assign set_reset_mode = node_bus_off & (~node_bus_off_q);
1862
assign error_status = (~reset_mode) & extended_mode? ((rx_err_cnt >= error_warning_limit) | (tx_err_cnt >= error_warning_limit))    :
1863
                                                     ((rx_err_cnt >= 96) | (tx_err_cnt >= 96))                                      ;
1864 28 mohor
 
1865 35 mohor
assign transmit_status = transmitting                 | (extended_mode & waiting_for_bus_free);
1866
assign receive_status  = (~rx_idle) & (~transmitting) | (extended_mode & waiting_for_bus_free);
1867
 
1868 2 mohor
endmodule

powered by: WebSVN 2.1.0

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