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

Subversion Repositories spacewiresystemc

[/] [spacewiresystemc/] [trunk/] [rtl/] [RTL_VB/] [fifo_tx.v] - Blame information for rev 37

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

Line No. Rev Author Line
1 33 redbear
//+FHDR------------------------------------------------------------------------
2
//Copyright (c) 2013 Latin Group American Integhrated Circuit, Inc. All rights reserved
3
//GLADIC Open Source RTL
4
//-----------------------------------------------------------------------------
5
//FILE NAME      :
6
//DEPARTMENT     : IC Design / Verification
7
//AUTHOR         : Felipe Fernandes da Costa
8
//AUTHOR’S EMAIL :
9
//-----------------------------------------------------------------------------
10
//RELEASE HISTORY
11
//VERSION DATE AUTHOR DESCRIPTION
12
//1.0 YYYY-MM-DD name
13
//-----------------------------------------------------------------------------
14
//KEYWORDS : General file searching keywords, leave blank if none.
15
//-----------------------------------------------------------------------------
16
//PURPOSE  : ECSS_E_ST_50_12C_31_july_2008
17
//-----------------------------------------------------------------------------
18
//PARAMETERS
19
//PARAM NAME            RANGE   : DESCRIPTION : DEFAULT : UNITS
20
//e.g.DATA_WIDTH        [32,16] : width of the data : 32:
21
//-----------------------------------------------------------------------------
22
//REUSE ISSUES
23
//Reset Strategy        :
24
//Clock Domains         :
25
//Critical Timing       :
26
//Test Features         :
27
//Asynchronous I/F      :
28
//Scan Methodology      :
29
//Instantiations        :
30
//Synthesizable (y/n)   :
31
//Other                 :
32
//-FHDR------------------------------------------------------------------------
33
module fifo_tx
34
#(
35
        parameter integer DWIDTH = 9,
36
        parameter integer AWIDTH = 6
37
)
38
 
39
(
40
        input clock, reset, wr_en, rd_en,
41
        input [DWIDTH-1:0] data_in,
42
        output reg f_full,write_tx,f_empty,
43
        output reg [DWIDTH-1:0] data_out,
44
        output reg [AWIDTH-1:0] counter
45
);
46
 
47
        reg [DWIDTH-1:0] mem [0:2**AWIDTH-1];
48
 
49
        reg [AWIDTH-1:0] wr_ptr;
50
        reg [AWIDTH-1:0] rd_ptr;
51
 
52 37 redbear
        reg  [1:0] state_data_write;
53
        reg  [1:0] next_state_data_write;
54 33 redbear
 
55 37 redbear
        reg  [1:0] state_data_read;
56
        reg  [1:0] next_state_data_read;
57
 
58
/****************************************/
59
 
60
always@(*)
61
begin
62
        next_state_data_write = state_data_write;
63
 
64
        case(state_data_write)
65
        2'd0:
66
        begin
67
                if(wr_en && !f_full)
68
                begin
69
                        next_state_data_write = 2'd1;
70
                end
71
                else
72
                begin
73
                        next_state_data_write = 2'd0;
74
                end
75
        end
76
        2'd1:
77
        begin
78
                if(wr_en)
79
                begin
80
                        next_state_data_write = 2'd1;
81
                end
82
                else
83
                begin
84
                        next_state_data_write = 2'd2;
85
                end
86
        end
87
        2'd2:
88
        begin
89
                next_state_data_write = 2'd0;
90
        end
91
        default:
92
        begin
93
                next_state_data_write = 2'd0;
94
        end
95
        endcase
96
end
97
 
98
/****************************************/
99
 
100
always@(*)
101
begin
102
        next_state_data_read = state_data_read;
103
 
104
        case(state_data_read)
105
        2'd0:
106
        begin
107
                if(rd_en && !f_empty)
108
                begin
109
                        next_state_data_read = 2'd1;
110
                end
111
                else
112
                begin
113
                        next_state_data_read = 2'd0;
114
                end
115
        end
116
        2'd1:
117
        begin
118
                if(rd_en)
119
                begin
120
                        next_state_data_read = 2'd1;
121
                end
122
                else
123
                begin
124
                        next_state_data_read = 2'd2;
125
                end
126
        end
127
        2'd2:
128
        begin
129
                next_state_data_read = 2'd0;
130
        end
131
        default:
132
        begin
133
                next_state_data_read = 2'd0;
134
        end
135
        endcase
136
end
137
 
138 33 redbear
//Write pointer
139
        always@(posedge clock or negedge reset)
140
        begin
141
                if (!reset)
142
                begin
143 34 redbear
                        mem[0]  <= {(DWIDTH){1'b0}};
144
                        mem[1]  <= {(DWIDTH){1'b0}};
145
                        mem[2]  <= {(DWIDTH){1'b0}};
146
                        mem[3]  <= {(DWIDTH){1'b0}};
147
                        mem[4]  <= {(DWIDTH){1'b0}};
148
                        mem[5]  <= {(DWIDTH){1'b0}};
149
                        mem[6]  <= {(DWIDTH){1'b0}};
150
                        mem[7]  <= {(DWIDTH){1'b0}};
151
                        mem[8]  <= {(DWIDTH){1'b0}};
152
                        mem[9]  <= {(DWIDTH){1'b0}};
153
                        mem[10] <= {(DWIDTH){1'b0}};
154
 
155
                        mem[11] <= {(DWIDTH){1'b0}};
156
                        mem[12] <= {(DWIDTH){1'b0}};
157
                        mem[13] <= {(DWIDTH){1'b0}};
158
                        mem[14] <= {(DWIDTH){1'b0}};
159
                        mem[15] <= {(DWIDTH){1'b0}};
160
                        mem[16] <= {(DWIDTH){1'b0}};
161
                        mem[17] <= {(DWIDTH){1'b0}};
162
                        mem[18] <= {(DWIDTH){1'b0}};
163
                        mem[19] <= {(DWIDTH){1'b0}};
164
                        mem[20] <= {(DWIDTH){1'b0}};
165
                        mem[21] <= {(DWIDTH){1'b0}};
166
 
167
                        mem[22] <= {(DWIDTH){1'b0}};
168
                        mem[23] <= {(DWIDTH){1'b0}};
169
                        mem[24] <= {(DWIDTH){1'b0}};
170
                        mem[25] <= {(DWIDTH){1'b0}};
171
                        mem[26] <= {(DWIDTH){1'b0}};
172
                        mem[27] <= {(DWIDTH){1'b0}};
173
                        mem[28] <= {(DWIDTH){1'b0}};
174
                        mem[29] <= {(DWIDTH){1'b0}};
175
                        mem[30] <= {(DWIDTH){1'b0}};
176
                        mem[31] <= {(DWIDTH){1'b0}};
177
                        mem[32] <= {(DWIDTH){1'b0}};
178
 
179
 
180
                        mem[33] <= {(DWIDTH){1'b0}};
181
                        mem[34] <= {(DWIDTH){1'b0}};
182
                        mem[35] <= {(DWIDTH){1'b0}};
183
                        mem[36] <= {(DWIDTH){1'b0}};
184
                        mem[37] <= {(DWIDTH){1'b0}};
185
                        mem[38] <= {(DWIDTH){1'b0}};
186
                        mem[39] <= {(DWIDTH){1'b0}};
187
                        mem[40] <= {(DWIDTH){1'b0}};
188
                        mem[41] <= {(DWIDTH){1'b0}};
189
                        mem[42] <= {(DWIDTH){1'b0}};
190
                        mem[43] <= {(DWIDTH){1'b0}};
191
 
192
                        mem[44] <= {(DWIDTH){1'b0}};
193
                        mem[45] <= {(DWIDTH){1'b0}};
194
                        mem[46] <= {(DWIDTH){1'b0}};
195
                        mem[47] <= {(DWIDTH){1'b0}};
196
                        mem[48] <= {(DWIDTH){1'b0}};
197
                        mem[49] <= {(DWIDTH){1'b0}};
198
                        mem[50] <= {(DWIDTH){1'b0}};
199
                        mem[51] <= {(DWIDTH){1'b0}};
200
                        mem[52] <= {(DWIDTH){1'b0}};
201
                        mem[53] <= {(DWIDTH){1'b0}};
202
                        mem[54] <= {(DWIDTH){1'b0}};
203
 
204
                        mem[55] <= {(DWIDTH){1'b0}};
205
                        mem[56] <= {(DWIDTH){1'b0}};
206
                        mem[57] <= {(DWIDTH){1'b0}};
207
                        mem[58] <= {(DWIDTH){1'b0}};
208
                        mem[59] <= {(DWIDTH){1'b0}};
209
                        mem[60] <= {(DWIDTH){1'b0}};
210
                        mem[61] <= {(DWIDTH){1'b0}};
211
                        mem[62] <= {(DWIDTH){1'b0}};
212
                        mem[63] <= {(DWIDTH){1'b0}};
213
 
214
                        wr_ptr      <= {(AWIDTH){1'b0}};
215 37 redbear
                        state_data_write <= 2'd0;
216 33 redbear
                end
217 34 redbear
                else
218 33 redbear
                begin
219
 
220 37 redbear
                        state_data_write <= next_state_data_write;
221 33 redbear
 
222 37 redbear
                        case(state_data_write)
223
                        2'd0:
224 33 redbear
                        begin
225 37 redbear
                                mem[wr_ptr]<=data_in;
226 33 redbear
                        end
227 37 redbear
                        2'd1:
228 34 redbear
                        begin
229 37 redbear
                                mem[wr_ptr]<=mem[wr_ptr];
230 34 redbear
                        end
231 37 redbear
                        2'd2:
232 33 redbear
                        begin
233 37 redbear
                                wr_ptr <= wr_ptr + 6'd1;
234 33 redbear
                        end
235 37 redbear
                        default:
236 34 redbear
                        begin
237 37 redbear
                                mem[wr_ptr]<=mem[wr_ptr];
238
                                wr_ptr <= wr_ptr;
239 34 redbear
                        end
240 37 redbear
                        endcase
241
                end
242
        end
243 33 redbear
 
244 37 redbear
//FULL - EMPTY COUNTER
245
always@(posedge clock or negedge reset)
246
begin
247
        if (!reset)
248
        begin
249
                f_full  <= 1'b0;
250
                f_empty <= 1'b1;
251
                counter <= {(AWIDTH){1'b0}};
252
        end
253
        else
254
        begin
255
 
256
                if (state_data_write == 2'd2)
257
                begin
258 33 redbear
                        if(counter == 6'd63)
259 37 redbear
                                counter <= counter;
260 33 redbear
                        else
261 37 redbear
                                counter <= counter + 6'd1;
262
                end
263
                else if(state_data_read == 2'd2)
264
                begin
265 33 redbear
                        if(counter == 6'd0)
266 37 redbear
                                counter <= counter;
267 33 redbear
                        else
268 37 redbear
                                counter <= counter - 6'd1;
269
                end
270
                else
271
                begin
272
                        counter <= counter;
273
                end
274 33 redbear
 
275 37 redbear
                if(counter == 6'd63)
276
                begin
277
                        f_full <= 1'b1;
278 33 redbear
                end
279 37 redbear
                else
280
                begin
281
                        f_full <= 1'b0;
282
                end
283 33 redbear
 
284 37 redbear
                if(counter == 6'd0)
285 33 redbear
                begin
286 37 redbear
                        f_empty <= 1'b1;
287 33 redbear
                end
288
                else
289
                begin
290 37 redbear
                        f_empty <= 1'b0;
291
                end
292
        end
293
end
294 33 redbear
 
295 37 redbear
//Read pointer
296
always@(posedge clock or negedge reset)
297
begin
298
        if (!reset)
299
        begin
300
                rd_ptr     <= {(AWIDTH){1'b0}};
301
                data_out   <= 9'd0;
302
                write_tx   <= 1'b0;
303
                state_data_read <= 2'd0;
304
        end
305
        else
306
        begin
307
                state_data_read <= next_state_data_read;
308 33 redbear
 
309 37 redbear
                case(state_data_read)
310
                2'd0:
311
                begin
312 34 redbear
                        if(rd_en)
313 33 redbear
                        begin
314
                                write_tx<= 1'b0;
315 37 redbear
                                data_out   <= data_out;
316
                                rd_ptr     <= rd_ptr+ 6'd1;
317 33 redbear
                        end
318 37 redbear
                        else
319 33 redbear
                        begin
320 37 redbear
                                data_out   <= mem[rd_ptr];
321
                                if(counter > 6'd0)
322
                                begin
323
                                        write_tx<= 1'b1;
324
                                end
325
                                else
326
                                        write_tx<= 1'b0;
327 33 redbear
                        end
328
                end
329 37 redbear
                2'd1:
330
                begin
331
                        write_tx<= 1'b0;
332
                        data_out   <= mem[rd_ptr];
333
                end
334
                2'd2:
335
                begin
336
                        write_tx<= 1'b0;
337
                        data_out   <= data_out;
338
                end
339
                default:
340
                begin
341
                        rd_ptr     <= rd_ptr;
342
                        data_out   <= data_out;
343
                end
344
                endcase
345 33 redbear
        end
346 37 redbear
end
347 33 redbear
 
348
endmodule

powered by: WebSVN 2.1.0

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