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

Subversion Repositories can

[/] [can/] [tags/] [rel_6/] [rtl/] [verilog/] [can_bsp.v] - Blame information for rev 32

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

powered by: WebSVN 2.1.0

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