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

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

versione iniziale opensparc

Line 
1//////////////////////////////////////////////////////////////////////
2////                                                              ////
3////  uart_rfifo.v (Modified from uart_fifo.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 receiver FIFO                                     ////
19////                                                              ////
20////  To Do:                                                      ////
21////  Nothing.                                                    ////
22////                                                              ////
23////  Author(s):                                                  ////
24////      - gorban@opencores.org                                  ////
25////      - Jacob Gorban                                          ////
26////      - Igor Mohor (igorm@opencores.org)                      ////
27////                                                              ////
28////  Created:        2001/05/12                                  ////
29////  Last Updated:   2002/07/22                                  ////
30////                  (See log for the revision history)          ////
31////                                                              ////
32////                                                              ////
33//////////////////////////////////////////////////////////////////////
34////                                                              ////
35//// Copyright (C) 2000, 2001 Authors                             ////
36////                                                              ////
37//// This source file may be used and distributed without         ////
38//// restriction provided that this copyright statement is not    ////
39//// removed from the file and that any derivative work contains  ////
40//// the original copyright notice and the associated disclaimer. ////
41////                                                              ////
42//// This source file is free software; you can redistribute it   ////
43//// and/or modify it under the terms of the GNU Lesser General   ////
44//// Public License as published by the Free Software Foundation; ////
45//// either version 2.1 of the License, or (at your option) any   ////
46//// later version.                                               ////
47////                                                              ////
48//// This source is distributed in the hope that it will be       ////
49//// useful, but WITHOUT ANY WARRANTY; without even the implied   ////
50//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      ////
51//// PURPOSE.  See the GNU Lesser General Public License for more ////
52//// details.                                                     ////
53////                                                              ////
54//// You should have received a copy of the GNU Lesser General    ////
55//// Public License along with this source; if not, download it   ////
56//// from http://www.opencores.org/lgpl.shtml                     ////
57////                                                              ////
58//////////////////////////////////////////////////////////////////////
59//
60// CVS Revision History
61//
62// $Log: not supported by cvs2svn $
63// Revision 1.3  2003/06/11 16:37:47  gorban
64// This fixes errors in some cases when data is being read and put to the FIFO at the same time. Patch is submitted by Scott Furman. Update is very recommended.
65//
66// Revision 1.2  2002/07/29 21:16:18  gorban
67// The uart_defines.v file is included again in sources.
68//
69// Revision 1.1  2002/07/22 23:02:23  gorban
70// Bug Fixes:
71//  * Possible loss of sync and bad reception of stop bit on slow baud rates fixed.
72//   Problem reported by Kenny.Tung.
73//  * Bad (or lack of ) loopback handling fixed. Reported by Cherry Withers.
74//
75// Improvements:
76//  * Made FIFO's as general inferrable memory where possible.
77//  So on FPGA they should be inferred as RAM (Distributed RAM on Xilinx).
78//  This saves about 1/3 of the Slice count and reduces P&R and synthesis times.
79//
80//  * Added optional baudrate output (baud_o).
81//  This is identical to BAUDOUT* signal on 16550 chip.
82//  It outputs 16xbit_clock_rate - the divided clock.
83//  It's disabled by default. Define UART_HAS_BAUDRATE_OUTPUT to use.
84//
85// Revision 1.16  2001/12/20 13:25:46  mohor
86// rx push changed to be only one cycle wide.
87//
88// Revision 1.15  2001/12/18 09:01:07  mohor
89// Bug that was entered in the last update fixed (rx state machine).
90//
91// Revision 1.14  2001/12/17 14:46:48  mohor
92// overrun signal was moved to separate block because many sequential lsr
93// reads were preventing data from being written to rx fifo.
94// underrun signal was not used and was removed from the project.
95//
96// Revision 1.13  2001/11/26 21:38:54  gorban
97// Lots of fixes:
98// Break condition wasn't handled correctly at all.
99// LSR bits could lose their values.
100// LSR value after reset was wrong.
101// Timing of THRE interrupt signal corrected.
102// LSR bit 0 timing corrected.
103//
104// Revision 1.12  2001/11/08 14:54:23  mohor
105// Comments in Slovene language deleted, few small fixes for better work of
106// old tools. IRQs need to be fix.
107//
108// Revision 1.11  2001/11/07 17:51:52  gorban
109// Heavily rewritten interrupt and LSR subsystems.
110// Many bugs hopefully squashed.
111//
112// Revision 1.10  2001/10/20 09:58:40  gorban
113// Small synopsis fixes
114//
115// Revision 1.9  2001/08/24 21:01:12  mohor
116// Things connected to parity changed.
117// Clock devider changed.
118//
119// Revision 1.8  2001/08/24 08:48:10  mohor
120// FIFO was not cleared after the data was read bug fixed.
121//
122// Revision 1.7  2001/08/23 16:05:05  mohor
123// Stop bit bug fixed.
124// Parity bug fixed.
125// WISHBONE read cycle bug fixed,
126// OE indicator (Overrun Error) bug fixed.
127// PE indicator (Parity Error) bug fixed.
128// Register read bug fixed.
129//
130// Revision 1.3  2001/05/31 20:08:01  gorban
131// FIFO changes and other corrections.
132//
133// Revision 1.3  2001/05/27 17:37:48  gorban
134// Fixed many bugs. Updated spec. Changed FIFO files structure. See CHANGES.txt file.
135//
136// Revision 1.2  2001/05/17 18:34:18  gorban
137// First 'stable' release. Should be sythesizable now. Also added new header.
138//
139// Revision 1.0  2001-05-17 21:27:12+02  jacob
140// Initial revision
141//
142//
143
144// synopsys translate_off
145`include "timescale.v"
146// synopsys translate_on
147
148`include "uart_defines.v"
149
150module uart_rfifo (clk, 
151        wb_rst_i, data_in, data_out,
152// Control signals
153        push, // push strobe, active high
154        pop,   // pop strobe, active high
155// status signals
156        overrun,
157        count,
158        error_bit,
159        fifo_reset,
160        reset_status
161        );
162
163
164// FIFO parameters
165parameter fifo_width = `UART_FIFO_WIDTH;
166parameter fifo_depth = `UART_FIFO_DEPTH;
167parameter fifo_pointer_w = `UART_FIFO_POINTER_W;
168parameter fifo_counter_w = `UART_FIFO_COUNTER_W;
169
170input                           clk;
171input                           wb_rst_i;
172input                           push;
173input                           pop;
174input   [fifo_width-1:0]        data_in;
175input                           fifo_reset;
176input       reset_status;
177
178output  [fifo_width-1:0]        data_out;
179output                          overrun;
180output  [fifo_counter_w-1:0]    count;
181output                          error_bit;
182
183wire    [fifo_width-1:0]        data_out;
184wire [7:0] data8_out;
185// flags FIFO
186reg     [2:0]   fifo[fifo_depth-1:0];
187
188// FIFO pointers
189reg     [fifo_pointer_w-1:0]    top;
190reg     [fifo_pointer_w-1:0]    bottom;
191
192reg     [fifo_counter_w-1:0]    count;
193reg                             overrun;
194
195wire [fifo_pointer_w-1:0] top_plus_1 = top + 1'b1;
196
197raminfr #(fifo_pointer_w,8,fifo_depth) rfifo 
198        (.clk(clk), 
199                        .we(push), 
200                        .a(top), 
201                        .dpra(bottom), 
202                        .di(data_in[fifo_width-1:fifo_width-8]), 
203                        .dpo(data8_out)
204                ); 
205
206integer i;
207
208always @(posedge clk or posedge wb_rst_i) // synchronous FIFO
209begin
210        if (wb_rst_i)
211        begin
212                top             <= #1 0;
213                bottom          <= #1 1'b0;
214                count           <= #1 0;
215                for(i=0;i<fifo_depth;i=i+1)
216                   fifo[i] <= #1 0;
217                /*fifo[1] <= #1 0;
218                fifo[2] <= #1 0;
219                fifo[3] <= #1 0;
220                fifo[4] <= #1 0;
221                fifo[5] <= #1 0;
222                fifo[6] <= #1 0;
223                fifo[7] <= #1 0;
224                fifo[8] <= #1 0;
225                fifo[9] <= #1 0;
226                fifo[10] <= #1 0;
227                fifo[11] <= #1 0;
228                fifo[12] <= #1 0;
229                fifo[13] <= #1 0;
230                fifo[14] <= #1 0;
231                fifo[15] <= #1 0;*/
232        end
233        else
234        if (fifo_reset) begin
235                top             <= #1 0;
236                bottom          <= #1 1'b0;
237                count           <= #1 0;
238                for(i=0;i<fifo_depth;i=i+1)
239                   fifo[i] <= #1 0;
240/*              fifo[0] <= #1 0;
241                fifo[1] <= #1 0;
242                fifo[2] <= #1 0;
243                fifo[3] <= #1 0;
244                fifo[4] <= #1 0;
245                fifo[5] <= #1 0;
246                fifo[6] <= #1 0;
247                fifo[7] <= #1 0;
248                fifo[8] <= #1 0;
249                fifo[9] <= #1 0;
250                fifo[10] <= #1 0;
251                fifo[11] <= #1 0;
252                fifo[12] <= #1 0;
253                fifo[13] <= #1 0;
254                fifo[14] <= #1 0;
255                fifo[15] <= #1 0;*/
256        end
257  else
258        begin
259                case ({push, pop})
260                2'b10 : if (count<fifo_depth)  // overrun condition
261                        begin
262                                top       <= #1 top_plus_1;
263                                fifo[top] <= #1 data_in[2:0];
264                                count     <= #1 count + 1'b1;
265                        end
266                2'b01 : if(count>0)
267                        begin
268        fifo[bottom] <= #1 0;
269                                bottom   <= #1 bottom + 1'b1;
270                                count    <= #1 count - 1'b1;
271                        end
272                2'b11 : begin
273                                bottom   <= #1 bottom + 1'b1;
274                                top       <= #1 top_plus_1;
275                                fifo[top] <= #1 data_in[2:0];
276                        end
277    default: ;
278                endcase
279        end
280end   // always
281
282always @(posedge clk or posedge wb_rst_i) // synchronous FIFO
283begin
284  if (wb_rst_i)
285    overrun   <= #1 1'b0;
286  else
287  if(fifo_reset | reset_status) 
288    overrun   <= #1 1'b0;
289  else
290  if(push & ~pop & (count==fifo_depth))
291    overrun   <= #1 1'b1;
292end   // always
293
294
295// please note though that data_out is only valid one clock after pop signal
296assign data_out = {data8_out,fifo[bottom]};
297
298// Additional logic for detection of error conditions (parity and framing) inside the FIFO
299// for the Line Status Register bit 7
300
301wire    [2:0]   word0 = fifo[0];
302wire    [2:0]   word1 = fifo[1];
303wire    [2:0]   word2 = fifo[2];
304wire    [2:0]   word3 = fifo[3];
305wire    [2:0]   word4 = fifo[4];
306wire    [2:0]   word5 = fifo[5];
307wire    [2:0]   word6 = fifo[6];
308wire    [2:0]   word7 = fifo[7];
309
310wire    [2:0]   word8 = fifo[8];
311wire    [2:0]   word9 = fifo[9];
312wire    [2:0]   word10 = fifo[10];
313wire    [2:0]   word11 = fifo[11];
314wire    [2:0]   word12 = fifo[12];
315wire    [2:0]   word13 = fifo[13];
316wire    [2:0]   word14 = fifo[14];
317wire    [2:0]   word15 = 0;//fifo[15];
318
319// a 1 is returned if any of the error bits in the fifo is 1
320assign  error_bit = |(word0[2:0]  | word1[2:0]  | word2[2:0]  | word3[2:0]  |
321                              word4[2:0]  | word5[2:0]  | word6[2:0]  | word7[2:0]  |
322                              word8[2:0]  | word9[2:0]  | word10[2:0] | word11[2:0] |
323                              word12[2:0] | word13[2:0] | word14[2:0] | word15[2:0] );
324                                                               
325endmodule
Note: See TracBrowser for help on using the repository browser.