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

Subversion Repositories sparc64soc

[/] [sparc64soc/] [trunk/] [OC-UART/] [uart_rfifo.v] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dmitryr
//////////////////////////////////////////////////////////////////////
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
 
150
module 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
165
parameter fifo_width = `UART_FIFO_WIDTH;
166
parameter fifo_depth = `UART_FIFO_DEPTH;
167
parameter fifo_pointer_w = `UART_FIFO_POINTER_W;
168
parameter fifo_counter_w = `UART_FIFO_COUNTER_W;
169
 
170
input                           clk;
171
input                           wb_rst_i;
172
input                           push;
173
input                           pop;
174
input   [fifo_width-1:0] data_in;
175
input                           fifo_reset;
176
input       reset_status;
177
 
178
output  [fifo_width-1:0] data_out;
179
output                          overrun;
180
output  [fifo_counter_w-1:0]     count;
181
output                          error_bit;
182
 
183
wire    [fifo_width-1:0] data_out;
184
wire [7:0] data8_out;
185
// flags FIFO
186
reg     [2:0]    fifo[fifo_depth-1:0];
187
 
188
// FIFO pointers
189
reg     [fifo_pointer_w-1:0]     top;
190
reg     [fifo_pointer_w-1:0]     bottom;
191
 
192
reg     [fifo_counter_w-1:0]     count;
193
reg                             overrun;
194
 
195
wire [fifo_pointer_w-1:0] top_plus_1 = top + 1'b1;
196
 
197
raminfr #(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
 
206
integer i;
207
 
208
always @(posedge clk or posedge wb_rst_i) // synchronous FIFO
209
begin
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
280
end   // always
281
 
282
always @(posedge clk or posedge wb_rst_i) // synchronous FIFO
283
begin
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;
292
end   // always
293
 
294
 
295
// please note though that data_out is only valid one clock after pop signal
296
assign 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
 
301
wire    [2:0]    word0 = fifo[0];
302
wire    [2:0]    word1 = fifo[1];
303
wire    [2:0]    word2 = fifo[2];
304
wire    [2:0]    word3 = fifo[3];
305
wire    [2:0]    word4 = fifo[4];
306
wire    [2:0]    word5 = fifo[5];
307
wire    [2:0]    word6 = fifo[6];
308
wire    [2:0]    word7 = fifo[7];
309
 
310
wire    [2:0]    word8 = fifo[8];
311
wire    [2:0]    word9 = fifo[9];
312
wire    [2:0]    word10 = fifo[10];
313
wire    [2:0]    word11 = fifo[11];
314
wire    [2:0]    word12 = fifo[12];
315
wire    [2:0]    word13 = fifo[13];
316
wire    [2:0]    word14 = fifo[14];
317
wire    [2:0]    word15 = 0;//fifo[15];
318
 
319
// a 1 is returned if any of the error bits in the fifo is 1
320
assign  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
 
325
endmodule

powered by: WebSVN 2.1.0

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