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

Subversion Repositories can

[/] [can/] [tags/] [rel_22/] [rtl/] [verilog/] [can_bsp.v] - Blame information for rev 78

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

powered by: WebSVN 2.1.0

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