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 30

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

powered by: WebSVN 2.1.0

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