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

Subversion Repositories wf3d

[/] [wf3d/] [trunk/] [implement/] [rtl/] [axi_cmn/] [fm_mic.v] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 5 specular
//=======================================================================
2
// Project Monophony
3
//   Wire-Frame 3D Graphics Accelerator IP Core
4
//
5
// File:
6
//   fm_mic.v
7
//
8
// Abstract:
9
//   Memory Interconnect top module
10
//
11
// Author:
12 9 specular
//   Kenji Ishimaru (info.info.wf3d@gmail.com)
13 5 specular
//
14
//======================================================================
15
//
16
// Copyright (c) 2015, Kenji Ishimaru
17
// All rights reserved.
18
//
19
// Redistribution and use in source and binary forms, with or without
20
// modification, are permitted provided that the following conditions are met:
21
//
22
//  -Redistributions of source code must retain the above copyright notice,
23
//   this list of conditions and the following disclaimer.
24
//  -Redistributions in binary form must reproduce the above copyright notice,
25
//   this list of conditions and the following disclaimer in the documentation
26
//   and/or other materials provided with the distribution.
27
//
28
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
29
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
30
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
31
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
32
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
33
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
34
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
35
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
36
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
37
// OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
38
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39
//
40
// Revision History
41
 
42
module fm_mic (
43
    clk_core,
44
    rst_x,
45
    // write/read port 0 (vertex fetch)
46
    i_wr_req0,
47
    i_wr_wr0,
48
    i_wr_adrs0,
49
    i_wr_len0,
50
    o_wr_ack0,
51
    i_wr_wstr0,
52
    i_wr_be0,
53
    i_wr_wdata0,
54
    o_wr_wack0,
55
    o_wr_rstr0,
56
    o_wr_rdata0,
57
    // read/write port 1 (3D read/write)
58
    i_wr_req1,
59
    i_wr_wr1,
60
    i_wr_adrs1,
61
    i_wr_len1,
62
    o_wr_ack1,
63
    i_wr_be1,
64
    i_wr_wdata1,
65
    o_wr_rstr1,
66
    o_wr_rdata1,
67
    // read port 2 (ctr controller)
68
    i_r_req2,
69
    i_r_adrs2,
70
    i_r_len2,
71
    o_r_ack2,
72
    o_r_rstr2,
73
    o_r_rdata2,
74
    // write port 3 (DMA write)
75
    i_wr_req3,
76
    i_wr_adrs3,
77
    i_wr_len3,
78
    o_wr_ack3,
79
    i_wr_wstr3,
80
    i_wr_be3,
81
    i_wr_wdata3,
82
    o_wr_wack3,
83
    // DIMM Bridge Interface
84
    o_brg_req,
85
    o_brg_wr,
86
    o_brg_id,
87
    o_brg_adrs,
88
    o_brg_len,
89
    i_brg_ack,
90
    o_brg_wstr,
91
    o_brg_be,
92
    o_brg_wdata,
93
    i_brg_wack,
94
    i_brg_rstr,
95
    i_brg_rlast,
96
    i_brg_rid,
97
    i_brg_rdata
98
);
99
`include "polyphony_params.v"
100
//////////////////////////////////
101
// I/O port definition
102
//////////////////////////////////
103
input          clk_core;
104
input          rst_x;
105
// write/read port 0
106
input          i_wr_req0;
107
input          i_wr_wr0;
108
input  [P_IB_ADDR_WIDTH-1:0]  i_wr_adrs0;
109
input  [P_IB_LEN_WIDTH-1:0]   i_wr_len0;
110
output         o_wr_ack0;
111
input          i_wr_wstr0;
112
input  [P_IB_BE_WIDTH-1:0]    i_wr_be0;
113
input  [P_IB_DATA_WIDTH-1:0]  i_wr_wdata0;
114
output         o_wr_wack0;
115
output         o_wr_rstr0;
116
output [P_IB_DATA_WIDTH-1:0]  o_wr_rdata0;
117
// write/read port 1
118
input          i_wr_req1;
119
input          i_wr_wr1;
120
input  [31:0]  i_wr_adrs1;
121
input  [2:0]   i_wr_len1;
122
output         o_wr_ack1;
123
input  [3:0]   i_wr_be1;
124
input  [31:0]  i_wr_wdata1;
125
output         o_wr_rstr1;
126
output [31:0]  o_wr_rdata1;
127
// read port 2
128
input          i_r_req2;
129
input  [P_IB_ADDR_WIDTH-1:0]  i_r_adrs2;
130
input  [P_IB_LEN_WIDTH-1:0]   i_r_len2;
131
output         o_r_ack2;
132
output         o_r_rstr2;
133
output [P_IB_DATA_WIDTH-1:0]  o_r_rdata2;
134
// write port 3
135
input          i_wr_req3;
136
input  [P_IB_ADDR_WIDTH-1:0]  i_wr_adrs3;
137
input  [P_IB_LEN_WIDTH-1:0]   i_wr_len3;
138
output         o_wr_ack3;
139
input          i_wr_wstr3;
140
input  [P_IB_BE_WIDTH-1:0]    i_wr_be3;
141
input  [P_IB_DATA_WIDTH-1:0]  i_wr_wdata3;
142
output         o_wr_wack3;
143
// DIMM Bridge Interface
144
output         o_brg_req;
145
output         o_brg_wr;
146
output [1:0]   o_brg_id;
147
(* mark_debug = "true" *)output [P_IB_ADDR_WIDTH-1:0]  o_brg_adrs;
148
output [P_IB_LEN_WIDTH-1:0]   o_brg_len;
149
input          i_brg_ack;
150
output         o_brg_wstr;
151
output [P_IB_BE_WIDTH-1:0]    o_brg_be;
152
output [P_IB_DATA_WIDTH-1:0]  o_brg_wdata;
153
input          i_brg_wack;
154
input          i_brg_rstr;
155
input          i_brg_rlast;
156
input  [1:0]   i_brg_rid;
157
input  [P_IB_DATA_WIDTH-1:0]  i_brg_rdata;
158
//////////////////////////////////
159
// regs 
160
//////////////////////////////////
161
//////////////////////////////////
162
// wires 
163
//////////////////////////////////
164
// port0 command/data fifo (write/read)
165
wire   [P_IB_ADDR_WIDTH+P_IB_LEN_WIDTH+1-1:0]
166
               w_fifo_cin0;
167
wire   [P_IB_DATA_WIDTH+P_IB_BE_WIDTH-1:0]
168
               w_fifo_din0;   // write data bus + be
169
wire   [P_IB_ADDR_WIDTH+P_IB_LEN_WIDTH+1-1:0]
170
               w_fifo_cout0;
171
wire   [P_IB_DATA_WIDTH+P_IB_BE_WIDTH-1:0]
172
               w_fifo_dout0;
173
wire           w_cfifo_ack0;
174
wire           w_dfifo_ack0;
175
// port3 command/data fifo
176
wire   [P_IB_ADDR_WIDTH+P_IB_LEN_WIDTH-1:0]
177
               w_fifo_cin3;
178
wire   [P_IB_DATA_WIDTH+P_IB_BE_WIDTH-1:0]
179
               w_fifo_din3;   // write data bus + be
180
wire   [P_IB_ADDR_WIDTH+P_IB_LEN_WIDTH-1:0]
181
               w_fifo_cout3;
182
wire   [P_IB_DATA_WIDTH+P_IB_BE_WIDTH-1:0]
183
               w_fifo_dout3;
184
wire           w_cfifo_ack3;
185
wire           w_dfifo_ack3;
186
// port 0
187
wire           w_req0;
188
wire           w_we0;
189
wire   [P_IB_ADDR_WIDTH-1:0]  w_add0;
190
wire   [P_IB_LEN_WIDTH-1:0]   w_len0;
191
wire   [P_IB_BE_WIDTH-1:0]    w_be0;
192
wire           w_cack0;
193
wire           w_strw0;
194
wire   [P_IB_DATA_WIDTH-1:0]  w_dbw0;
195
wire           w_wdata_read_end0;
196
wire           w_wdata_ack0;
197
wire           w_strr0;
198
wire   [P_IB_DATA_WIDTH-1:0]  w_dbr0;
199
// port 1
200
wire   w_req1;
201
wire   w_we1;
202
wire   [P_IB_ADDR_WIDTH-1:0]  w_add1;
203
wire           w_ack1;
204
wire           w_cack1;
205
wire   [P_IB_LEN_WIDTH-1:0]   w_len1;
206
wire   [P_IB_BE_WIDTH-1:0]    w_be1;
207
wire   [P_IB_DATA_WIDTH-1:0]  w_dbw1;
208
wire                          w_rstr1;
209
wire   [P_IB_DATA_WIDTH-1:0]  w_rdata1;
210
// port 2
211
wire           w_cack2;
212
// port 3
213
wire           w_req3;
214
wire   [P_IB_ADDR_WIDTH-1:0]  w_add3;
215
wire   [P_IB_LEN_WIDTH-1:0]   w_len3;
216
wire   [P_IB_BE_WIDTH-1:0]    w_be3;
217
wire           w_cack3;
218
wire           w_strw3;
219
wire   [P_IB_DATA_WIDTH-1:0]  w_dbw3;
220
wire           w_wdata_read_end3;
221
wire           w_wdata_ack3;
222
 
223
//////////////////////////////////
224
// assign statement 
225
//////////////////////////////////
226
//  port0 (r/w)
227
    assign w_fifo_cin0 = {i_wr_wr0,i_wr_adrs0,i_wr_len0};
228
    assign w_fifo_din0 = {i_wr_be0,i_wr_wdata0};
229
    assign {w_we0,w_add0,w_len0} = w_fifo_cout0;
230
    assign {w_be0,w_dbw0} = w_fifo_dout0;
231
//  port3 (w)
232
    assign w_fifo_cin3 = {i_wr_adrs3,i_wr_len3};
233
    assign w_fifo_din3 = {i_wr_be3,i_wr_wdata3};
234
    assign {w_add3,w_len3} = w_fifo_cout3;
235
    assign {w_be3,w_dbw3} = w_fifo_dout3;
236
 
237
//////////////////////////////////
238
// module instantiation
239
//////////////////////////////////
240
 
241
// port0
242
// command interface
243
fm_cinterface #(P_IB_ADDR_WIDTH+P_IB_LEN_WIDTH+1) u_cinterface0 (
244
  .clk_core(clk_core),
245
  .rst_x(rst_x),
246
  // bus side port
247
  .i_bstr(i_wr_req0),
248
  .i_bdata(w_fifo_cin0),
249
  .o_back(o_wr_ack0),
250
  // internal port
251
  .o_istr(w_req0),
252
  .o_idata(w_fifo_cout0),
253
  .i_iack(w_cfifo_ack0)
254
);
255
 
256
// port0
257
// wtite data interface
258
fm_dinterface #(P_IB_BE_WIDTH+P_IB_DATA_WIDTH) u_dinterface0 (
259
  .clk_core(clk_core),
260
  .rst_x(rst_x),
261
  // bus side port
262
  .i_bstr(i_wr_wstr0),
263
  .i_bdata(w_fifo_din0),
264
  .o_back(o_wr_wack0),
265
  // internal port
266
  .o_istr(w_strw0),
267
  .o_idata(w_fifo_dout0),
268
  .i_iack(w_dfifo_ack0)
269
);
270
 
271
// port0
272
// controller
273
fm_port_unit u_port_unit0 (
274
  .clk_core(clk_core),
275
  .rst_x(rst_x),
276
  // port side
277
  .i_req(w_req0),
278
  .i_we(w_we0),
279
  .i_len(w_len0),
280
  .o_ack(w_cfifo_ack0),
281
  .i_strw(w_strw0),
282
  .o_ackw(w_dfifo_ack0),
283
  .o_strr(o_wr_rstr0),
284
  .o_dbr(o_wr_rdata0),
285
  // internal
286
  .i_cack(w_cack0),
287
  .o_wdata_read_end(w_wdata_read_end0),
288
  .i_wdata_ack(w_wdata_ack0),
289
  .i_strr(w_strr0),
290
  .i_dbr(w_dbr0)
291
);
292
 
293
fm_mic_cnv u_mic_cnv (
294
  .clk_core(clk_core),
295
  .rst_x(rst_x),
296
  // incoming
297
  .i_req_in(i_wr_req1),
298
  .i_wr_in(i_wr_wr1),
299
  .i_adrs_in(i_wr_adrs1[31:2]),
300
  .i_len_in(i_wr_len1),
301
  .o_ack_in(w_cack1),
302
  .i_be_in(i_wr_be1),
303
  .i_wdata_in(i_wr_wdata1),
304
  .o_rstr_in(o_wr_rstr1),
305
  .o_rdata_in(o_wr_rdata1),
306
  // outcoming
307
  .o_req_out(w_req1),
308
  .o_wr_out(w_we1),
309
  .o_adrs_out(w_add1),
310
  .o_len_out(w_len1),
311
  .i_ack_out(w_ack1),
312
  .o_be_out(w_be1),
313
  .o_wdata_out(w_dbw1),
314
  .i_rstr_out(w_rstr1),
315
  .i_rdata_out(w_rdata1)
316
);
317
assign o_wr_ack1 = (i_wr_req1) ? w_cack1 : 1'b1;
318
// port2
319
assign o_r_ack2 = (i_r_req2) ? w_cack2 : 1'b1;
320
 
321
// port3
322
// command interface
323
fm_cinterface #(P_IB_ADDR_WIDTH+P_IB_LEN_WIDTH) u_cinterface3 (
324
  .clk_core(clk_core),
325
  .rst_x(rst_x),
326
  // bus side port
327
  .i_bstr(i_wr_req3),
328
  .i_bdata(w_fifo_cin3),
329
  .o_back(o_wr_ack3),
330
  // internal port
331
  .o_istr(w_req3),
332
  .o_idata(w_fifo_cout3),
333
  .i_iack(w_cfifo_ack3)
334
);
335
 
336
// port3
337
// wtite data interface
338
fm_dinterface #(P_IB_BE_WIDTH+P_IB_DATA_WIDTH) u_dinterface3 (
339
  .clk_core(clk_core),
340
  .rst_x(rst_x),
341
  // bus side port
342
  .i_bstr(i_wr_wstr3),
343
  .i_bdata(w_fifo_din3),
344
  .o_back(o_wr_wack3),
345
  // internal port
346
  .o_istr(w_strw3),
347
  .o_idata(w_fifo_dout3),
348
  .i_iack(w_dfifo_ack3)
349
);
350
 
351
// port3
352
// controller
353
fm_port_unit u_port_unit3 (
354
  .clk_core(clk_core),
355
  .rst_x(rst_x),
356
  // port side
357
  .i_req(w_req3),
358
  .i_we(1'b1),
359
  .i_len(w_len3),
360
  .o_ack(w_cfifo_ack3),
361
  .i_strw(w_strw3),
362
  .o_ackw(w_dfifo_ack3),
363
  .o_strr(),
364
  .o_dbr(),
365
  // internal
366
  .i_cack(w_cack3),
367
  .o_wdata_read_end(w_wdata_read_end3),
368
  .i_wdata_ack(w_wdata_ack3),
369
  .i_strr(1'b0),
370
  .i_dbr(64'h0)
371
);
372
 
373
fm_port_priority u_port_priority (
374
  .clk_core(clk_core),
375
  .rst_x(rst_x),
376
  // port0 side Read/Write
377
  .i_req0(w_req0),
378
  .i_we0(w_we0),
379
  .i_add0(w_add0),
380
  .i_len0(w_len0),
381
  .i_be0(w_be0),
382
  .o_cack0(w_cack0),
383
  .i_strw0(w_strw0),
384
  .i_dbw0(w_dbw0),
385
  .i_wdata_read_end0(w_wdata_read_end0),
386
  .o_wdata_ack0(w_wdata_ack0),
387
  .o_strr0(w_strr0),
388
  .o_dbr0(w_dbr0),
389
  // port1 side Read/Write
390
  .i_req1(w_req1),
391
  .i_we1(w_we1),
392
  .i_add1(w_add1),
393
  .i_len1(w_len1),
394
  .i_be1(w_be1),
395
  .o_cack1(w_ack1),
396
  .i_strw1(w_req1),
397
  .i_dbw1(w_dbw1),
398
  .i_wdata_read_end1(1'b1),
399
  .o_wdata_ack1(),
400
  .o_strr1(w_rstr1),
401
  .o_dbr1(w_rdata1),
402
  // port2 side Read Only
403
  .i_req2(i_r_req2),
404
  .i_add2(i_r_adrs2),
405
  .i_len2(i_r_len2),
406
  .o_cack2(w_cack2),
407
  .o_strr2(o_r_rstr2),
408
  .o_dbr2(o_r_rdata2),
409
  // port3 Write
410
  .i_req3(w_req3),
411
  .i_add3(w_add3),
412
  .i_len3(w_len3),
413
  .i_be3(w_be3),
414
  .o_cack3(w_cack3),
415
  .i_strw3(w_strw3),
416
  .i_dbw3(w_dbw3),
417
  .i_wdata_read_end3(w_wdata_read_end3),
418
  .o_wdata_ack3(w_wdata_ack3),
419
  // output to bus bridge or
420
  // memory bus arbiter far
421
  .o_breq(o_brg_req),
422
  .o_bwe(o_brg_wr),
423
  .o_bid(o_brg_id),
424
  .o_badd(o_brg_adrs),
425
  .o_blen(o_brg_len),
426
  .i_back(i_brg_ack),
427
  .o_bstrw(o_brg_wstr),
428
  .o_bbe(o_brg_be),
429
  .o_bdbw(o_brg_wdata),
430
  .i_backw(i_brg_wack),
431
  .i_bstrr(i_brg_rstr),
432
  .i_blast(i_brg_rlast),
433
  .i_brid(i_brg_rid),
434
  .i_bdbr(i_brg_rdata)
435
);
436
 
437
endmodule

powered by: WebSVN 2.1.0

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