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

Subversion Repositories can

[/] [can/] [tags/] [rel_6/] [rtl/] [verilog/] [can_registers.v] - Blame information for rev 163

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

powered by: WebSVN 2.1.0

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