source: rc_os_nios2/DE0_Nano_QSYS_DEMO/canc/hdl/can_top.v@ 128

Last change on this file since 128 was 128, checked in by ertl-honda, 9 years ago

追加.

File size: 25.2 KB
Line 
1//////////////////////////////////////////////////////////////////////
2//// ////
3//// can_top.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, 2004 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: can_top.v,v $
53// Revision 1.48 2004/10/25 11:44:47 igorm
54// Interrupt is always cleared for one clock after the irq register is read.
55// This fixes problems when CPU is using IRQs that are edge triggered.
56//
57// Revision 1.47 2004/02/08 14:53:54 mohor
58// Header changed. Address latched to posedge. bus_off_on signal added.
59//
60// Revision 1.46 2003/10/17 05:55:20 markom
61// mbist signals updated according to newest convention
62//
63// Revision 1.45 2003/09/30 00:55:13 mohor
64// Error counters fixed to be compatible with Bosch VHDL reference model.
65// Small synchronization changes.
66//
67// Revision 1.44 2003/09/25 18:55:49 mohor
68// Synchronization changed, error counters fixed.
69//
70// Revision 1.43 2003/08/20 09:57:39 mohor
71// Tristate signal tx_o is separated to tx_o and tx_oen_o. Both signals need
72// to be joined together on higher level.
73//
74// Revision 1.42 2003/07/16 15:11:28 mohor
75// Fixed according to the linter.
76//
77// Revision 1.41 2003/07/10 15:32:27 mohor
78// Unused signal removed.
79//
80// Revision 1.40 2003/07/10 01:59:04 tadejm
81// Synchronization fixed. In some strange cases it didn't work according to
82// the VHDL reference model.
83//
84// Revision 1.39 2003/07/07 11:21:37 mohor
85// Little fixes (to fix warnings).
86//
87// Revision 1.38 2003/07/03 09:32:20 mohor
88// Synchronization changed.
89//
90// Revision 1.37 2003/06/27 20:56:15 simons
91// Virtual silicon ram instances added.
92//
93// Revision 1.36 2003/06/17 14:30:30 mohor
94// "chip select" signal cs_can_i is used only when not using WISHBONE
95// interface.
96//
97// Revision 1.35 2003/06/16 13:57:58 mohor
98// tx_point generated one clk earlier. rx_i registered. Data corrected when
99// using extended mode.
100//
101// Revision 1.34 2003/06/13 15:02:24 mohor
102// Synchronization is also needed when transmitting a message.
103//
104// Revision 1.33 2003/06/11 14:21:35 mohor
105// When switching to tx, sync stage is overjumped.
106//
107// Revision 1.32 2003/06/09 11:32:36 mohor
108// Ports added for the CAN_BIST.
109//
110// Revision 1.31 2003/03/26 11:19:46 mohor
111// CAN interrupt is active low.
112//
113// Revision 1.30 2003/03/20 17:01:17 mohor
114// unix.
115//
116// Revision 1.28 2003/03/14 19:36:48 mohor
117// can_cs signal used for generation of the cs.
118//
119// Revision 1.27 2003/03/12 05:56:33 mohor
120// Bidirectional port_0_i changed to port_0_io.
121// input cs_can changed to cs_can_i.
122//
123// Revision 1.26 2003/03/12 04:39:40 mohor
124// rd_i and wr_i are active high signals. If 8051 is connected, these two signals
125// need to be negated one level higher.
126//
127// Revision 1.25 2003/03/12 04:17:36 mohor
128// 8051 interface added (besides WISHBONE interface). Selection is made in
129// can_defines.v file.
130//
131// Revision 1.24 2003/03/10 17:24:40 mohor
132// wire declaration added.
133//
134// Revision 1.23 2003/03/05 15:33:13 mohor
135// tx_o is now tristated signal. tx_oen and tx_o combined together.
136//
137// Revision 1.22 2003/03/05 15:01:56 mohor
138// Top level signal names changed.
139//
140// Revision 1.21 2003/03/01 22:53:33 mohor
141// Actel APA ram supported.
142//
143// Revision 1.20 2003/02/19 15:09:02 mohor
144// Incomplete sensitivity list fixed.
145//
146// Revision 1.19 2003/02/19 15:04:14 mohor
147// Typo fixed.
148//
149// Revision 1.18 2003/02/19 14:44:03 mohor
150// CAN core finished. Host interface added. Registers finished.
151// Synchronization to the wishbone finished.
152//
153// Revision 1.17 2003/02/18 00:10:15 mohor
154// Most of the registers added. Registers "arbitration lost capture", "error code
155// capture" + few more still need to be added.
156//
157// Revision 1.16 2003/02/14 20:17:01 mohor
158// Several registers added. Not finished, yet.
159//
160// Revision 1.15 2003/02/12 14:25:30 mohor
161// abort_tx added.
162//
163// Revision 1.14 2003/02/11 00:56:06 mohor
164// Wishbone interface added.
165//
166// Revision 1.13 2003/02/09 18:40:29 mohor
167// Overload fixed. Hard synchronization also enabled at the last bit of
168// interframe.
169//
170// Revision 1.12 2003/02/09 02:24:33 mohor
171// Bosch license warning added. Error counters finished. Overload frames
172// still need to be fixed.
173//
174// Revision 1.11 2003/02/04 14:34:52 mohor
175// *** empty log message ***
176//
177// Revision 1.10 2003/01/31 01:13:38 mohor
178// backup.
179//
180// Revision 1.9 2003/01/15 13:16:48 mohor
181// When a frame with "remote request" is received, no data is stored to
182// fifo, just the frame information (identifier, ...). Data length that
183// is stored is the received data length and not the actual data length
184// that is stored to fifo.
185//
186// Revision 1.8 2003/01/14 17:25:09 mohor
187// Addresses corrected to decimal values (previously hex).
188//
189// Revision 1.7 2003/01/10 17:51:34 mohor
190// Temporary version (backup).
191//
192// Revision 1.6 2003/01/09 21:54:45 mohor
193// rx fifo added. Not 100 % verified, yet.
194//
195// Revision 1.5 2003/01/08 02:10:56 mohor
196// Acceptance filter added.
197//
198// Revision 1.4 2002/12/28 04:13:23 mohor
199// Backup version.
200//
201// Revision 1.3 2002/12/27 00:12:52 mohor
202// Header changed, testbench improved to send a frame (crc still missing).
203//
204// Revision 1.2 2002/12/26 16:00:34 mohor
205// Testbench define file added. Clock divider register added.
206//
207// Revision 1.1.1.1 2002/12/20 16:39:21 mohor
208// Initial
209//
210//
211//
212
213// synopsys translate_off
214`include "timescale.v"
215// synopsys translate_on
216`include "can_defines.v"
217
218module can_top
219(
220 `ifdef CAN_WISHBONE_IF
221 wb_clk_i,
222 wb_rst_i,
223 wb_dat_i,
224 wb_dat_o,
225 wb_cyc_i,
226 wb_stb_i,
227 wb_we_i,
228 wb_adr_i,
229 wb_ack_o,
230 `else
231 `ifdef CAN_AVALON_IF
232 av_rst_i,
233 av_cs_i,
234 av_wr_i,
235 av_adr_i,
236 av_dat_i,
237 av_dat_o,
238 `else
239 rst_i,
240 ale_i,
241 rd_i,
242 wr_i,
243 port_0_io,
244 cs_can_i,
245 `endif
246 `endif
247 clk_i,
248 rx_i,
249 tx_o,
250 bus_off_on,
251 irq_on,
252 clkout_o
253
254 // Bist
255`ifdef CAN_BIST
256 ,
257 // debug chain signals
258 mbist_si_i, // bist scan serial in
259 mbist_so_o, // bist scan serial out
260 mbist_ctrl_i // bist chain shift control
261`endif
262);
263
264parameter Tp = 1;
265parameter TXMBOX_DEPTH = 1; /* 2(Min=4) - 4(Max=16) */
266parameter RXMBOX_DEPTH = 4; /* 2(Min=4) - 5(Max=32) */
267
268
269`ifdef CAN_WISHBONE_IF
270 input wb_clk_i;
271 input wb_rst_i;
272 input [31:0] wb_dat_i;
273 output [31:0] wb_dat_o;
274 input wb_cyc_i;
275 input wb_stb_i;
276 input wb_we_i;
277 input [7:0] wb_adr_i;
278 output wb_ack_o;
279
280 reg wb_ack_o;
281 reg cs_sync1;
282 reg cs_sync2;
283 reg cs_sync3;
284
285 reg cs_ack1;
286 reg cs_ack2;
287 reg cs_ack3;
288 reg cs_sync_rst1;
289 reg cs_sync_rst2;
290 wire cs_can_i;
291`else
292 `ifdef CAN_AVALON_IF
293 input av_rst_i;
294 input av_cs_i;
295 input av_wr_i;
296 input [31:0] av_dat_i;
297 output [31:0] av_dat_o;
298 input [7:0] av_adr_i;
299
300 wire av_cs_i;
301 `else
302 input rst_i;
303 input ale_i;
304 input rd_i;
305 input wr_i;
306 inout [31:0] port_0_io;
307 input cs_can_i;
308
309 reg [9:0] addr_latched;
310 reg wr_i_q;
311 reg rd_i_q;
312 `endif
313`endif
314
315input clk_i;
316input rx_i;
317output tx_o;
318output bus_off_on;
319output irq_on;
320output clkout_o;
321
322// Bist
323`ifdef CAN_BIST
324input mbist_si_i; // bist scan serial in
325output mbist_so_o; // bist scan serial out
326input [`CAN_MBIST_CTRL_WIDTH - 1:0] mbist_ctrl_i; // bist chain shift control
327`endif
328
329reg data_out_fifo_selected;
330
331
332wire [7:0] data_out_fifo;
333wire [31:0] data_out_regs;
334
335
336/* Mode register */
337wire reset_mode;
338wire listen_only_mode;
339wire acceptance_filter_mode;
340wire self_test_mode;
341
342/* Command register */
343wire release_buffer;
344wire tx_request;
345wire abort_tx;
346wire self_rx_request;
347wire single_shot_transmission;
348wire tx_state;
349wire tx_state_q;
350wire overload_request;
351wire overload_frame;
352
353
354/* Arbitration Lost Capture Register */
355wire read_arbitration_lost_capture_reg;
356
357/* Error Code Capture Register */
358wire read_error_code_capture_reg;
359wire [7:0] error_capture_code;
360
361/* Bus Timing 0 register */
362wire [5:0] baud_r_presc;
363wire [1:0] sync_jump_width;
364
365/* Bus Timing 1 register */
366wire [3:0] time_segment1;
367wire [2:0] time_segment2;
368wire triple_sampling;
369
370/* Error Warning Limit register */
371wire [7:0] error_warning_limit;
372
373/* Rx Error Counter register */
374wire we_rx_err_cnt;
375
376/* Tx Error Counter register */
377wire we_tx_err_cnt;
378
379/* Clock Divider register */
380wire extended_mode;
381
382/* This section is for BASIC and EXTENDED mode */
383/* Acceptance code register */
384wire [7:0] acceptance_code_0;
385
386/* Acceptance mask register */
387wire [7:0] acceptance_mask_0;
388/* End: This section is for BASIC and EXTENDED mode */
389
390
391/* This section is for EXTENDED mode */
392/* Acceptance code register */
393wire [7:0] acceptance_code_1;
394wire [7:0] acceptance_code_2;
395wire [7:0] acceptance_code_3;
396
397/* Acceptance mask register */
398wire [7:0] acceptance_mask_1;
399wire [7:0] acceptance_mask_2;
400wire [7:0] acceptance_mask_3;
401/* End: This section is for EXTENDED mode */
402
403/* Tx data registers. Holding identifier (basic mode), tx frame information (extended mode) and data */
404wire [7:0] tx_data_0;
405wire [7:0] tx_data_1;
406wire [7:0] tx_data_2;
407wire [7:0] tx_data_3;
408wire [7:0] tx_data_4;
409wire [7:0] tx_data_5;
410wire [7:0] tx_data_6;
411wire [7:0] tx_data_7;
412wire [7:0] tx_data_8;
413wire [7:0] tx_data_9;
414wire [7:0] tx_data_10;
415wire [7:0] tx_data_11;
416wire [7:0] tx_data_12;
417/* End: Tx data registers */
418wire [127:0] rx_dt;
419wire rx_we;
420
421wire cs;
422
423/* Output signals from can_btl module */
424wire sample_point;
425wire sampled_bit;
426wire sampled_bit_q;
427wire tx_point;
428wire hard_sync;
429
430/* output from can_bsp module */
431wire rx_idle;
432wire transmitting;
433wire transmitter;
434wire go_rx_inter;
435wire not_first_bit_of_inter;
436wire set_reset_mode;
437wire node_bus_off;
438wire error_status;
439wire [7:0] rx_err_cnt;
440wire [7:0] tx_err_cnt;
441wire rx_err_cnt_dummy; // The MSB is not displayed. It is just used for easier calculation (no counter overflow).
442wire tx_err_cnt_dummy; // The MSB is not displayed. It is just used for easier calculation (no counter overflow).
443wire transmit_status;
444wire receive_status;
445wire tx_successful;
446wire need_to_tx;
447wire overrun;
448wire info_empty;
449wire set_bus_error_irq;
450wire set_arbitration_lost_irq;
451wire [4:0] arbitration_lost_capture;
452wire node_error_passive;
453wire node_error_active;
454wire [6:0] rx_message_counter;
455wire tx_next;
456
457wire go_overload_frame;
458wire go_error_frame;
459wire go_tx;
460wire send_ack;
461
462wire rst;
463wire we;
464wire [9:0] addr;
465wire [31:0] data_in;
466wire [31:0] data_out;
467reg rx_sync_tmp;
468reg rx_sync;
469
470/* Connecting can_registers module */
471//can_registers i_can_registers
472can_registers #(.TXMBOX_DEPTH(TXMBOX_DEPTH), .RXMBOX_DEPTH(RXMBOX_DEPTH)) i_can_registers
473
474(
475 .clk(clk_i),
476 .rst(rst),
477 .cs(cs),
478 .we(we),
479 .addr(addr),
480 .data_in(data_in),
481 .data_out(data_out),
482 .irq_n(irq_on),
483
484 .sample_point(sample_point),
485 .transmitting(transmitting),
486 .set_reset_mode(set_reset_mode),
487 .node_bus_off(node_bus_off),
488 .error_status(error_status),
489 .rx_err_cnt(rx_err_cnt),
490 .tx_err_cnt(tx_err_cnt),
491 .transmit_status(transmit_status),
492 .receive_status(receive_status),
493 .tx_successful(tx_successful),
494 .need_to_tx(need_to_tx),
495 .overrun(overrun),
496 .info_empty(info_empty),
497 .set_bus_error_irq(set_bus_error_irq),
498 .set_arbitration_lost_irq(set_arbitration_lost_irq),
499 .arbitration_lost_capture(arbitration_lost_capture),
500 .node_error_passive(node_error_passive),
501 .node_error_active(node_error_active),
502 .rx_message_counter(rx_message_counter),
503
504
505 /* Mode register */
506 .reset_mode(reset_mode),
507 .listen_only_mode(listen_only_mode),
508 .acceptance_filter_mode(acceptance_filter_mode),
509 .self_test_mode(self_test_mode),
510
511 /* Command register */
512 .clear_data_overrun(),
513 .release_buffer(release_buffer),
514 .abort_tx(abort_tx),
515 .tx_request(tx_request),
516 .self_rx_request(self_rx_request),
517 .single_shot_transmission(single_shot_transmission),
518 .tx_state(tx_state),
519 .tx_state_q(tx_state_q),
520 .overload_request(overload_request),
521 .overload_frame(overload_frame),
522
523 /* Arbitration Lost Capture Register */
524 .read_arbitration_lost_capture_reg(read_arbitration_lost_capture_reg),
525
526 /* Error Code Capture Register */
527 .read_error_code_capture_reg(read_error_code_capture_reg),
528 .error_capture_code(error_capture_code),
529
530 /* Bus Timing 0 register */
531 .baud_r_presc(baud_r_presc),
532 .sync_jump_width(sync_jump_width),
533
534 /* Bus Timing 1 register */
535 .time_segment1(time_segment1),
536 .time_segment2(time_segment2),
537 .triple_sampling(triple_sampling),
538
539 /* Error Warning Limit register */
540 .error_warning_limit(error_warning_limit),
541
542 /* Rx Error Counter register */
543 .we_rx_err_cnt(we_rx_err_cnt),
544
545 /* Tx Error Counter register */
546 .we_tx_err_cnt(we_tx_err_cnt),
547
548 /* Clock Divider register */
549 .extended_mode(extended_mode),
550 .clkout(clkout_o),
551
552 /* This section is for BASIC and EXTENDED mode */
553 /* Acceptance code register */
554 .acceptance_code_0(acceptance_code_0),
555
556 /* Acceptance mask register */
557 .acceptance_mask_0(acceptance_mask_0),
558 /* End: This section is for BASIC and EXTENDED mode */
559
560 /* This section is for EXTENDED mode */
561 /* Acceptance code register */
562 .acceptance_code_1(acceptance_code_1),
563 .acceptance_code_2(acceptance_code_2),
564 .acceptance_code_3(acceptance_code_3),
565
566 /* Acceptance mask register */
567 .acceptance_mask_1(acceptance_mask_1),
568 .acceptance_mask_2(acceptance_mask_2),
569 .acceptance_mask_3(acceptance_mask_3),
570 /* End: This section is for EXTENDED mode */
571
572 .rx_dt(rx_dt),
573 .rx_we(rx_we),
574 /* Tx data registers. Holding identifier (basic mode), tx frame information (extended mode) and data */
575 .tx_data_0(tx_data_0),
576 .tx_data_1(tx_data_1),
577 .tx_data_2(tx_data_2),
578 .tx_data_3(tx_data_3),
579 .tx_data_4(tx_data_4),
580 .tx_data_5(tx_data_5),
581 .tx_data_6(tx_data_6),
582 .tx_data_7(tx_data_7),
583 .tx_data_8(tx_data_8),
584 .tx_data_9(tx_data_9),
585 .tx_data_10(tx_data_10),
586 .tx_data_11(tx_data_11),
587 .tx_data_12(tx_data_12)
588 /* End: Tx data registers */
589);
590
591
592
593
594/* Connecting can_btl module */
595can_btl i_can_btl
596(
597 .clk(clk_i),
598 .rst(rst),
599 .rx(rx_sync),
600 .tx(tx_o),
601
602 /* Bus Timing 0 register */
603 .baud_r_presc(baud_r_presc),
604 .sync_jump_width(sync_jump_width),
605
606 /* Bus Timing 1 register */
607 .time_segment1(time_segment1),
608 .time_segment2(time_segment2),
609 .triple_sampling(triple_sampling),
610
611 /* Output signals from this module */
612 .sample_point(sample_point),
613 .sampled_bit(sampled_bit),
614 .sampled_bit_q(sampled_bit_q),
615 .tx_point(tx_point),
616 .hard_sync(hard_sync),
617
618
619 /* output from can_bsp module */
620 .rx_idle(rx_idle),
621 .rx_inter(rx_inter),
622 .transmitting(transmitting),
623 .transmitter(transmitter),
624 .go_rx_inter(go_rx_inter),
625 .tx_next(tx_next),
626
627 .go_overload_frame(go_overload_frame),
628 .go_error_frame(go_error_frame),
629 .go_tx(go_tx),
630 .send_ack(send_ack),
631 .node_error_passive(node_error_passive)
632
633
634
635);
636
637
638
639can_bsp i_can_bsp
640(
641 .clk(clk_i),
642 .rst(rst),
643
644 /* From btl module */
645 .sample_point(sample_point),
646 .sampled_bit(sampled_bit),
647 .sampled_bit_q(sampled_bit_q),
648 .tx_point(tx_point),
649 .hard_sync(hard_sync),
650
651 .addr(8'h0),
652 .data_in(data_in),
653 .data_out(data_out_fifo),
654 .fifo_selected(data_out_fifo_selected),
655
656 /* Mode register */
657 .reset_mode(reset_mode),
658 .listen_only_mode(listen_only_mode),
659 .acceptance_filter_mode(acceptance_filter_mode),
660 .self_test_mode(self_test_mode),
661
662 /* Command register */
663 .release_buffer(release_buffer),
664 .tx_request(tx_request),
665 .abort_tx(abort_tx),
666 .self_rx_request(self_rx_request),
667 .single_shot_transmission(single_shot_transmission),
668 .tx_state(tx_state),
669 .tx_state_q(tx_state_q),
670 .overload_request(overload_request),
671 .overload_frame(overload_frame),
672
673 /* Arbitration Lost Capture Register */
674 .read_arbitration_lost_capture_reg(read_arbitration_lost_capture_reg),
675
676 /* Error Code Capture Register */
677 .read_error_code_capture_reg(read_error_code_capture_reg),
678 .error_capture_code(error_capture_code),
679
680 /* Error Warning Limit register */
681 .error_warning_limit(error_warning_limit),
682
683 /* Rx Error Counter register */
684 .we_rx_err_cnt(we_rx_err_cnt),
685
686 /* Tx Error Counter register */
687 .we_tx_err_cnt(we_tx_err_cnt),
688
689 /* Clock Divider register */
690 .extended_mode(extended_mode),
691
692 /* output from can_bsp module */
693 .rx_idle(rx_idle),
694 .transmitting(transmitting),
695 .transmitter(transmitter),
696 .go_rx_inter(go_rx_inter),
697 .not_first_bit_of_inter(not_first_bit_of_inter),
698 .rx_inter(rx_inter),
699 .set_reset_mode(set_reset_mode),
700 .node_bus_off(node_bus_off),
701 .error_status(error_status),
702 .rx_err_cnt({rx_err_cnt_dummy, rx_err_cnt[7:0]}), // The MSB is not displayed. It is just used for easier calculation (no counter overflow).
703 .tx_err_cnt({tx_err_cnt_dummy, tx_err_cnt[7:0]}), // The MSB is not displayed. It is just used for easier calculation (no counter overflow).
704 .transmit_status(transmit_status),
705 .receive_status(receive_status),
706 .tx_successful(tx_successful),
707 .need_to_tx(need_to_tx),
708 .overrun(overrun),
709 .info_empty(info_empty),
710 .set_bus_error_irq(set_bus_error_irq),
711 .set_arbitration_lost_irq(set_arbitration_lost_irq),
712 .arbitration_lost_capture(arbitration_lost_capture),
713 .node_error_passive(node_error_passive),
714 .node_error_active(node_error_active),
715 .rx_message_counter(rx_message_counter),
716
717 /* This section is for BASIC and EXTENDED mode */
718 /* Acceptance code register */
719 .acceptance_code_0(acceptance_code_0),
720
721 /* Acceptance mask register */
722 .acceptance_mask_0(acceptance_mask_0),
723 /* End: This section is for BASIC and EXTENDED mode */
724
725 /* This section is for EXTENDED mode */
726 /* Acceptance code register */
727 .acceptance_code_1(acceptance_code_1),
728 .acceptance_code_2(acceptance_code_2),
729 .acceptance_code_3(acceptance_code_3),
730
731 /* Acceptance mask register */
732 .acceptance_mask_1(acceptance_mask_1),
733 .acceptance_mask_2(acceptance_mask_2),
734 .acceptance_mask_3(acceptance_mask_3),
735 /* End: This section is for EXTENDED mode */
736
737 /* Tx data registers. Holding identifier (basic mode), tx frame information (extended mode) and data */
738 .tx_data_0(tx_data_0),
739 .tx_data_1(tx_data_1),
740 .tx_data_2(tx_data_2),
741 .tx_data_3(tx_data_3),
742 .tx_data_4(tx_data_4),
743 .tx_data_5(tx_data_5),
744 .tx_data_6(tx_data_6),
745 .tx_data_7(tx_data_7),
746 .tx_data_8(tx_data_8),
747 .tx_data_9(tx_data_9),
748 .tx_data_10(tx_data_10),
749 .tx_data_11(tx_data_11),
750 .tx_data_12(tx_data_12),
751 /* End: Tx data registers */
752 .rx_dt(rx_dt),
753 .rx_we(rx_we),
754
755 /* Tx signal */
756 .tx(tx_o),
757 .tx_next(tx_next),
758 .bus_off_on(bus_off_on),
759
760 .go_overload_frame(go_overload_frame),
761 .go_error_frame(go_error_frame),
762 .go_tx(go_tx),
763 .send_ack(send_ack)
764
765
766`ifdef CAN_BIST
767 ,
768 /* BIST signals */
769 .mbist_si_i(mbist_si_i),
770 .mbist_so_o(mbist_so_o),
771 .mbist_ctrl_i(mbist_ctrl_i)
772`endif
773);
774
775assign extended_mode_o = extended_mode;
776
777// Multiplexing wb_dat_o from registers and rx fifo
778always @ (extended_mode or addr or reset_mode)
779begin
780 if (extended_mode & (~reset_mode) & ((addr >= 10'd16) && (addr <= 10'd28)) | (~extended_mode) & ((addr >= 10'd20) && (addr <= 10'd29)))
781 data_out_fifo_selected = 1'b1;
782 else
783 data_out_fifo_selected = 1'b0;
784end
785
786
787//always @ (posedge clk_i or posedge rst)
788//begin
789// if (rst)
790// begin
791// data_out <= 0;
792// end
793// else if (cs & (~we))
794// begin
795// if (data_out_fifo_selected)
796// data_out <=#Tp data_out_fifo;
797// else
798// data_out <=#Tp data_out_regs;
799// end
800//end
801
802
803
804always @ (posedge clk_i or posedge rst)
805begin
806 if (rst)
807 begin
808 rx_sync_tmp <= 1'b1;
809 rx_sync <= 1'b1;
810 end
811 else
812 begin
813 rx_sync_tmp <=#Tp rx_i;
814 rx_sync <=#Tp rx_sync_tmp;
815 end
816end
817
818
819
820`ifdef CAN_WISHBONE_IF
821
822 assign cs_can_i = 1'b1;
823
824 // Combining wb_cyc_i and wb_stb_i signals to cs signal. Than synchronizing to clk_i clock domain.
825 always @ (posedge clk_i or posedge rst)
826 begin
827 if (rst)
828 begin
829 cs_sync1 <= 1'b0;
830 cs_sync2 <= 1'b0;
831 cs_sync3 <= 1'b0;
832 cs_sync_rst1 <= 1'b0;
833 cs_sync_rst2 <= 1'b0;
834 end
835 else
836 begin
837 cs_sync1 <=#Tp wb_cyc_i & wb_stb_i & (~cs_sync_rst2) & cs_can_i;
838 cs_sync2 <=#Tp cs_sync1 & (~cs_sync_rst2);
839 cs_sync3 <=#Tp cs_sync2 & (~cs_sync_rst2);
840 cs_sync_rst1 <=#Tp cs_ack3;
841 cs_sync_rst2 <=#Tp cs_sync_rst1;
842 end
843 end
844
845
846 assign cs = cs_sync2 & (~cs_sync3);
847
848
849 always @ (posedge wb_clk_i)
850 begin
851 cs_ack1 <=#Tp cs_sync3;
852 cs_ack2 <=#Tp cs_ack1;
853 cs_ack3 <=#Tp cs_ack2;
854 end
855
856
857
858 // Generating acknowledge signal
859 always @ (posedge wb_clk_i)
860 begin
861 wb_ack_o <=#Tp (cs_ack2 & (~cs_ack3));
862 end
863
864
865 assign rst = wb_rst_i;
866 assign we = wb_we_i;
867 assign addr = wb_adr_i;
868 assign data_in = wb_dat_i;
869 assign wb_dat_o = data_out;
870
871
872`else
873 `ifdef CAN_AVALON_IF
874
875 assign rst = av_rst_i;
876 assign cs = av_cs_i;
877 assign we = av_wr_i;
878 assign addr = {av_adr_i,2'h0};
879 assign data_in = av_dat_i;
880 assign av_dat_o = data_out;
881
882 `else
883
884 // Latching address
885 always @ (posedge clk_i or posedge rst)
886 begin
887 if (rst)
888 addr_latched <= 10'h0;
889 else if (ale_i)
890 addr_latched <=#Tp port_0_io;
891 end
892
893
894 // Generating delayed wr_i and rd_i signals
895 always @ (posedge clk_i or posedge rst)
896 begin
897 if (rst)
898 begin
899 wr_i_q <= 1'b0;
900 rd_i_q <= 1'b0;
901 end
902 else
903 begin
904 wr_i_q <=#Tp wr_i;
905 rd_i_q <=#Tp rd_i;
906 end
907 end
908
909
910 assign cs = ((wr_i & (~wr_i_q)) | (rd_i & (~rd_i_q))) & cs_can_i;
911
912
913 assign rst = rst_i;
914 assign we = wr_i;
915 assign addr = addr_latched;
916 assign data_in = port_0_io;
917 assign port_0_io = (cs_can_i & rd_i)? data_out : {4{8'hz}};
918
919 `endif
920`endif
921
922
923endmodule
Note: See TracBrowser for help on using the repository browser.