source: XOpenSparcT1/trunk/OC-UART/uart_top.v @ 6

Revision 6, 11.3 KB checked in by pntsvt00, 14 years ago (diff)

versione iniziale opensparc

Line 
1//////////////////////////////////////////////////////////////////////
2////                                                              ////
3////  uart_top.v                                                  ////
4////                                                              ////
5////                                                              ////
6////  This file is part of the "UART 16550 compatible" project    ////
7////  http://www.opencores.org/cores/uart16550/                   ////
8////                                                              ////
9////  Documentation related to this project:                      ////
10////  - http://www.opencores.org/cores/uart16550/                 ////
11////                                                              ////
12////  Projects compatibility:                                     ////
13////  - WISHBONE                                                  ////
14////  RS232 Protocol                                              ////
15////  16550D uart (mostly supported)                              ////
16////                                                              ////
17////  Overview (main Features):                                   ////
18////  UART core top level.                                        ////
19////                                                              ////
20////  Known problems (limits):                                    ////
21////  Note that transmitter and receiver instances are inside     ////
22////  the uart_regs.v file.                                       ////
23////                                                              ////
24////  To Do:                                                      ////
25////  Nothing so far.                                             ////
26////                                                              ////
27////  Author(s):                                                  ////
28////      - gorban@opencores.org                                  ////
29////      - Jacob Gorban                                          ////
30////      - Igor Mohor (igorm@opencores.org)                      ////
31////                                                              ////
32////  Created:        2001/05/12                                  ////
33////  Last Updated:   2001/05/17                                  ////
34////                  (See log for the revision history)          ////
35////                                                              ////
36////                                                              ////
37//////////////////////////////////////////////////////////////////////
38////                                                              ////
39//// Copyright (C) 2000, 2001 Authors                             ////
40////                                                              ////
41//// This source file may be used and distributed without         ////
42//// restriction provided that this copyright statement is not    ////
43//// removed from the file and that any derivative work contains  ////
44//// the original copyright notice and the associated disclaimer. ////
45////                                                              ////
46//// This source file is free software; you can redistribute it   ////
47//// and/or modify it under the terms of the GNU Lesser General   ////
48//// Public License as published by the Free Software Foundation; ////
49//// either version 2.1 of the License, or (at your option) any   ////
50//// later version.                                               ////
51////                                                              ////
52//// This source is distributed in the hope that it will be       ////
53//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
54//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
55//// PURPOSE.  See the GNU Lesser General Public License for more ////
56//// details.                                                     ////
57////                                                              ////
58//// You should have received a copy of the GNU Lesser General    ////
59//// Public License along with this source; if not, download it   ////
60//// from http://www.opencores.org/lgpl.shtml                     ////
61////                                                              ////
62//////////////////////////////////////////////////////////////////////
63//
64// CVS Revision History
65//
66// $Log: not supported by cvs2svn $
67// Revision 1.18  2002/07/22 23:02:23  gorban
68// Bug Fixes:
69//  * Possible loss of sync and bad reception of stop bit on slow baud rates fixed.
70//   Problem reported by Kenny.Tung.
71//  * Bad (or lack of ) loopback handling fixed. Reported by Cherry Withers.
72//
73// Improvements:
74//  * Made FIFO's as general inferrable memory where possible.
75//  So on FPGA they should be inferred as RAM (Distributed RAM on Xilinx).
76//  This saves about 1/3 of the Slice count and reduces P&R and synthesis times.
77//
78//  * Added optional baudrate output (baud_o).
79//  This is identical to BAUDOUT* signal on 16550 chip.
80//  It outputs 16xbit_clock_rate - the divided clock.
81//  It's disabled by default. Define UART_HAS_BAUDRATE_OUTPUT to use.
82//
83// Revision 1.17  2001/12/19 08:40:03  mohor
84// Warnings fixed (unused signals removed).
85//
86// Revision 1.16  2001/12/06 14:51:04  gorban
87// Bug in LSR[0] is fixed.
88// All WISHBONE signals are now sampled, so another wait-state is introduced on all transfers.
89//
90// Revision 1.15  2001/12/03 21:44:29  gorban
91// Updated specification documentation.
92// Added full 32-bit data bus interface, now as default.
93// Address is 5-bit wide in 32-bit data bus mode.
94// Added wb_sel_i input to the core. It's used in the 32-bit mode.
95// Added debug interface with two 32-bit read-only registers in 32-bit mode.
96// Bits 5 and 6 of LSR are now only cleared on TX FIFO write.
97// My small test bench is modified to work with 32-bit mode.
98//
99// Revision 1.14  2001/11/07 17:51:52  gorban
100// Heavily rewritten interrupt and LSR subsystems.
101// Many bugs hopefully squashed.
102//
103// Revision 1.13  2001/10/20 09:58:40  gorban
104// Small synopsis fixes
105//
106// Revision 1.12  2001/08/25 15:46:19  gorban
107// Modified port names again
108//
109// Revision 1.11  2001/08/24 21:01:12  mohor
110// Things connected to parity changed.
111// Clock devider changed.
112//
113// Revision 1.10  2001/08/23 16:05:05  mohor
114// Stop bit bug fixed.
115// Parity bug fixed.
116// WISHBONE read cycle bug fixed,
117// OE indicator (Overrun Error) bug fixed.
118// PE indicator (Parity Error) bug fixed.
119// Register read bug fixed.
120//
121// Revision 1.4  2001/05/31 20:08:01  gorban
122// FIFO changes and other corrections.
123//
124// Revision 1.3  2001/05/21 19:12:02  gorban
125// Corrected some Linter messages.
126//
127// Revision 1.2  2001/05/17 18:34:18  gorban
128// First 'stable' release. Should be sythesizable now. Also added new header.
129//
130// Revision 1.0  2001-05-17 21:27:12+02  jacob
131// Initial revision
132//
133//
134// synopsys translate_off
135`include "timescale.v"
136// synopsys translate_on
137
138`include "uart_defines.v"
139
140module uart_top (
141        wb_clk_i, 
142       
143        // Wishbone signals
144        wb_rst_i, wb_adr_i, wb_dat_i, wb_dat_o, wb_we_i, wb_stb_i, wb_cyc_i, wb_ack_o, wb_sel_i,
145        int_o, // interrupt request
146
147        // UART signals
148        // serial input/output
149        stx_pad_o, srx_pad_i,
150
151        // modem signals
152        rts_pad_o, cts_pad_i, dtr_pad_o, dsr_pad_i, ri_pad_i, dcd_pad_i
153`ifdef UART_HAS_BAUDRATE_OUTPUT
154        , baud_o
155`endif
156        );
157
158parameter                                                        uart_data_width = `UART_DATA_WIDTH;
159parameter                                                        uart_addr_width = `UART_ADDR_WIDTH;
160
161input                                                            wb_clk_i;
162
163// WISHBONE interface
164input                                                            wb_rst_i;
165input [uart_addr_width-1:0]      wb_adr_i;
166input [uart_data_width-1:0]      wb_dat_i;
167output [uart_data_width-1:0]     wb_dat_o;
168input                                                            wb_we_i;
169input                                                            wb_stb_i;
170input                                                            wb_cyc_i;
171input [3:0]                                                      wb_sel_i;
172output                                                           wb_ack_o;
173output                                                           int_o;
174
175// UART signals
176input                                                            srx_pad_i;
177output                                                           stx_pad_o;
178output                                                           rts_pad_o;
179input                                                            cts_pad_i;
180output                                                           dtr_pad_o;
181input                                                            dsr_pad_i;
182input                                                            ri_pad_i;
183input                                                            dcd_pad_i;
184
185// optional baudrate output
186`ifdef UART_HAS_BAUDRATE_OUTPUT
187output  baud_o;
188`endif
189
190
191wire                                                                     stx_pad_o;
192wire                                                                     rts_pad_o;
193wire                                                                     dtr_pad_o;
194
195wire [uart_addr_width-1:0]       wb_adr_i;
196wire [uart_data_width-1:0]       wb_dat_i;
197wire [uart_data_width-1:0]       wb_dat_o;
198
199wire [7:0]                                                       wb_dat8_i; // 8-bit internal data input
200wire [7:0]                                                       wb_dat8_o; // 8-bit internal data output
201wire [31:0]                                              wb_dat32_o; // debug interface 32-bit output
202wire [3:0]                                                       wb_sel_i;  // WISHBONE select signal
203wire [uart_addr_width-1:0]       wb_adr_int;
204wire                                                                     we_o;  // Write enable for registers
205wire                                 re_o;      // Read enable for registers
206//
207// MODULE INSTANCES
208//
209
210`ifdef DATA_BUS_WIDTH_8
211`else
212// debug interface wires
213wire    [3:0] ier;
214wire    [3:0] iir;
215wire    [1:0] fcr;
216wire    [4:0] mcr;
217wire    [7:0] lcr;
218wire    [7:0] msr;
219wire    [7:0] lsr;
220wire    [`UART_FIFO_COUNTER_W-1:0] rf_count;
221wire    [`UART_FIFO_COUNTER_W-1:0] tf_count;
222wire    [2:0] tstate;
223wire    [3:0] rstate; 
224`endif
225
226`ifdef DATA_BUS_WIDTH_8
227////  WISHBONE interface module
228uart_wb         wb_interface(
229                .clk(           wb_clk_i                ),
230                .wb_rst_i(      wb_rst_i        ),
231        .wb_dat_i(wb_dat_i),
232        .wb_dat_o(wb_dat_o),
233        .wb_dat8_i(wb_dat8_i),
234        .wb_dat8_o(wb_dat8_o),
235         .wb_dat32_o(32'b0),                                                             
236         .wb_sel_i(4'b0),
237                .wb_we_i(       wb_we_i         ),
238                .wb_stb_i(      wb_stb_i        ),
239                .wb_cyc_i(      wb_cyc_i        ),
240                .wb_ack_o(      wb_ack_o        ),
241        .wb_adr_i(wb_adr_i),
242        .wb_adr_int(wb_adr_int),
243                .we_o(          we_o            ),
244                .re_o(re_o)
245                );
246`else
247uart_wb         wb_interface(
248                .clk(           wb_clk_i                ),
249                .wb_rst_i(      wb_rst_i        ),
250        .wb_dat_i(wb_dat_i),
251        .wb_dat_o(wb_dat_o),
252        .wb_dat8_i(wb_dat8_i),
253        .wb_dat8_o(wb_dat8_o),
254         .wb_sel_i(wb_sel_i),
255         .wb_dat32_o(wb_dat32_o),                                                               
256                .wb_we_i(       wb_we_i         ),
257                .wb_stb_i(      wb_stb_i        ),
258                .wb_cyc_i(      wb_cyc_i        ),
259                .wb_ack_o(      wb_ack_o        ),
260        .wb_adr_i(wb_adr_i),
261        .wb_adr_int(wb_adr_int),
262                .we_o(          we_o            ),
263                .re_o(re_o)
264                );
265`endif
266
267// Registers
268uart_regs       regs(
269        .clk(           wb_clk_i                ),
270        .wb_rst_i(      wb_rst_i        ),
271        .wb_addr_i(     wb_adr_int      ),
272        .wb_dat_i(      wb_dat8_i       ),
273        .wb_dat_o(      wb_dat8_o       ),
274        .wb_we_i(       we_o            ),
275   .wb_re_i(re_o),
276        .modem_inputs(  {cts_pad_i, dsr_pad_i,
277        ri_pad_i,  dcd_pad_i}   ),
278        .stx_pad_o(             stx_pad_o               ),
279        .srx_pad_i(             srx_pad_i               ),
280`ifdef DATA_BUS_WIDTH_8
281`else
282// debug interface signals      enabled
283.ier(ier), 
284.iir(iir), 
285.fcr(fcr), 
286.mcr(mcr), 
287.lcr(lcr), 
288.msr(msr), 
289.lsr(lsr), 
290.rf_count(rf_count),
291.tf_count(tf_count),
292.tstate(tstate),
293.rstate(rstate),
294`endif                                   
295        .rts_pad_o(             rts_pad_o               ),
296        .dtr_pad_o(             dtr_pad_o               ),
297        .int_o(         int_o           )
298`ifdef UART_HAS_BAUDRATE_OUTPUT
299        , .baud_o(baud_o)
300`endif
301
302);
303
304`ifdef DATA_BUS_WIDTH_8
305`else
306uart_debug_if dbg(/*AUTOINST*/
307                                                // Outputs
308                                                .wb_dat32_o                              (wb_dat32_o[31:0]),
309                                                // Inputs
310                                                .wb_adr_i                                (wb_adr_int[`UART_ADDR_WIDTH-1:0]),
311                                                .ier                                             (ier[3:0]),
312                                                .iir                                             (iir[3:0]),
313                                                .fcr                                             (fcr[1:0]),
314                                                .mcr                                             (mcr[4:0]),
315                                                .lcr                                             (lcr[7:0]),
316                                                .msr                                             (msr[7:0]),
317                                                .lsr                                             (lsr[7:0]),
318                                                .rf_count                                (rf_count[`UART_FIFO_COUNTER_W-1:0]),
319                                                .tf_count                                (tf_count[`UART_FIFO_COUNTER_W-1:0]),
320                                                .tstate                                  (tstate[2:0]),
321                                                .rstate                                  (rstate[3:0]));
322`endif 
323
324initial
325begin
326        `ifdef DATA_BUS_WIDTH_8
327                $display("(%m) UART INFO: Data bus width is 8. No Debug interface.\n");
328        `else
329                $display("(%m) UART INFO: Data bus width is 32. Debug Interface present.\n");
330        `endif
331        `ifdef UART_HAS_BAUDRATE_OUTPUT
332                $display("(%m) UART INFO: Has baudrate output\n");
333        `else
334                $display("(%m) UART INFO: Doesn't have baudrate output\n");
335        `endif
336end
337
338endmodule
339
340
Note: See TracBrowser for help on using the repository browser.