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 31

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

powered by: WebSVN 2.1.0

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