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

Subversion Repositories can

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

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
//////////////////////////////////////////////////////////////////////
44
//
45
// CVS Revision History
46
//
47
// $Log: not supported by cvs2svn $
48 24 mohor
// Revision 1.14  2003/01/16 13:36:19  mohor
49
// Form error supported. When receiving messages, last bit of the end-of-frame
50
// does not generate form error. Receiver goes to the idle mode one bit sooner.
51
// (CAN specification ver 2.0, part B, page 57).
52
//
53 22 mohor
// Revision 1.13  2003/01/15 21:59:45  mohor
54
// Data is stored to fifo at the end of ack stage.
55
//
56 21 mohor
// Revision 1.12  2003/01/15 21:05:11  mohor
57
// CRC checking fixed (when bitstuff occurs at the end of a CRC sequence).
58
//
59 20 mohor
// Revision 1.11  2003/01/15 14:40:23  mohor
60
// RX state machine fixed to receive "remote request" frames correctly. No data bytes are written to fifo when such frames are received.
61
//
62 19 mohor
// Revision 1.10  2003/01/15 13:16:47  mohor
63
// 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.
64
//
65 18 mohor
// Revision 1.9  2003/01/14 12:19:35  mohor
66
// rx_fifo is now working.
67
//
68 16 mohor
// Revision 1.8  2003/01/10 17:51:33  mohor
69
// Temporary version (backup).
70
//
71 15 mohor
// Revision 1.7  2003/01/09 21:54:45  mohor
72
// rx fifo added. Not 100 % verified, yet.
73
//
74 14 mohor
// Revision 1.6  2003/01/09 14:46:58  mohor
75
// Temporary files (backup).
76
//
77 13 mohor
// Revision 1.5  2003/01/08 13:30:31  mohor
78
// Temp version.
79
//
80 12 mohor
// Revision 1.4  2003/01/08 02:10:53  mohor
81
// Acceptance filter added.
82
//
83 11 mohor
// Revision 1.3  2002/12/28 04:13:23  mohor
84
// Backup version.
85
//
86 10 mohor
// Revision 1.2  2002/12/27 00:12:52  mohor
87
// Header changed, testbench improved to send a frame (crc still missing).
88
//
89 9 mohor
// Revision 1.1.1.1  2002/12/20 16:39:21  mohor
90
// Initial
91 2 mohor
//
92
//
93 9 mohor
//
94 2 mohor
 
95
// synopsys translate_off
96
`include "timescale.v"
97
// synopsys translate_on
98
`include "can_defines.v"
99
 
100
module can_bsp
101
(
102
  clk,
103 10 mohor
  rst,
104
 
105
  sample_point,
106
  sampled_bit,
107
  sampled_bit_q,
108 24 mohor
  tx_point,
109 11 mohor
  hard_sync,
110
 
111 14 mohor
  addr,
112
  data_out,
113
 
114
 
115 11 mohor
  /* Mode register */
116 10 mohor
  reset_mode,
117 11 mohor
  acceptance_filter_mode,
118
 
119 15 mohor
  /* Command register */
120
  release_buffer,
121
 
122
  /* Clock Divider register */
123 11 mohor
  extended_mode,
124
 
125
  rx_idle,
126 24 mohor
  transmitting,
127 11 mohor
 
128
  /* This section is for BASIC and EXTENDED mode */
129
  /* Acceptance code register */
130
  acceptance_code_0,
131
 
132
  /* Acceptance mask register */
133
  acceptance_mask_0,
134
  /* End: This section is for BASIC and EXTENDED mode */
135 10 mohor
 
136 11 mohor
  /* This section is for EXTENDED mode */
137
  /* Acceptance code register */
138
  acceptance_code_1,
139
  acceptance_code_2,
140
  acceptance_code_3,
141 10 mohor
 
142 11 mohor
  /* Acceptance mask register */
143
  acceptance_mask_1,
144
  acceptance_mask_2,
145 18 mohor
  acceptance_mask_3,
146 11 mohor
  /* End: This section is for EXTENDED mode */
147 10 mohor
 
148 18 mohor
  /* Tx data registers. Holding identifier (basic mode), tx frame information (extended mode) and data */
149
  tx_data_0,
150
  tx_data_1,
151
  tx_data_2,
152
  tx_data_3,
153
  tx_data_4,
154
  tx_data_5,
155
  tx_data_6,
156
  tx_data_7,
157
  tx_data_8,
158
  tx_data_9,
159
  tx_data_10,
160
  tx_data_11,
161 24 mohor
  tx_data_12,
162 18 mohor
  /* End: Tx data registers */
163 24 mohor
 
164
  /* Tx signal */
165
  tx
166 18 mohor
 
167 2 mohor
);
168
 
169
parameter Tp = 1;
170
 
171 10 mohor
input         clk;
172
input         rst;
173
input         sample_point;
174
input         sampled_bit;
175
input         sampled_bit_q;
176 24 mohor
input         tx_point;
177 11 mohor
input         hard_sync;
178 14 mohor
input   [7:0] addr;
179
output  [7:0] data_out;
180 11 mohor
 
181 14 mohor
 
182 10 mohor
input         reset_mode;
183 11 mohor
input         acceptance_filter_mode;
184
input         extended_mode;
185 2 mohor
 
186 15 mohor
/* Command register */
187
input         release_buffer;
188 11 mohor
 
189 10 mohor
output        rx_idle;
190 24 mohor
output        transmitting;
191 2 mohor
 
192 11 mohor
/* This section is for BASIC and EXTENDED mode */
193
/* Acceptance code register */
194
input   [7:0] acceptance_code_0;
195
 
196
/* Acceptance mask register */
197
input   [7:0] acceptance_mask_0;
198
 
199
/* End: This section is for BASIC and EXTENDED mode */
200
 
201
 
202
/* This section is for EXTENDED mode */
203
/* Acceptance code register */
204
input   [7:0] acceptance_code_1;
205
input   [7:0] acceptance_code_2;
206
input   [7:0] acceptance_code_3;
207
 
208
/* Acceptance mask register */
209
input   [7:0] acceptance_mask_1;
210
input   [7:0] acceptance_mask_2;
211
input   [7:0] acceptance_mask_3;
212
/* End: This section is for EXTENDED mode */
213
 
214 24 mohor
/* Tx data registers. Holding identifier (basic mode), tx frame information (extended mode) and data */
215 18 mohor
input   [7:0] tx_data_0;
216
input   [7:0] tx_data_1;
217
input   [7:0] tx_data_2;
218
input   [7:0] tx_data_3;
219
input   [7:0] tx_data_4;
220
input   [7:0] tx_data_5;
221
input   [7:0] tx_data_6;
222
input   [7:0] tx_data_7;
223
input   [7:0] tx_data_8;
224
input   [7:0] tx_data_9;
225
input   [7:0] tx_data_10;
226
input   [7:0] tx_data_11;
227
input   [7:0] tx_data_12;
228 24 mohor
/* End: Tx data registers */
229 11 mohor
 
230 24 mohor
/* Tx signal */
231
output        tx;
232 11 mohor
 
233 10 mohor
reg           reset_mode_q;
234
reg     [5:0] bit_cnt;
235 2 mohor
 
236 10 mohor
reg     [3:0] data_len;
237
reg    [28:0] id;
238
reg     [2:0] bit_stuff_cnt;
239
reg           stuff_error;
240
 
241
wire          bit_de_stuff;
242
 
243
 
244
/* Rx state machine */
245
wire          go_rx_idle;
246
wire          go_rx_id1;
247
wire          go_rx_rtr1;
248
wire          go_rx_ide;
249
wire          go_rx_id2;
250
wire          go_rx_rtr2;
251
wire          go_rx_r1;
252
wire          go_rx_r0;
253
wire          go_rx_dlc;
254
wire          go_rx_data;
255
wire          go_rx_crc;
256 11 mohor
wire          go_rx_crc_lim;
257 10 mohor
wire          go_rx_ack;
258 11 mohor
wire          go_rx_ack_lim;
259 10 mohor
wire          go_rx_eof;
260 24 mohor
wire          go_error_frame;
261
wire          go_overload_frame;
262
wire          go_rx_inter;
263 10 mohor
 
264 11 mohor
wire          go_crc_enable;
265
wire          rst_crc_enable;
266
 
267
wire          bit_de_stuff_set;
268
wire          bit_de_stuff_reset;
269
 
270 10 mohor
reg           rx_idle;
271
reg           rx_id1;
272
reg           rx_rtr1;
273
reg           rx_ide;
274
reg           rx_id2;
275
reg           rx_rtr2;
276
reg           rx_r1;
277
reg           rx_r0;
278
reg           rx_dlc;
279
reg           rx_data;
280
reg           rx_crc;
281 11 mohor
reg           rx_crc_lim;
282 10 mohor
reg           rx_ack;
283 11 mohor
reg           rx_ack_lim;
284 10 mohor
reg           rx_eof;
285 24 mohor
reg           rx_inter;
286 10 mohor
 
287 19 mohor
reg           rtr1;
288
reg           ide;
289
reg           rtr2;
290
reg    [14:0] crc_in;
291
 
292 24 mohor
reg     [7:0] tmp_data;
293
reg     [7:0] tmp_fifo [0:7];
294
reg           write_data_to_tmp_fifo;
295
reg     [2:0] byte_cnt;
296
reg           bit_stuff_cnt_en;
297 11 mohor
reg           crc_enable;
298
 
299 10 mohor
reg     [2:0] eof_cnt;
300 11 mohor
wire   [14:0] calculated_crc;
301 19 mohor
wire          remote_rq;
302 22 mohor
wire    [3:0] limited_data_len;
303 24 mohor
//reg           form_error;
304
wire          form_error;
305 22 mohor
wire          set_form_error;
306 24 mohor
reg           transmitting;
307 10 mohor
 
308 24 mohor
reg           error_frame;
309
reg           enable_error_cnt2;
310
reg     [2:0] error_cnt1;
311
reg     [2:0] error_cnt2;
312
reg           tx;
313
reg           crc_error;
314
 
315
wire          error_frame_ended;
316
wire          bit_error = 0; // FIX ME !!!
317
wire          acknowledge_error = 0; // FIX ME !!!
318
wire          need_to_tx = 0; // When the CAN core has something to transmit and a dominant bit is sampled at the third bit
319
                              // of intermission, it starts reading the identifier (and transmitting its own). // FIX ME !!!
320
wire          overload_needed = 0;  // When receiver is busy, it needs to send overload frame. Only 2 overload frames are allowed to
321
                                    // be send in a row. Counter?   FIX ME
322
 
323
assign go_rx_idle     =                   sample_point &  sampled_bit & rx_inter & (bit_cnt == 2);  // Look the following line for TX
324
//assign go_rx_id1      =                   sample_point &  (~sampled_bit) & (rx_idle | rx_inter & (bit_cnt == 2) & need_to_tx);
325
assign go_rx_id1      =                   sample_point &  (~sampled_bit) & (rx_idle | rx_inter & (bit_cnt == 2));
326 11 mohor
assign go_rx_rtr1     = (~bit_de_stuff) & sample_point &  rx_id1  & (bit_cnt == 10);
327
assign go_rx_ide      = (~bit_de_stuff) & sample_point &  rx_rtr1;
328
assign go_rx_id2      = (~bit_de_stuff) & sample_point &  rx_ide  &   sampled_bit;
329
assign go_rx_rtr2     = (~bit_de_stuff) & sample_point &  rx_id2  & (bit_cnt == 17);
330
assign go_rx_r1       = (~bit_de_stuff) & sample_point &  rx_rtr2;
331
assign go_rx_r0       = (~bit_de_stuff) & sample_point & (rx_ide  & (~sampled_bit) | rx_r1);
332
assign go_rx_dlc      = (~bit_de_stuff) & sample_point &  rx_r0;
333 19 mohor
assign go_rx_data     = (~bit_de_stuff) & sample_point &  rx_dlc  & (bit_cnt == 3) &  (sampled_bit   |   (|data_len[2:0])) & (~remote_rq);
334
assign go_rx_crc      = (~bit_de_stuff) & sample_point & (rx_dlc  & (bit_cnt == 3) & ((~sampled_bit) & (~(|data_len[2:0])) | remote_rq) |
335
                                                          rx_data & (bit_cnt == ((limited_data_len<<3) - 1'b1)));
336 20 mohor
assign go_rx_crc_lim  = (~bit_de_stuff) & sample_point &  rx_crc  & (bit_cnt == 14);
337 11 mohor
assign go_rx_ack      =                   sample_point &  rx_crc_lim;
338
assign go_rx_ack_lim  =                   sample_point &  rx_ack;
339
assign go_rx_eof      =                   sample_point &  rx_ack_lim  | (~reset_mode) & reset_mode_q;
340 24 mohor
assign go_rx_inter    =                 ((sample_point &  rx_eof  & (eof_cnt == 6)) | error_frame_ended) & (~overload_needed);
341 10 mohor
 
342 24 mohor
assign go_error_frame = form_error | stuff_error | bit_error | acknowledge_error | (crc_error & go_rx_eof);
343
assign error_frame_ended = (error_cnt2 == 7) & tx_point;
344
 
345
assign go_overload_frame = ((sample_point &  rx_eof  & (eof_cnt == 6)) | error_frame_ended) & overload_needed |
346
                             sample_point & (~sampled_bit) & rx_inter & ((bit_cnt == 0) | (bit_cnt == 1))     |
347
                             sample_point & (~sampled_bit) & (error_cnt2 == 7)
348
                            ;
349
 
350 11 mohor
assign go_crc_enable  = hard_sync;
351
assign rst_crc_enable = go_rx_crc;
352 10 mohor
 
353 11 mohor
assign bit_de_stuff_set   = go_rx_id1;
354 24 mohor
assign bit_de_stuff_reset = go_rx_crc_lim | reset_mode | go_error_frame;
355 11 mohor
 
356 19 mohor
assign remote_rq = ((~ide) & rtr1) | (ide & rtr2);
357
assign limited_data_len = (data_len < 8)? data_len : 4'h8;
358 11 mohor
 
359 19 mohor
 
360 10 mohor
// Rx idle state
361
always @ (posedge clk or posedge rst)
362
begin
363
  if (rst)
364 24 mohor
    rx_idle <= 1'b0;
365
  else if (reset_mode | go_rx_id1 | error_frame)
366 10 mohor
    rx_idle <=#Tp 1'b0;
367
  else if (go_rx_idle)
368
    rx_idle <=#Tp 1'b1;
369
end
370
 
371
 
372
// Rx id1 state
373
always @ (posedge clk or posedge rst)
374
begin
375
  if (rst)
376
    rx_id1 <= 1'b0;
377 24 mohor
  else if (reset_mode | go_rx_rtr1 | error_frame)
378 10 mohor
    rx_id1 <=#Tp 1'b0;
379
  else if (go_rx_id1)
380
    rx_id1 <=#Tp 1'b1;
381
end
382
 
383
 
384
// Rx rtr1 state
385
always @ (posedge clk or posedge rst)
386
begin
387
  if (rst)
388
    rx_rtr1 <= 1'b0;
389 24 mohor
  else if (reset_mode | go_rx_ide | error_frame)
390 10 mohor
    rx_rtr1 <=#Tp 1'b0;
391
  else if (go_rx_rtr1)
392
    rx_rtr1 <=#Tp 1'b1;
393
end
394
 
395
 
396
// Rx ide state
397
always @ (posedge clk or posedge rst)
398
begin
399
  if (rst)
400
    rx_ide <= 1'b0;
401 24 mohor
  else if (reset_mode | go_rx_r0 | go_rx_id2 | error_frame)
402 10 mohor
    rx_ide <=#Tp 1'b0;
403
  else if (go_rx_ide)
404
    rx_ide <=#Tp 1'b1;
405
end
406
 
407
 
408
// Rx id2 state
409
always @ (posedge clk or posedge rst)
410
begin
411
  if (rst)
412
    rx_id2 <= 1'b0;
413 24 mohor
  else if (reset_mode | go_rx_rtr2 | error_frame)
414 10 mohor
    rx_id2 <=#Tp 1'b0;
415
  else if (go_rx_id2)
416
    rx_id2 <=#Tp 1'b1;
417
end
418
 
419
 
420
// Rx rtr2 state
421
always @ (posedge clk or posedge rst)
422
begin
423
  if (rst)
424
    rx_rtr2 <= 1'b0;
425 24 mohor
  else if (reset_mode | go_rx_r1 | error_frame)
426 10 mohor
    rx_rtr2 <=#Tp 1'b0;
427
  else if (go_rx_rtr2)
428
    rx_rtr2 <=#Tp 1'b1;
429
end
430
 
431
 
432
// Rx r0 state
433
always @ (posedge clk or posedge rst)
434
begin
435
  if (rst)
436
    rx_r1 <= 1'b0;
437 24 mohor
  else if (reset_mode | go_rx_r0 | error_frame)
438 10 mohor
    rx_r1 <=#Tp 1'b0;
439
  else if (go_rx_r1)
440
    rx_r1 <=#Tp 1'b1;
441
end
442
 
443
 
444
// Rx r0 state
445
always @ (posedge clk or posedge rst)
446
begin
447
  if (rst)
448
    rx_r0 <= 1'b0;
449 24 mohor
  else if (reset_mode | go_rx_dlc | error_frame)
450 10 mohor
    rx_r0 <=#Tp 1'b0;
451
  else if (go_rx_r0)
452
    rx_r0 <=#Tp 1'b1;
453
end
454
 
455
 
456
// Rx dlc state
457
always @ (posedge clk or posedge rst)
458
begin
459
  if (rst)
460
    rx_dlc <= 1'b0;
461 24 mohor
  else if (reset_mode | go_rx_data | go_rx_crc | error_frame)
462 10 mohor
    rx_dlc <=#Tp 1'b0;
463
  else if (go_rx_dlc)
464
    rx_dlc <=#Tp 1'b1;
465
end
466
 
467
 
468
// Rx data state
469
always @ (posedge clk or posedge rst)
470
begin
471
  if (rst)
472
    rx_data <= 1'b0;
473 24 mohor
  else if (reset_mode | go_rx_crc | error_frame)
474 10 mohor
    rx_data <=#Tp 1'b0;
475
  else if (go_rx_data)
476
    rx_data <=#Tp 1'b1;
477
end
478
 
479
 
480
// Rx crc state
481
always @ (posedge clk or posedge rst)
482
begin
483
  if (rst)
484
    rx_crc <= 1'b0;
485 24 mohor
  else if (reset_mode | go_rx_crc_lim | error_frame)
486 10 mohor
    rx_crc <=#Tp 1'b0;
487
  else if (go_rx_crc)
488
    rx_crc <=#Tp 1'b1;
489
end
490
 
491
 
492 11 mohor
// Rx crc delimiter state
493
always @ (posedge clk or posedge rst)
494
begin
495
  if (rst)
496
    rx_crc_lim <= 1'b0;
497 24 mohor
  else if (reset_mode | go_rx_ack | error_frame)
498 11 mohor
    rx_crc_lim <=#Tp 1'b0;
499
  else if (go_rx_crc_lim)
500
    rx_crc_lim <=#Tp 1'b1;
501
end
502
 
503
 
504 10 mohor
// Rx ack state
505
always @ (posedge clk or posedge rst)
506
begin
507
  if (rst)
508
    rx_ack <= 1'b0;
509 24 mohor
  else if (reset_mode | go_rx_ack_lim | error_frame)
510 10 mohor
    rx_ack <=#Tp 1'b0;
511
  else if (go_rx_ack)
512
    rx_ack <=#Tp 1'b1;
513
end
514
 
515
 
516 11 mohor
// Rx ack delimiter state
517
always @ (posedge clk or posedge rst)
518
begin
519
  if (rst)
520
    rx_ack_lim <= 1'b0;
521 24 mohor
  else if (reset_mode | go_rx_eof | error_frame)
522 11 mohor
    rx_ack_lim <=#Tp 1'b0;
523
  else if (go_rx_ack_lim)
524
    rx_ack_lim <=#Tp 1'b1;
525
end
526
 
527
 
528 10 mohor
// Rx eof state
529
always @ (posedge clk or posedge rst)
530
begin
531
  if (rst)
532
    rx_eof <= 1'b0;
533 24 mohor
  else if (go_rx_inter | error_frame)
534 10 mohor
    rx_eof <=#Tp 1'b0;
535
  else if (go_rx_eof)
536
    rx_eof <=#Tp 1'b1;
537
end
538
 
539
 
540 24 mohor
 
541
// Interframe space
542
always @ (posedge clk or posedge rst)
543
begin
544
  if (rst)
545
    rx_inter <= 1'b0;
546
  else if (go_rx_idle | go_rx_id1 | go_overload_frame | go_error_frame)
547
    rx_inter <=#Tp 1'b0;
548
  else if (go_rx_inter)
549
    rx_inter <=#Tp 1'b1;
550
end
551
 
552
 
553 10 mohor
// ID register
554
always @ (posedge clk or posedge rst)
555
begin
556
  if (rst)
557
    id <= 0;
558 11 mohor
  else if (sample_point & (rx_id1 | rx_id2) & (~bit_de_stuff))
559 10 mohor
    id <=#Tp {id[27:0], sampled_bit};
560
end
561
 
562 11 mohor
 
563
// rtr1 bit
564
always @ (posedge clk or posedge rst)
565
begin
566
  if (rst)
567
    rtr1 <= 0;
568
  else if (sample_point & rx_rtr1 & (~bit_de_stuff))
569
    rtr1 <=#Tp sampled_bit;
570
end
571
 
572
 
573
// rtr2 bit
574
always @ (posedge clk or posedge rst)
575
begin
576
  if (rst)
577
    rtr2 <= 0;
578
  else if (sample_point & rx_rtr2 & (~bit_de_stuff))
579
    rtr2 <=#Tp sampled_bit;
580
end
581
 
582
 
583
// ide bit
584
always @ (posedge clk or posedge rst)
585
begin
586
  if (rst)
587
    ide <= 0;
588
  else if (sample_point & rx_ide & (~bit_de_stuff))
589
    ide <=#Tp sampled_bit;
590
end
591
 
592
 
593 10 mohor
// Data length
594
always @ (posedge clk or posedge rst)
595
begin
596
  if (rst)
597
    data_len <= 0;
598
  else if (sample_point & rx_dlc & (~bit_de_stuff))
599
    data_len <=#Tp {data_len[2:0], sampled_bit};
600
end
601
 
602
 
603 11 mohor
// Data
604
always @ (posedge clk or posedge rst)
605
begin
606
  if (rst)
607
    tmp_data <= 0;
608
  else if (sample_point & rx_data & (~bit_de_stuff))
609
    tmp_data <=#Tp {tmp_data[6:0], sampled_bit};
610
end
611
 
612
 
613
always @ (posedge clk or posedge rst)
614
begin
615
  if (rst)
616
    write_data_to_tmp_fifo <= 0;
617
  else if (sample_point & rx_data & (~bit_de_stuff) & (&bit_cnt[2:0]))
618
    write_data_to_tmp_fifo <=#Tp 1'b1;
619
  else
620
    write_data_to_tmp_fifo <=#Tp 0;
621
end
622
 
623
 
624
always @ (posedge clk or posedge rst)
625
begin
626
  if (rst)
627
    byte_cnt <= 0;
628
  else if (write_data_to_tmp_fifo)
629
    byte_cnt <=#Tp byte_cnt + 1;
630
  else if (sample_point & go_rx_crc_lim)
631
    byte_cnt <=#Tp 0;
632
end
633
 
634
 
635 24 mohor
always @ (posedge clk)
636 11 mohor
begin
637
  if (write_data_to_tmp_fifo)
638
    tmp_fifo[byte_cnt] <=#Tp tmp_data;
639
end
640
 
641
 
642
 
643
// CRC
644
always @ (posedge clk or posedge rst)
645
begin
646
  if (rst)
647
    crc_in <= 0;
648
  else if (sample_point & rx_crc & (~bit_de_stuff))
649
    crc_in <=#Tp {crc_in[13:0], sampled_bit};
650
end
651
 
652
 
653 10 mohor
// bit_cnt
654
always @ (posedge clk or posedge rst)
655
begin
656
  if (rst)
657
    bit_cnt <= 0;
658 24 mohor
  else if (go_rx_id1 | go_rx_id2 | go_rx_dlc | go_rx_data | go_rx_crc |
659
           go_rx_ack | go_rx_eof | go_rx_inter | go_error_frame | go_overload_frame)
660 10 mohor
    bit_cnt <=#Tp 0;
661 11 mohor
  else if (sample_point & (~bit_de_stuff))
662 10 mohor
    bit_cnt <=#Tp bit_cnt + 1'b1;
663
end
664
 
665
 
666
// eof_cnt
667
always @ (posedge clk or posedge rst)
668
begin
669
  if (rst)
670
    eof_cnt <= 0;
671
  else if (sample_point)
672
    begin
673
      if (rx_eof & sampled_bit)
674
        eof_cnt <=#Tp eof_cnt + 1'b1;
675
      else
676
        eof_cnt <=#Tp 0;
677
    end
678
end
679
 
680
 
681 11 mohor
// Enabling bit de-stuffing
682
always @ (posedge clk or posedge rst)
683
begin
684
  if (rst)
685
    bit_stuff_cnt_en <= 1'b0;
686
  else if (bit_de_stuff_set)
687
    bit_stuff_cnt_en <=#Tp 1'b1;
688
  else if (bit_de_stuff_reset)
689
    bit_stuff_cnt_en <=#Tp 1'b0;
690
end
691 10 mohor
 
692 24 mohor
 
693 10 mohor
// bit_stuff_cnt
694
always @ (posedge clk or posedge rst)
695
begin
696
  if (rst)
697
    bit_stuff_cnt <= 1;
698 15 mohor
  else if (bit_de_stuff_reset)
699
    bit_stuff_cnt <=#Tp 1;
700 11 mohor
  else if (sample_point & bit_stuff_cnt_en)
701 10 mohor
    begin
702
      if (bit_stuff_cnt == 5)
703
        bit_stuff_cnt <=#Tp 1;
704
      else if (sampled_bit == sampled_bit_q)
705
        bit_stuff_cnt <=#Tp bit_stuff_cnt + 1'b1;
706
      else
707
        bit_stuff_cnt <=#Tp 1;
708
    end
709
end
710
 
711
 
712
assign bit_de_stuff = bit_stuff_cnt == 5;
713
 
714
 
715 24 mohor
 
716 10 mohor
// stuff_error
717
always @ (posedge clk or posedge rst)
718
begin
719
  if (rst)
720
    stuff_error <= 0;
721 24 mohor
  else if (reset_mode | go_rx_idle | error_frame)     // Stuff error might reset itself
722
    stuff_error <=#Tp 0;
723
  else if (sample_point & bit_stuff_cnt_en & bit_de_stuff & (sampled_bit == sampled_bit_q))
724 10 mohor
    stuff_error <=#Tp 1'b1;
725
end
726
 
727
 
728
// Generating delayed reset_mode signal
729
always @ (posedge clk)
730
begin
731
  reset_mode_q <=#Tp reset_mode;
732
end
733
 
734
 
735 11 mohor
 
736
always @ (posedge clk or posedge rst)
737
begin
738
  if (rst)
739
    crc_enable <= 1'b0;
740
  else if (go_crc_enable)
741
    crc_enable <=#Tp 1'b1;
742
  else if (reset_mode | rst_crc_enable)
743
    crc_enable <=#Tp 1'b0;
744
end
745
 
746
 
747
// CRC error generation
748
always @ (posedge clk or posedge rst)
749
begin
750
  if (rst)
751
    crc_error <= 0;
752 12 mohor
  else if (go_rx_ack)
753 11 mohor
    crc_error <=#Tp crc_in != calculated_crc;
754 24 mohor
  else if (reset_mode | go_rx_idle | error_frame)   // CRC error might reset itself
755 11 mohor
    crc_error <=#Tp 0;
756
end
757
 
758
 
759 22 mohor
// Conditions for form error
760 24 mohor
//assign set_form_error = sample_point & ( (~bit_de_stuff) & rx_ide     &   sampled_bit & (~rtr1) |
761
assign     form_error = sample_point & ( (~bit_de_stuff) & rx_ide     &   sampled_bit & (~rtr1) |
762 22 mohor
                                                           rx_crc_lim & (~sampled_bit)          |
763
                                                           rx_ack_lim & (~sampled_bit)          |
764
                                                           rx_eof     & (~sampled_bit)
765
                                       );
766 11 mohor
 
767 24 mohor
/*
768 22 mohor
// Form error
769
always @ (posedge clk or posedge rst)
770
begin
771
  if (rst)
772
    form_error <= 1'b0;
773 24 mohor
  else if (reset_mode | go_rx_idle | error_frame)
774 22 mohor
    form_error <=#Tp 1'b0;
775
  else if (set_form_error)
776
    form_error <=#Tp 1'b1;
777
end
778 24 mohor
*/
779 22 mohor
 
780 11 mohor
// Instantiation of the RX CRC module
781
can_crc i_can_crc_rx
782
(
783
  .clk(clk),
784
//  .data(sampled_bit & (~rx_crc)),     // Zeros are shifted in for calculation when we are in crc stage
785
  .data(sampled_bit ),     // Zeros are shifted in for calculation when we are in crc stage
786
  .enable(crc_enable & sample_point & (~bit_de_stuff)),
787
  .initialize(rx_eof),
788
  .crc(calculated_crc)
789
);
790
 
791
 
792
 
793
wire          id_ok;        // If received ID matches ID set in registers
794 16 mohor
wire          no_byte0;     // There is no byte 0 (RTR bit set to 1 or DLC field equal to 0). Signal used for acceptance filter.
795
wire          no_byte1;     // There is no byte 1 (RTR bit set to 1 or DLC field equal to 1). Signal used for acceptance filter.
796 11 mohor
 
797 16 mohor
assign no_byte0 = rtr1 | (data_len<1);
798
assign no_byte1 = rtr1 | (data_len<2);
799 11 mohor
 
800
can_acf i_can_acf
801
(
802
  .clk(clk),
803
  .rst(rst),
804
 
805
  .id(id),
806
 
807
  /* Mode register */
808
  .reset_mode(reset_mode),
809
  .acceptance_filter_mode(acceptance_filter_mode),
810
 
811 12 mohor
  // Clock Divider register
812 11 mohor
  .extended_mode(extended_mode),
813
 
814
  /* This section is for BASIC and EXTENDED mode */
815
  /* Acceptance code register */
816
  .acceptance_code_0(acceptance_code_0),
817
 
818
  /* Acceptance mask register */
819
  .acceptance_mask_0(acceptance_mask_0),
820
  /* End: This section is for BASIC and EXTENDED mode */
821
 
822
  /* This section is for EXTENDED mode */
823
  /* Acceptance code register */
824
  .acceptance_code_1(acceptance_code_1),
825
  .acceptance_code_2(acceptance_code_2),
826
  .acceptance_code_3(acceptance_code_3),
827
 
828
  /* Acceptance mask register */
829
  .acceptance_mask_1(acceptance_mask_1),
830
  .acceptance_mask_2(acceptance_mask_2),
831
  .acceptance_mask_3(acceptance_mask_3),
832
  /* End: This section is for EXTENDED mode */
833
 
834
  .go_rx_crc_lim(go_rx_crc_lim),
835
  .go_rx_idle(go_rx_idle),
836
 
837
  .data0(tmp_fifo[0]),
838
  .data1(tmp_fifo[1]),
839
  .rtr1(rtr1),
840
  .rtr2(rtr2),
841
  .ide(ide),
842 16 mohor
  .no_byte0(no_byte0),
843
  .no_byte1(no_byte1),
844 11 mohor
 
845
  .id_ok(id_ok)
846
 
847
);
848
 
849
 
850
 
851 13 mohor
reg [3:0]   data_cnt;       // Counting the data bytes that are written to FIFO
852
reg [2:0]   header_cnt;     // Counting header length
853
reg         wr_fifo;        // Write data and header to 64-byte fifo
854
reg [7:0]   data_for_fifo;  // Multiplexed data that is stored to 64-byte fifo
855 11 mohor
 
856 12 mohor
 
857 13 mohor
wire [2:0]  header_len;
858
wire        storing_header;
859 19 mohor
wire [3:0]  limited_data_len_minus1;
860 16 mohor
wire        reset_wr_fifo;
861 20 mohor
wire        no_error;
862 24 mohor
 
863 16 mohor
assign header_len[2:0] = extended_mode ? (ide? (3'h5) : (3'h3)) : 3'h2;
864 13 mohor
assign storing_header = header_cnt < header_len;
865 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
866
assign reset_wr_fifo = data_cnt == (limited_data_len_minus1 + header_len);
867 24 mohor
assign no_error = (~crc_error) & (~form_error) & (~stuff_error);
868 12 mohor
 
869 24 mohor
 
870
 
871 13 mohor
// Write enable signal for 64-byte rx fifo
872
always @ (posedge clk or posedge rst)
873
begin
874
  if (rst)
875
    wr_fifo <= 1'b0;
876 16 mohor
  else if (reset_wr_fifo)
877
    wr_fifo <=#Tp 1'b0;
878 24 mohor
  else if (go_rx_inter & id_ok & (~error_frame_ended))
879 13 mohor
    wr_fifo <=#Tp 1'b1;
880
end
881 12 mohor
 
882
 
883 13 mohor
// Header counter. Header length depends on the mode of operation and frame format.
884 12 mohor
always @ (posedge clk or posedge rst)
885
begin
886
  if (rst)
887 13 mohor
    header_cnt <= 0;
888 16 mohor
  else if (reset_wr_fifo)
889
    header_cnt <=#Tp 0;
890
  else if (wr_fifo & storing_header)
891 13 mohor
    header_cnt <=#Tp header_cnt + 1;
892 12 mohor
end
893
 
894
 
895 13 mohor
// Data counter. Length of the data is limited to 8 bytes.
896 12 mohor
always @ (posedge clk or posedge rst)
897
begin
898
  if (rst)
899 13 mohor
    data_cnt <= 0;
900 16 mohor
  else if (reset_wr_fifo)
901
    data_cnt <=#Tp 0;
902
  else if (wr_fifo)
903 13 mohor
    data_cnt <=#Tp data_cnt + 1;
904 12 mohor
end
905
 
906
 
907 13 mohor
// Multiplexing data that is stored to 64-byte fifo depends on the mode of operation and frame format
908 24 mohor
always @ (extended_mode or ide or data_cnt or header_cnt or  header_len or
909
          storing_header or id or rtr1 or rtr2 or data_len or
910 13 mohor
          tmp_fifo[0] or tmp_fifo[2] or tmp_fifo[4] or tmp_fifo[6] or
911
          tmp_fifo[1] or tmp_fifo[3] or tmp_fifo[5] or tmp_fifo[7])
912 12 mohor
begin
913 13 mohor
  if (storing_header)
914 12 mohor
    begin
915 13 mohor
      if (extended_mode)      // extended mode
916 12 mohor
        begin
917 13 mohor
          if (ide)              // extended format
918
            begin
919 24 mohor
              case (header_cnt) // synthesis parallel_case 
920
                3'h0  : data_for_fifo <= {1'b1, rtr2, 2'h0, data_len};
921
                3'h1  : data_for_fifo <= id[28:21];
922
                3'h2  : data_for_fifo <= id[20:13];
923
                3'h3  : data_for_fifo <= id[12:5];
924
                3'h4  : data_for_fifo <= {id[4:0], 3'h0};
925
                default: data_for_fifo <= 0;
926 13 mohor
              endcase
927
            end
928
          else                  // standard format
929
            begin
930 24 mohor
              case (header_cnt) // synthesis parallel_case 
931
                3'h0  : data_for_fifo <= {1'b0, rtr1, 2'h0, data_len};
932
                3'h1  : data_for_fifo <= id[10:3];
933
                3'h2  : data_for_fifo <= {id[2:0], 5'h0};
934
                default: data_for_fifo <= 0;
935 13 mohor
              endcase
936
            end
937 12 mohor
        end
938 13 mohor
      else                    // normal mode
939 12 mohor
        begin
940 24 mohor
          case (header_cnt) // synthesis parallel_case 
941
            3'h0  : data_for_fifo <= id[10:3];
942
            3'h1  : data_for_fifo <= {id[2:0], rtr1, data_len};
943
            default: data_for_fifo <= 0;
944 12 mohor
          endcase
945
        end
946
    end
947 13 mohor
  else
948 16 mohor
    data_for_fifo <= tmp_fifo[data_cnt-header_len];
949 12 mohor
end
950
 
951
 
952
 
953
 
954
// Instantiation of the RX fifo module
955 13 mohor
can_fifo i_can_fifo
956 12 mohor
(
957
  .clk(clk),
958
  .rst(rst),
959
 
960 13 mohor
  .wr(wr_fifo),
961 12 mohor
 
962 13 mohor
  .data_in(data_for_fifo),
963 14 mohor
  .addr(addr),
964
  .data_out(data_out),
965 12 mohor
 
966
  .reset_mode(reset_mode),
967 15 mohor
  .release_buffer(release_buffer),
968 14 mohor
  .extended_mode(extended_mode)
969 12 mohor
 
970
 
971
);
972
 
973
 
974
 
975 24 mohor
// transmitting signals that core is a transmitter. No synchronization is done meanwhile.
976
always @ (posedge clk or posedge rst)
977
begin
978
  if (rst)
979
    transmitting <= 1'b0;
980
  else if (go_rx_idle | reset_mode)
981
    transmitting <=#Tp 1'b0;
982
  else if (~no_error)
983
    transmitting <=#Tp 1'b1;
984
end
985 12 mohor
 
986
 
987
 
988 24 mohor
// Transmitting error frame. The same counters are used for sending overload frame, too.
989
always @ (posedge clk or posedge rst)
990
begin
991
  if (rst)
992
    error_frame <= 1'b0;
993
  else if (reset_mode | error_frame_ended)
994
    error_frame <=#Tp 1'b0;
995
  else if (go_error_frame | go_overload_frame)
996
    error_frame <=#Tp 1'b1;
997
end
998 12 mohor
 
999 13 mohor
 
1000 24 mohor
always @ (posedge clk or posedge rst)
1001
begin
1002
  if (rst)
1003
    error_cnt1 <= 1'b0;
1004
  else if (reset_mode | error_frame_ended)
1005
    error_cnt1 <=#Tp 1'b0;
1006
  else if (error_frame & tx_point & (error_cnt1 < 6))
1007
    error_cnt1 <=#Tp error_cnt1 + 1'b1;
1008
end
1009
 
1010
 
1011
always @ (posedge clk or posedge rst)
1012
begin
1013
  if (rst)
1014
    enable_error_cnt2 <= 1'b0;
1015
  else if (reset_mode | error_frame_ended)
1016
    enable_error_cnt2 <=#Tp 1'b0;
1017
  else if (sample_point & sampled_bit & (error_cnt1 == 6))
1018
    enable_error_cnt2 <=#Tp 1'b1;
1019
end
1020
 
1021
 
1022
 
1023
always @ (posedge clk or posedge rst)
1024
begin
1025
  if (rst)
1026
    error_cnt2 <= 1'b0;
1027
  else if (reset_mode | error_frame_ended)
1028
    error_cnt2 <=#Tp 1'b0;
1029
  else if (enable_error_cnt2 & tx_point)
1030
    error_cnt2 <=#Tp error_cnt2 + 1'b1;
1031
end
1032
 
1033
 
1034
wire node_error_passive = 1;
1035
 
1036
always @ (posedge clk or posedge rst)
1037
begin
1038
  if (rst)
1039
    tx <= 1'b1;
1040
  else if (reset_mode | error_frame_ended)
1041
    tx <=#Tp 1'b1;
1042
  else if (tx_point & error_frame)
1043
    begin
1044
      if (error_cnt1 < 6)
1045
        begin
1046
          if (node_error_passive)
1047
            tx <=#Tp 1'b1;
1048
          else
1049
            tx <=#Tp 1'b0;
1050
        end
1051
      else if (error_cnt2 < 7)
1052
        tx <=#Tp 1'b1;
1053
    end
1054
end
1055
 
1056
 
1057
 
1058
 
1059
 
1060
 
1061
 
1062
 
1063
 
1064 2 mohor
endmodule

powered by: WebSVN 2.1.0

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