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 29

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

powered by: WebSVN 2.1.0

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