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

Subversion Repositories can

[/] [can/] [tags/] [rel_22/] [rtl/] [verilog/] [can_registers.v] - Blame information for rev 104

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 66 mohor
//////////////////////////////////////////////////////////////////////
2
////                                                              ////
3
////  can_registers.v                                             ////
4
////                                                              ////
5
////                                                              ////
6
////  This file is part of the CAN Protocol Controller            ////
7
////  http://www.opencores.org/projects/can/                      ////
8
////                                                              ////
9
////                                                              ////
10
////  Author(s):                                                  ////
11
////       Igor Mohor                                             ////
12
////       igorm@opencores.org                                    ////
13
////                                                              ////
14
////                                                              ////
15
////  All additional information is available in the README.txt   ////
16
////  file.                                                       ////
17
////                                                              ////
18
//////////////////////////////////////////////////////////////////////
19
////                                                              ////
20
//// Copyright (C) 2002, 2003 Authors                             ////
21
////                                                              ////
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
//// 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
//////////////////////////////////////////////////////////////////////
49
//
50
// CVS Revision History
51
//
52
// $Log: not supported by cvs2svn $
53 104 tadejm
// Revision 1.28  2003/07/07 11:21:37  mohor
54
// Little fixes (to fix warnings).
55
//
56 102 mohor
// Revision 1.27  2003/06/22 09:43:03  mohor
57
// synthesi full_case parallel_case fixed.
58
//
59 93 mohor
// Revision 1.26  2003/06/22 01:33:14  mohor
60
// clkout is clk/2 after the reset.
61
//
62 92 mohor
// Revision 1.25  2003/06/21 12:16:30  mohor
63
// paralel_case and full_case compiler directives added to case statements.
64
//
65 90 mohor
// Revision 1.24  2003/06/09 11:22:54  mohor
66
// data_out is already registered in the can_top.v file.
67
//
68 70 mohor
// Revision 1.23  2003/04/15 15:31:24  mohor
69
// Some features are supported in extended mode only (listen_only_mode...).
70
//
71 69 mohor
// Revision 1.22  2003/03/20 16:58:50  mohor
72
// unix.
73
//
74 66 mohor
// Revision 1.20  2003/03/11 16:31:05  mohor
75
// Mux used for clkout to avoid "gated clocks warning".
76
//
77
// Revision 1.19  2003/03/10 17:34:25  mohor
78
// Doubled declarations removed.
79
//
80
// Revision 1.18  2003/03/01 22:52:11  mohor
81
// Data is latched on read.
82
//
83
// Revision 1.17  2003/02/19 15:09:02  mohor
84
// Incomplete sensitivity list fixed.
85
//
86
// Revision 1.16  2003/02/19 14:44:03  mohor
87
// CAN core finished. Host interface added. Registers finished.
88
// Synchronization to the wishbone finished.
89
//
90
// Revision 1.15  2003/02/18 00:10:15  mohor
91
// Most of the registers added. Registers "arbitration lost capture", "error code
92
// capture" + few more still need to be added.
93
//
94
// Revision 1.14  2003/02/14 20:17:01  mohor
95
// Several registers added. Not finished, yet.
96
//
97
// Revision 1.13  2003/02/12 14:25:30  mohor
98
// abort_tx added.
99
//
100
// Revision 1.12  2003/02/11 00:56:06  mohor
101
// Wishbone interface added.
102
//
103
// Revision 1.11  2003/02/09 02:24:33  mohor
104
// Bosch license warning added. Error counters finished. Overload frames
105
// still need to be fixed.
106
//
107
// Revision 1.10  2003/01/31 01:13:38  mohor
108
// backup.
109
//
110
// Revision 1.9  2003/01/15 13:16:48  mohor
111
// When a frame with "remote request" is received, no data is stored
112
// to fifo, just the frame information (identifier, ...). Data length
113
// that is stored is the received data length and not the actual data
114
// length that is stored to fifo.
115
//
116
// Revision 1.8  2003/01/14 17:25:09  mohor
117
// Addresses corrected to decimal values (previously hex).
118
//
119
// Revision 1.7  2003/01/14 12:19:35  mohor
120
// rx_fifo is now working.
121
//
122
// Revision 1.6  2003/01/10 17:51:34  mohor
123
// Temporary version (backup).
124
//
125
// Revision 1.5  2003/01/09 14:46:58  mohor
126
// Temporary files (backup).
127
//
128
// Revision 1.4  2003/01/08 02:10:55  mohor
129
// Acceptance filter added.
130
//
131
// Revision 1.3  2002/12/27 00:12:52  mohor
132
// Header changed, testbench improved to send a frame (crc still missing).
133
//
134
// Revision 1.2  2002/12/26 16:00:34  mohor
135
// Testbench define file added. Clock divider register added.
136
//
137
// Revision 1.1.1.1  2002/12/20 16:39:21  mohor
138
// Initial
139
//
140
//
141
//
142
 
143
// synopsys translate_off
144
`include "timescale.v"
145
// synopsys translate_on
146
`include "can_defines.v"
147
 
148
module can_registers
149
(
150
  clk,
151
  rst,
152
  cs,
153
  we,
154
  addr,
155
  data_in,
156
  data_out,
157
  irq,
158
 
159
  sample_point,
160
  transmitting,
161
  set_reset_mode,
162
  node_bus_off,
163
  error_status,
164
  rx_err_cnt,
165
  tx_err_cnt,
166
  transmit_status,
167
  receive_status,
168
  tx_successful,
169
  need_to_tx,
170
  overrun,
171
  info_empty,
172
  set_bus_error_irq,
173
  set_arbitration_lost_irq,
174
  arbitration_lost_capture,
175
  node_error_passive,
176
  node_error_active,
177
  rx_message_counter,
178
 
179
 
180
  /* Mode register */
181
  reset_mode,
182
  listen_only_mode,
183
  acceptance_filter_mode,
184
  self_test_mode,
185
 
186
 
187
  /* Command register */
188
  clear_data_overrun,
189
  release_buffer,
190
  abort_tx,
191
  tx_request,
192
  self_rx_request,
193
  single_shot_transmission,
194 104 tadejm
  tx_state,
195
  tx_state_q,
196 66 mohor
 
197
  /* Arbitration Lost Capture Register */
198
  read_arbitration_lost_capture_reg,
199
 
200
  /* Error Code Capture Register */
201
  read_error_code_capture_reg,
202
  error_capture_code,
203
 
204
  /* Bus Timing 0 register */
205
  baud_r_presc,
206
  sync_jump_width,
207
 
208
  /* Bus Timing 1 register */
209
  time_segment1,
210
  time_segment2,
211
  triple_sampling,
212
 
213
  /* Error Warning Limit register */
214
  error_warning_limit,
215
 
216
  /* Rx Error Counter register */
217
  we_rx_err_cnt,
218
 
219
  /* Tx Error Counter register */
220
  we_tx_err_cnt,
221
 
222
  /* Clock Divider register */
223
  extended_mode,
224
  clkout,
225
 
226
 
227
  /* This section is for BASIC and EXTENDED mode */
228
  /* Acceptance code register */
229
  acceptance_code_0,
230
 
231
  /* Acceptance mask register */
232
  acceptance_mask_0,
233
  /* End: This section is for BASIC and EXTENDED mode */
234
 
235
  /* This section is for EXTENDED mode */
236
  /* Acceptance code register */
237
  acceptance_code_1,
238
  acceptance_code_2,
239
  acceptance_code_3,
240
 
241
  /* Acceptance mask register */
242
  acceptance_mask_1,
243
  acceptance_mask_2,
244
  acceptance_mask_3,
245
  /* End: This section is for EXTENDED mode */
246
 
247
  /* Tx data registers. Holding identifier (basic mode), tx frame information (extended mode) and data */
248
  tx_data_0,
249
  tx_data_1,
250
  tx_data_2,
251
  tx_data_3,
252
  tx_data_4,
253
  tx_data_5,
254
  tx_data_6,
255
  tx_data_7,
256
  tx_data_8,
257
  tx_data_9,
258
  tx_data_10,
259
  tx_data_11,
260
  tx_data_12
261
  /* End: Tx data registers */
262
 
263
 
264
 
265
 
266
);
267
 
268
parameter Tp = 1;
269
 
270
input         clk;
271
input         rst;
272
input         cs;
273
input         we;
274
input   [7:0] addr;
275
input   [7:0] data_in;
276
 
277
output  [7:0] data_out;
278
reg     [7:0] data_out;
279
 
280
output        irq;
281
 
282
input         sample_point;
283
input         transmitting;
284
input         set_reset_mode;
285
input         node_bus_off;
286
input         error_status;
287
input   [7:0] rx_err_cnt;
288
input   [7:0] tx_err_cnt;
289
input         transmit_status;
290
input         receive_status;
291
input         tx_successful;
292
input         need_to_tx;
293
input         overrun;
294
input         info_empty;
295
input         set_bus_error_irq;
296
input         set_arbitration_lost_irq;
297
input   [4:0] arbitration_lost_capture;
298
input         node_error_passive;
299
input         node_error_active;
300
input   [6:0] rx_message_counter;
301
 
302
 
303
 
304
/* Mode register */
305
output        reset_mode;
306
output        listen_only_mode;
307
output        acceptance_filter_mode;
308
output        self_test_mode;
309
 
310
/* Command register */
311
output        clear_data_overrun;
312
output        release_buffer;
313
output        abort_tx;
314
output        tx_request;
315
output        self_rx_request;
316
output        single_shot_transmission;
317 104 tadejm
input         tx_state;
318
input         tx_state_q;
319 66 mohor
 
320
/* Arbitration Lost Capture Register */
321
output        read_arbitration_lost_capture_reg;
322
 
323
/* Error Code Capture Register */
324
output        read_error_code_capture_reg;
325
input   [7:0] error_capture_code;
326
 
327
/* Bus Timing 0 register */
328
output  [5:0] baud_r_presc;
329
output  [1:0] sync_jump_width;
330
 
331
 
332
/* Bus Timing 1 register */
333
output  [3:0] time_segment1;
334
output  [2:0] time_segment2;
335
output        triple_sampling;
336
 
337
/* Error Warning Limit register */
338
output  [7:0] error_warning_limit;
339
 
340
/* Rx Error Counter register */
341
output        we_rx_err_cnt;
342
 
343
/* Tx Error Counter register */
344
output        we_tx_err_cnt;
345
 
346
/* Clock Divider register */
347
output        extended_mode;
348
output        clkout;
349
 
350
 
351
/* This section is for BASIC and EXTENDED mode */
352
/* Acceptance code register */
353
output  [7:0] acceptance_code_0;
354
 
355
/* Acceptance mask register */
356
output  [7:0] acceptance_mask_0;
357
 
358
/* End: This section is for BASIC and EXTENDED mode */
359
 
360
 
361
/* This section is for EXTENDED mode */
362
/* Acceptance code register */
363
output  [7:0] acceptance_code_1;
364
output  [7:0] acceptance_code_2;
365
output  [7:0] acceptance_code_3;
366
 
367
/* Acceptance mask register */
368
output  [7:0] acceptance_mask_1;
369
output  [7:0] acceptance_mask_2;
370
output  [7:0] acceptance_mask_3;
371
 
372
/* End: This section is for EXTENDED mode */
373
 
374
/* Tx data registers. Holding identifier (basic mode), tx frame information (extended mode) and data */
375
output  [7:0] tx_data_0;
376
output  [7:0] tx_data_1;
377
output  [7:0] tx_data_2;
378
output  [7:0] tx_data_3;
379
output  [7:0] tx_data_4;
380
output  [7:0] tx_data_5;
381
output  [7:0] tx_data_6;
382
output  [7:0] tx_data_7;
383
output  [7:0] tx_data_8;
384
output  [7:0] tx_data_9;
385
output  [7:0] tx_data_10;
386
output  [7:0] tx_data_11;
387
output  [7:0] tx_data_12;
388
/* End: Tx data registers */
389
 
390
 
391
reg           tx_successful_q;
392
reg           overrun_q;
393
reg           overrun_status;
394
reg           transmission_complete;
395
reg           transmit_buffer_status_q;
396
reg           receive_buffer_status;
397
reg           info_empty_q;
398
reg           error_status_q;
399
reg           node_bus_off_q;
400
reg           node_error_passive_q;
401
reg           transmit_buffer_status;
402
reg           single_shot_transmission;
403 104 tadejm
reg           self_rx_request;
404 66 mohor
 
405
 
406
// Some interrupts exist in basic mode and in extended mode. Since they are in different registers they need to be multiplexed.
407
wire          data_overrun_irq_en;
408
wire          error_warning_irq_en;
409
wire          transmit_irq_en;
410
wire          receive_irq_en;
411
 
412
wire    [7:0] irq_reg;
413
 
414
wire we_mode                  = cs & we & (addr == 8'd0);
415
wire we_command               = cs & we & (addr == 8'd1);
416
wire we_bus_timing_0          = cs & we & (addr == 8'd6) & reset_mode;
417
wire we_bus_timing_1          = cs & we & (addr == 8'd7) & reset_mode;
418
wire we_clock_divider_low     = cs & we & (addr == 8'd31);
419
wire we_clock_divider_hi      = we_clock_divider_low & reset_mode;
420
 
421
wire read = cs & (~we);
422
wire read_irq_reg = read & (addr == 8'd3);
423
assign read_arbitration_lost_capture_reg = read & extended_mode & (addr == 8'd11);
424
assign read_error_code_capture_reg = read & extended_mode & (addr == 8'd12);
425
 
426
/* This section is for BASIC and EXTENDED mode */
427
wire we_acceptance_code_0       = cs & we &   reset_mode  & ((~extended_mode) & (addr == 8'd4)  | extended_mode & (addr == 8'd16));
428
wire we_acceptance_mask_0       = cs & we &   reset_mode  & ((~extended_mode) & (addr == 8'd5)  | extended_mode & (addr == 8'd20));
429
wire we_tx_data_0               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd10) | extended_mode & (addr == 8'd16)) & transmit_buffer_status;
430
wire we_tx_data_1               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd11) | extended_mode & (addr == 8'd17)) & transmit_buffer_status;
431
wire we_tx_data_2               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd12) | extended_mode & (addr == 8'd18)) & transmit_buffer_status;
432
wire we_tx_data_3               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd13) | extended_mode & (addr == 8'd19)) & transmit_buffer_status;
433
wire we_tx_data_4               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd14) | extended_mode & (addr == 8'd20)) & transmit_buffer_status;
434
wire we_tx_data_5               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd15) | extended_mode & (addr == 8'd21)) & transmit_buffer_status;
435
wire we_tx_data_6               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd16) | extended_mode & (addr == 8'd22)) & transmit_buffer_status;
436
wire we_tx_data_7               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd17) | extended_mode & (addr == 8'd23)) & transmit_buffer_status;
437
wire we_tx_data_8               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd18) | extended_mode & (addr == 8'd24)) & transmit_buffer_status;
438
wire we_tx_data_9               = cs & we & (~reset_mode) & ((~extended_mode) & (addr == 8'd19) | extended_mode & (addr == 8'd25)) & transmit_buffer_status;
439
wire we_tx_data_10              = cs & we & (~reset_mode) & (                                     extended_mode & (addr == 8'd26)) & transmit_buffer_status;
440
wire we_tx_data_11              = cs & we & (~reset_mode) & (                                     extended_mode & (addr == 8'd27)) & transmit_buffer_status;
441
wire we_tx_data_12              = cs & we & (~reset_mode) & (                                     extended_mode & (addr == 8'd28)) & transmit_buffer_status;
442
/* End: This section is for BASIC and EXTENDED mode */
443
 
444
 
445
/* This section is for EXTENDED mode */
446
wire   we_interrupt_enable      = cs & we & (addr == 8'd4)  & extended_mode;
447
wire   we_error_warning_limit   = cs & we & (addr == 8'd13) & reset_mode & extended_mode;
448
assign we_rx_err_cnt            = cs & we & (addr == 8'd14) & reset_mode & extended_mode;
449
assign we_tx_err_cnt            = cs & we & (addr == 8'd15) & reset_mode & extended_mode;
450
wire   we_acceptance_code_1     = cs & we & (addr == 8'd17) & reset_mode & extended_mode;
451
wire   we_acceptance_code_2     = cs & we & (addr == 8'd18) & reset_mode & extended_mode;
452
wire   we_acceptance_code_3     = cs & we & (addr == 8'd19) & reset_mode & extended_mode;
453
wire   we_acceptance_mask_1     = cs & we & (addr == 8'd21) & reset_mode & extended_mode;
454
wire   we_acceptance_mask_2     = cs & we & (addr == 8'd22) & reset_mode & extended_mode;
455
wire   we_acceptance_mask_3     = cs & we & (addr == 8'd23) & reset_mode & extended_mode;
456
/* End: This section is for EXTENDED mode */
457
 
458
 
459
 
460
always @ (posedge clk)
461
begin
462
  tx_successful_q           <=#Tp tx_successful;
463
  overrun_q                 <=#Tp overrun;
464
  transmit_buffer_status_q  <=#Tp transmit_buffer_status;
465
  info_empty_q              <=#Tp info_empty;
466
  error_status_q            <=#Tp error_status;
467
  node_bus_off_q            <=#Tp node_bus_off;
468
  node_error_passive_q      <=#Tp node_error_passive;
469
end
470
 
471
 
472
 
473
/* Mode register */
474
wire   [0:0] mode;
475
wire   [4:1] mode_basic;
476
wire   [3:1] mode_ext;
477
wire         receive_irq_en_basic;
478
wire         transmit_irq_en_basic;
479
wire         error_irq_en_basic;
480
wire         overrun_irq_en_basic;
481
 
482
can_register_asyn_syn #(1, 1'h1) MODE_REG0
483
( .data_in(data_in[0]),
484
  .data_out(mode[0]),
485
  .we(we_mode),
486
  .clk(clk),
487
  .rst(rst),
488
  .rst_sync(set_reset_mode)
489
);
490
 
491
can_register_asyn #(4, 0) MODE_REG_BASIC
492
( .data_in(data_in[4:1]),
493
  .data_out(mode_basic[4:1]),
494
  .we(we_mode),
495
  .clk(clk),
496
  .rst(rst)
497
);
498
 
499
can_register_asyn #(3, 0) MODE_REG_EXT
500
( .data_in(data_in[3:1]),
501
  .data_out(mode_ext[3:1]),
502
  .we(we_mode & reset_mode),
503
  .clk(clk),
504
  .rst(rst)
505
);
506
 
507
assign reset_mode             = mode[0];
508 69 mohor
assign listen_only_mode       = extended_mode & mode_ext[1];
509
assign self_test_mode         = extended_mode & mode_ext[2];
510
assign acceptance_filter_mode = extended_mode & mode_ext[3];
511 66 mohor
 
512
assign receive_irq_en_basic  = mode_basic[1];
513
assign transmit_irq_en_basic = mode_basic[2];
514
assign error_irq_en_basic    = mode_basic[3];
515
assign overrun_irq_en_basic  = mode_basic[4];
516
/* End Mode register */
517
 
518
 
519
/* Command register */
520
wire   [4:0] command;
521
can_register_asyn_syn #(1, 1'h0) COMMAND_REG0
522
( .data_in(data_in[0]),
523
  .data_out(command[0]),
524
  .we(we_command),
525
  .clk(clk),
526
  .rst(rst),
527 104 tadejm
  .rst_sync(command[0] & sample_point)
528 66 mohor
);
529
 
530
can_register_asyn_syn #(1, 1'h0) COMMAND_REG1
531
( .data_in(data_in[1]),
532
  .data_out(command[1]),
533
  .we(we_command),
534
  .clk(clk),
535
  .rst(rst),
536 104 tadejm
  .rst_sync(sample_point & (tx_request | (abort_tx & ~transmitting)))
537 66 mohor
);
538
 
539
can_register_asyn_syn #(2, 2'h0) COMMAND_REG
540
( .data_in(data_in[3:2]),
541
  .data_out(command[3:2]),
542
  .we(we_command),
543
  .clk(clk),
544
  .rst(rst),
545
  .rst_sync(|command[3:2])
546
);
547
 
548
can_register_asyn_syn #(1, 1'h0) COMMAND_REG4
549
( .data_in(data_in[4]),
550
  .data_out(command[4]),
551
  .we(we_command),
552
  .clk(clk),
553
  .rst(rst),
554 104 tadejm
  .rst_sync(command[4] & sample_point)
555 66 mohor
);
556
 
557 104 tadejm
 
558
always @ (posedge clk or posedge rst)
559
begin
560
  if (rst)
561
    self_rx_request <= 1'b0;
562
  else if (command[4] & (~command[0]))
563
    self_rx_request <=#Tp 1'b1;
564
  else if ((~tx_state) & tx_state_q)
565
    self_rx_request <=#Tp 1'b0;
566
end
567
 
568
 
569 66 mohor
assign clear_data_overrun = command[3];
570
assign release_buffer = command[2];
571
assign tx_request = command[0] | command[4];
572 104 tadejm
assign abort_tx = command[1] & (~tx_request);
573 66 mohor
 
574
 
575
always @ (posedge clk or posedge rst)
576
begin
577
  if (rst)
578
    single_shot_transmission <= 1'b0;
579 104 tadejm
  else if (tx_request & command[1] & sample_point)
580 66 mohor
    single_shot_transmission <=#Tp 1'b1;
581 104 tadejm
  else if ((~tx_state) & tx_state_q)
582 66 mohor
    single_shot_transmission <=#Tp 1'b0;
583
end
584
 
585
 
586
 
587
/* End Command register */
588
 
589
 
590
/* Status register */
591
 
592
wire   [7:0] status;
593
 
594
assign status[7] = node_bus_off;
595
assign status[6] = error_status;
596
assign status[5] = transmit_status;
597
assign status[4] = receive_status;
598
assign status[3] = transmission_complete;
599
assign status[2] = transmit_buffer_status;
600
assign status[1] = overrun_status;
601
assign status[0] = receive_buffer_status;
602
 
603
 
604
 
605
always @ (posedge clk or posedge rst)
606
begin
607
  if (rst)
608
    transmission_complete <= 1'b1;
609
  else if (tx_successful & (~tx_successful_q) | abort_tx)
610
    transmission_complete <=#Tp 1'b1;
611
  else if (tx_request)
612
    transmission_complete <=#Tp 1'b0;
613
end
614
 
615
 
616
always @ (posedge clk or posedge rst)
617
begin
618
  if (rst)
619
    transmit_buffer_status <= 1'b1;
620
  else if (tx_request)
621
    transmit_buffer_status <=#Tp 1'b0;
622
  else if (~need_to_tx)
623
    transmit_buffer_status <=#Tp 1'b1;
624
end
625
 
626
 
627
always @ (posedge clk or posedge rst)
628
begin
629
  if (rst)
630
    overrun_status <= 1'b0;
631
  else if (overrun & (~overrun_q))
632
    overrun_status <=#Tp 1'b1;
633
  else if (clear_data_overrun)
634
    overrun_status <=#Tp 1'b0;
635
end
636
 
637
 
638
always @ (posedge clk or posedge rst)
639
begin
640
  if (rst)
641
    receive_buffer_status <= 1'b0;
642
  else if (release_buffer)
643
    receive_buffer_status <=#Tp 1'b0;
644
  else if (~info_empty)
645
    receive_buffer_status <=#Tp 1'b1;
646
end
647
 
648
/* End Status register */
649
 
650
 
651
/* Interrupt Enable register (extended mode) */
652
wire   [7:0] irq_en_ext;
653
wire         bus_error_irq_en;
654
wire         arbitration_lost_irq_en;
655
wire         error_passive_irq_en;
656
wire         data_overrun_irq_en_ext;
657
wire         error_warning_irq_en_ext;
658
wire         transmit_irq_en_ext;
659
wire         receive_irq_en_ext;
660
 
661
can_register #(8) IRQ_EN_REG
662
( .data_in(data_in),
663
  .data_out(irq_en_ext),
664
  .we(we_interrupt_enable),
665
  .clk(clk)
666
);
667
 
668
 
669
assign bus_error_irq_en             = irq_en_ext[7];
670
assign arbitration_lost_irq_en      = irq_en_ext[6];
671
assign error_passive_irq_en         = irq_en_ext[5];
672
assign data_overrun_irq_en_ext      = irq_en_ext[3];
673
assign error_warning_irq_en_ext     = irq_en_ext[2];
674
assign transmit_irq_en_ext          = irq_en_ext[1];
675
assign receive_irq_en_ext           = irq_en_ext[0];
676
/* End Bus Timing 0 register */
677
 
678
 
679
/* Bus Timing 0 register */
680
wire   [7:0] bus_timing_0;
681
can_register #(8) BUS_TIMING_0_REG
682
( .data_in(data_in),
683
  .data_out(bus_timing_0),
684
  .we(we_bus_timing_0),
685
  .clk(clk)
686
);
687
 
688
assign baud_r_presc = bus_timing_0[5:0];
689
assign sync_jump_width = bus_timing_0[7:6];
690
/* End Bus Timing 0 register */
691
 
692
 
693
/* Bus Timing 1 register */
694
wire   [7:0] bus_timing_1;
695
can_register #(8) BUS_TIMING_1_REG
696
( .data_in(data_in),
697
  .data_out(bus_timing_1),
698
  .we(we_bus_timing_1),
699
  .clk(clk)
700
);
701
 
702
assign time_segment1 = bus_timing_1[3:0];
703
assign time_segment2 = bus_timing_1[6:4];
704
assign triple_sampling = bus_timing_1[7];
705
/* End Bus Timing 1 register */
706
 
707
 
708
/* Error Warning Limit register */
709
can_register_asyn #(8, 96) ERROR_WARNING_REG
710
( .data_in(data_in),
711
  .data_out(error_warning_limit),
712
  .we(we_error_warning_limit),
713
  .clk(clk),
714
  .rst(rst)
715
);
716
/* End Error Warning Limit register */
717
 
718
 
719
 
720
/* Clock Divider register */
721
wire   [7:0] clock_divider;
722
wire         clock_off;
723
wire   [2:0] cd;
724
reg    [2:0] clkout_div;
725
reg    [2:0] clkout_cnt;
726
reg          clkout_tmp;
727
//reg          clkout;
728
 
729 92 mohor
can_register_asyn #(1, 0) CLOCK_DIVIDER_REG_7
730 66 mohor
( .data_in(data_in[7]),
731
  .data_out(clock_divider[7]),
732
  .we(we_clock_divider_hi),
733 92 mohor
  .clk(clk),
734
  .rst(rst)
735 66 mohor
);
736
 
737
assign clock_divider[6:4] = 3'h0;
738
 
739 92 mohor
can_register_asyn #(1, 0) CLOCK_DIVIDER_REG_3
740 66 mohor
( .data_in(data_in[3]),
741
  .data_out(clock_divider[3]),
742
  .we(we_clock_divider_hi),
743 92 mohor
  .clk(clk),
744
  .rst(rst)
745 66 mohor
);
746
 
747 92 mohor
can_register_asyn #(3, 0) CLOCK_DIVIDER_REG_LOW
748 66 mohor
( .data_in(data_in[2:0]),
749
  .data_out(clock_divider[2:0]),
750
  .we(we_clock_divider_low),
751 92 mohor
  .clk(clk),
752
  .rst(rst)
753 66 mohor
);
754
 
755
assign extended_mode = clock_divider[7];
756
assign clock_off     = clock_divider[3];
757
assign cd[2:0]       = clock_divider[2:0];
758
 
759
 
760
 
761
always @ (cd)
762
begin
763 93 mohor
  case (cd)                       /* synthesis full_case parallel_case */
764 66 mohor
    3'b000 : clkout_div <= 0;
765
    3'b001 : clkout_div <= 1;
766
    3'b010 : clkout_div <= 2;
767
    3'b011 : clkout_div <= 3;
768
    3'b100 : clkout_div <= 4;
769
    3'b101 : clkout_div <= 5;
770
    3'b110 : clkout_div <= 6;
771
    3'b111 : clkout_div <= 0;
772
  endcase
773
end
774
 
775
 
776
 
777
always @ (posedge clk or posedge rst)
778
begin
779
  if (rst)
780
    clkout_cnt <= 3'h0;
781
  else if (clkout_cnt == clkout_div)
782
    clkout_cnt <=#Tp 3'h0;
783
  else
784
    clkout_cnt <= clkout_cnt + 1'b1;
785
end
786
 
787
 
788
 
789
always @ (posedge clk or posedge rst)
790
begin
791
  if (rst)
792
    clkout_tmp <= 1'b0;
793
  else if (clkout_cnt == clkout_div)
794
    clkout_tmp <=#Tp ~clkout_tmp;
795
end
796
 
797
 
798
/*
799
//always @ (cd or clk or clkout_tmp or clock_off)
800
always @ (cd or clkout_tmp or clock_off)
801
begin
802
  if (clock_off)
803
    clkout <=#Tp 1'b1;
804
//  else if (&cd)
805
//    clkout <=#Tp clk;
806
  else
807
    clkout <=#Tp clkout_tmp;
808
end
809
*/
810
assign clkout = clock_off ? 1'b1 : ((&cd)? clk : clkout_tmp);
811
 
812
 
813
 
814
/* End Clock Divider register */
815
 
816
 
817
 
818
 
819
/* This section is for BASIC and EXTENDED mode */
820
 
821
/* Acceptance code register */
822
can_register #(8) ACCEPTANCE_CODE_REG0
823
( .data_in(data_in),
824
  .data_out(acceptance_code_0),
825
  .we(we_acceptance_code_0),
826
  .clk(clk)
827
);
828
/* End: Acceptance code register */
829
 
830
 
831
/* Acceptance mask register */
832
can_register #(8) ACCEPTANCE_MASK_REG0
833
( .data_in(data_in),
834
  .data_out(acceptance_mask_0),
835
  .we(we_acceptance_mask_0),
836
  .clk(clk)
837
);
838
/* End: Acceptance mask register */
839
/* End: This section is for BASIC and EXTENDED mode */
840
 
841
 
842
/* Tx data 0 register. */
843
can_register #(8) TX_DATA_REG0
844
( .data_in(data_in),
845
  .data_out(tx_data_0),
846
  .we(we_tx_data_0),
847
  .clk(clk)
848
);
849
/* End: Tx data 0 register. */
850
 
851
 
852
/* Tx data 1 register. */
853
can_register #(8) TX_DATA_REG1
854
( .data_in(data_in),
855
  .data_out(tx_data_1),
856
  .we(we_tx_data_1),
857
  .clk(clk)
858
);
859
/* End: Tx data 1 register. */
860
 
861
 
862
/* Tx data 2 register. */
863
can_register #(8) TX_DATA_REG2
864
( .data_in(data_in),
865
  .data_out(tx_data_2),
866
  .we(we_tx_data_2),
867
  .clk(clk)
868
);
869
/* End: Tx data 2 register. */
870
 
871
 
872
/* Tx data 3 register. */
873
can_register #(8) TX_DATA_REG3
874
( .data_in(data_in),
875
  .data_out(tx_data_3),
876
  .we(we_tx_data_3),
877
  .clk(clk)
878
);
879
/* End: Tx data 3 register. */
880
 
881
 
882
/* Tx data 4 register. */
883
can_register #(8) TX_DATA_REG4
884
( .data_in(data_in),
885
  .data_out(tx_data_4),
886
  .we(we_tx_data_4),
887
  .clk(clk)
888
);
889
/* End: Tx data 4 register. */
890
 
891
 
892
/* Tx data 5 register. */
893
can_register #(8) TX_DATA_REG5
894
( .data_in(data_in),
895
  .data_out(tx_data_5),
896
  .we(we_tx_data_5),
897
  .clk(clk)
898
);
899
/* End: Tx data 5 register. */
900
 
901
 
902
/* Tx data 6 register. */
903
can_register #(8) TX_DATA_REG6
904
( .data_in(data_in),
905
  .data_out(tx_data_6),
906
  .we(we_tx_data_6),
907
  .clk(clk)
908
);
909
/* End: Tx data 6 register. */
910
 
911
 
912
/* Tx data 7 register. */
913
can_register #(8) TX_DATA_REG7
914
( .data_in(data_in),
915
  .data_out(tx_data_7),
916
  .we(we_tx_data_7),
917
  .clk(clk)
918
);
919
/* End: Tx data 7 register. */
920
 
921
 
922
/* Tx data 8 register. */
923
can_register #(8) TX_DATA_REG8
924
( .data_in(data_in),
925
  .data_out(tx_data_8),
926
  .we(we_tx_data_8),
927
  .clk(clk)
928
);
929
/* End: Tx data 8 register. */
930
 
931
 
932
/* Tx data 9 register. */
933
can_register #(8) TX_DATA_REG9
934
( .data_in(data_in),
935
  .data_out(tx_data_9),
936
  .we(we_tx_data_9),
937
  .clk(clk)
938
);
939
/* End: Tx data 9 register. */
940
 
941
 
942
/* Tx data 10 register. */
943
can_register #(8) TX_DATA_REG10
944
( .data_in(data_in),
945
  .data_out(tx_data_10),
946
  .we(we_tx_data_10),
947
  .clk(clk)
948
);
949
/* End: Tx data 10 register. */
950
 
951
 
952
/* Tx data 11 register. */
953
can_register #(8) TX_DATA_REG11
954
( .data_in(data_in),
955
  .data_out(tx_data_11),
956
  .we(we_tx_data_11),
957
  .clk(clk)
958
);
959
/* End: Tx data 11 register. */
960
 
961
 
962
/* Tx data 12 register. */
963
can_register #(8) TX_DATA_REG12
964
( .data_in(data_in),
965
  .data_out(tx_data_12),
966
  .we(we_tx_data_12),
967
  .clk(clk)
968
);
969
/* End: Tx data 12 register. */
970
 
971
 
972
 
973
 
974
 
975
/* This section is for EXTENDED mode */
976
 
977
/* Acceptance code register 1 */
978
can_register #(8) ACCEPTANCE_CODE_REG1
979
( .data_in(data_in),
980
  .data_out(acceptance_code_1),
981
  .we(we_acceptance_code_1),
982
  .clk(clk)
983
);
984
/* End: Acceptance code register */
985
 
986
 
987
/* Acceptance code register 2 */
988
can_register #(8) ACCEPTANCE_CODE_REG2
989
( .data_in(data_in),
990
  .data_out(acceptance_code_2),
991
  .we(we_acceptance_code_2),
992
  .clk(clk)
993
);
994
/* End: Acceptance code register */
995
 
996
 
997
/* Acceptance code register 3 */
998
can_register #(8) ACCEPTANCE_CODE_REG3
999
( .data_in(data_in),
1000
  .data_out(acceptance_code_3),
1001
  .we(we_acceptance_code_3),
1002
  .clk(clk)
1003
);
1004
/* End: Acceptance code register */
1005
 
1006
 
1007
/* Acceptance mask register 1 */
1008
can_register #(8) ACCEPTANCE_MASK_REG1
1009
( .data_in(data_in),
1010
  .data_out(acceptance_mask_1),
1011
  .we(we_acceptance_mask_1),
1012
  .clk(clk)
1013
);
1014
/* End: Acceptance code register */
1015
 
1016
 
1017
/* Acceptance mask register 2 */
1018
can_register #(8) ACCEPTANCE_MASK_REG2
1019
( .data_in(data_in),
1020
  .data_out(acceptance_mask_2),
1021
  .we(we_acceptance_mask_2),
1022
  .clk(clk)
1023
);
1024
/* End: Acceptance code register */
1025
 
1026
 
1027
/* Acceptance mask register 3 */
1028
can_register #(8) ACCEPTANCE_MASK_REG3
1029
( .data_in(data_in),
1030
  .data_out(acceptance_mask_3),
1031
  .we(we_acceptance_mask_3),
1032
  .clk(clk)
1033
);
1034
/* End: Acceptance code register */
1035
 
1036
 
1037
/* End: This section is for EXTENDED mode */
1038
 
1039
 
1040
 
1041
 
1042
// Reading data from registers
1043
always @ ( addr or read or extended_mode or mode or bus_timing_0 or bus_timing_1 or clock_divider or
1044
           acceptance_code_0 or acceptance_code_1 or acceptance_code_2 or acceptance_code_3 or
1045
           acceptance_mask_0 or acceptance_mask_1 or acceptance_mask_2 or acceptance_mask_3 or
1046
           reset_mode or tx_data_0 or tx_data_1 or tx_data_2 or tx_data_3 or tx_data_4 or
1047
           tx_data_5 or tx_data_6 or tx_data_7 or tx_data_8 or tx_data_9 or status or
1048
           error_warning_limit or rx_err_cnt or tx_err_cnt or irq_en_ext or irq_reg or mode_ext or
1049
           arbitration_lost_capture or rx_message_counter or mode_basic or error_capture_code
1050
         )
1051
begin
1052
  if(read)  // read
1053
    begin
1054
      if (extended_mode)    // EXTENDED mode (Different register map depends on mode)
1055
        begin
1056 93 mohor
          case(addr)  /* synthesis full_case parallel_case */
1057 70 mohor
            8'd0  :  data_out <= {4'b0000, mode_ext[3:1], mode[0]};
1058
            8'd1  :  data_out <= 8'h0;
1059
            8'd2  :  data_out <= status;
1060
            8'd3  :  data_out <= irq_reg;
1061
            8'd4  :  data_out <= irq_en_ext;
1062
            8'd6  :  data_out <= bus_timing_0;
1063
            8'd7  :  data_out <= bus_timing_1;
1064
            8'd11 :  data_out <= {3'h0, arbitration_lost_capture[4:0]};
1065
            8'd12 :  data_out <= error_capture_code;
1066
            8'd13 :  data_out <= error_warning_limit;
1067
            8'd14 :  data_out <= rx_err_cnt;
1068
            8'd15 :  data_out <= tx_err_cnt;
1069
            8'd16 :  data_out <= acceptance_code_0;
1070
            8'd17 :  data_out <= acceptance_code_1;
1071
            8'd18 :  data_out <= acceptance_code_2;
1072
            8'd19 :  data_out <= acceptance_code_3;
1073
            8'd20 :  data_out <= acceptance_mask_0;
1074
            8'd21 :  data_out <= acceptance_mask_1;
1075
            8'd22 :  data_out <= acceptance_mask_2;
1076
            8'd23 :  data_out <= acceptance_mask_3;
1077
            8'd24 :  data_out <= 8'h0;
1078
            8'd25 :  data_out <= 8'h0;
1079
            8'd26 :  data_out <= 8'h0;
1080
            8'd27 :  data_out <= 8'h0;
1081
            8'd28 :  data_out <= 8'h0;
1082
            8'd29 :  data_out <= {1'b0, rx_message_counter};
1083
            8'd31 :  data_out <= clock_divider;
1084 66 mohor
          endcase
1085
        end
1086
      else                  // BASIC mode
1087
        begin
1088 93 mohor
          case(addr)  /* synthesis full_case parallel_case */
1089 70 mohor
            8'd0  :  data_out <= {3'b001, mode_basic[4:1], mode[0]};
1090
            8'd1  :  data_out <= 8'hff;
1091
            8'd2  :  data_out <= status;
1092
            8'd3  :  data_out <= {4'hf, irq_reg[3:0]};
1093
            8'd4  :  data_out <= reset_mode? acceptance_code_0 : 8'hff;
1094
            8'd5  :  data_out <= reset_mode? acceptance_mask_0 : 8'hff;
1095
            8'd6  :  data_out <= reset_mode? bus_timing_0 : 8'hff;
1096
            8'd7  :  data_out <= reset_mode? bus_timing_1 : 8'hff;
1097
            8'd10 :  data_out <= reset_mode? 8'hff : tx_data_0;
1098
            8'd11 :  data_out <= reset_mode? 8'hff : tx_data_1;
1099
            8'd12 :  data_out <= reset_mode? 8'hff : tx_data_2;
1100
            8'd13 :  data_out <= reset_mode? 8'hff : tx_data_3;
1101
            8'd14 :  data_out <= reset_mode? 8'hff : tx_data_4;
1102
            8'd15 :  data_out <= reset_mode? 8'hff : tx_data_5;
1103
            8'd16 :  data_out <= reset_mode? 8'hff : tx_data_6;
1104
            8'd17 :  data_out <= reset_mode? 8'hff : tx_data_7;
1105
            8'd18 :  data_out <= reset_mode? 8'hff : tx_data_8;
1106
            8'd19 :  data_out <= reset_mode? 8'hff : tx_data_9;
1107
            8'd31 :  data_out <= clock_divider;
1108 66 mohor
          endcase
1109
        end
1110
    end
1111
  else
1112 70 mohor
    data_out <= 8'h0;
1113 66 mohor
end
1114
 
1115
 
1116
// Some interrupts exist in basic mode and in extended mode. Since they are in different registers they need to be multiplexed.
1117
assign data_overrun_irq_en  = extended_mode ? data_overrun_irq_en_ext  : overrun_irq_en_basic;
1118
assign error_warning_irq_en = extended_mode ? error_warning_irq_en_ext : error_irq_en_basic;
1119
assign transmit_irq_en      = extended_mode ? transmit_irq_en_ext      : transmit_irq_en_basic;
1120
assign receive_irq_en       = extended_mode ? receive_irq_en_ext       : receive_irq_en_basic;
1121
 
1122
 
1123
reg data_overrun_irq;
1124
always @ (posedge clk or posedge rst)
1125
begin
1126
  if (rst)
1127
    data_overrun_irq <= 1'b0;
1128
  else if (overrun & (~overrun_q) & data_overrun_irq_en)
1129
    data_overrun_irq <=#Tp 1'b1;
1130
  else if (read_irq_reg)
1131
    data_overrun_irq <=#Tp 1'b0;
1132
end
1133
 
1134
 
1135
reg transmit_irq;
1136
always @ (posedge clk or posedge rst)
1137
begin
1138
  if (rst)
1139
    transmit_irq <= 1'b0;
1140
  else if (transmit_buffer_status & (~transmit_buffer_status_q) & transmit_irq_en)
1141
    transmit_irq <=#Tp 1'b1;
1142
  else if (read_irq_reg)
1143
    transmit_irq <=#Tp 1'b0;
1144
end
1145
 
1146
 
1147
reg receive_irq;
1148
always @ (posedge clk or posedge rst)
1149
begin
1150
  if (rst)
1151
    receive_irq <= 1'b0;
1152
  else if (release_buffer)
1153
    receive_irq <=#Tp 1'b0;
1154
  else if ((~info_empty) & (~receive_irq) & receive_irq_en)
1155
    receive_irq <=#Tp 1'b1;
1156
end
1157
 
1158
 
1159
reg error_irq;
1160
always @ (posedge clk or posedge rst)
1161
begin
1162
  if (rst)
1163
    error_irq <= 1'b0;
1164
  else if (((error_status ^ error_status_q) | (node_bus_off ^ node_bus_off_q)) & error_warning_irq_en)
1165
    error_irq <=#Tp 1'b1;
1166
  else if (read_irq_reg)
1167
    error_irq <=#Tp 1'b0;
1168
end
1169
 
1170
 
1171
reg bus_error_irq;
1172
always @ (posedge clk or posedge rst)
1173
begin
1174
  if (rst)
1175
    bus_error_irq <= 1'b0;
1176
  else if (set_bus_error_irq & bus_error_irq_en)
1177
    bus_error_irq <=#Tp 1'b1;
1178
  else if (read_irq_reg)
1179
    bus_error_irq <=#Tp 1'b0;
1180
end
1181
 
1182
 
1183
reg arbitration_lost_irq;
1184
always @ (posedge clk or posedge rst)
1185
begin
1186
  if (rst)
1187
    arbitration_lost_irq <= 1'b0;
1188
  else if (set_arbitration_lost_irq & arbitration_lost_irq_en)
1189
    arbitration_lost_irq <=#Tp 1'b1;
1190
  else if (read_irq_reg)
1191
    arbitration_lost_irq <=#Tp 1'b0;
1192
end
1193
 
1194
 
1195
 
1196
reg error_passive_irq;
1197
always @ (posedge clk or posedge rst)
1198
begin
1199
  if (rst)
1200
    error_passive_irq <= 1'b0;
1201
  else if ((node_error_passive & (~node_error_passive_q) | (~node_error_passive) & node_error_passive_q & node_error_active) & error_passive_irq_en)
1202
    error_passive_irq <=#Tp 1'b1;
1203
  else if (read_irq_reg)
1204
    error_passive_irq <=#Tp 1'b0;
1205
end
1206
 
1207
 
1208
 
1209
assign irq_reg = {bus_error_irq, arbitration_lost_irq, error_passive_irq, 1'b0, data_overrun_irq, error_irq, transmit_irq, receive_irq};
1210
 
1211
assign irq = data_overrun_irq | transmit_irq | receive_irq | error_irq | bus_error_irq | arbitration_lost_irq | error_passive_irq;
1212
 
1213
 
1214
 
1215
 
1216
 
1217
endmodule

powered by: WebSVN 2.1.0

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