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

Subversion Repositories can

[/] [can/] [tags/] [rel_11/] [rtl/] [verilog/] [can_registers.v] - Blame information for rev 93

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

powered by: WebSVN 2.1.0

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