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

Subversion Repositories pss

[/] [pss/] [trunk/] [pss/] [hdl/] [pss/] [zpu_uc/] [motherblock/] [pss_motherblock.v] - Blame information for rev 5

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

Line No. Rev Author Line
1 5 AlexAntono
/*
2
 PSS
3
 
4
 Copyright (c) 2016 Alexander Antonov <153287@niuitmo.ru>
5
 All rights reserved.
6
 
7
 Version 0.9.0
8
 
9
 The FreeBSD license
10
 
11
 Redistribution and use in source and binary forms, with or without
12
 modification, are permitted provided that the following conditions
13
 are met:
14
 
15
 1. Redistributions of source code must retain the above copyright
16
    notice, this list of conditions and the following disclaimer.
17
 2. Redistributions in binary form must reproduce the above
18
    copyright notice, this list of conditions and the following
19
    disclaimer in the documentation and/or other materials
20
    provided with the distribution.
21
 
22
 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
23
 EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24
 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
25
 PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26
 PSS PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27
 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28
 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29
 OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30
 HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
31
 STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32
 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
33
 ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
*/
35
 
36
 
37
module PSS_MotherBlock
38
#(
39
        parameter A31_DEFAULT = 1,
40
        parameter CPU_RESET_DEFAULT = 1,
41
        parameter MEM_SIZE_KB = 1
42
)
43
(
44
        input clk_i,
45
 
46
        input  arst_i,
47
        output srst_o,
48
        input  srst_i,
49
        output ext_rst_o,
50
 
51
        input [3:0] INT_bi,
52
        output cpu_ireq_o,
53
        input  cpu_iack_i,
54
 
55
        //// Masters ////
56
        // Debug bus //
57
        input dbg_enb_i,
58
        input dbg_we_i,
59
        input [31:0] dbg_addr_bi,
60
        input [31:0] dbg_wdata_bi,
61
        output dbg_ack_o,
62
        output [31:0] dbg_rdata_bo,
63
 
64
        // ZPU bus //
65
        input cpu_enb_i,
66
        input cpu_we_i,
67
        input [31:0] cpu_wdata_bi,
68
        input [31:0] cpu_addr_bi,
69
        input [3:0] cpu_writemask_bi,
70
        output cpu_ack_o,
71
        output [31:0] cpu_rdata_bo,
72
 
73
        //// Slaves ////
74
        // RAM0 bus //
75
        output [31:0] ram0_addr_bo,
76
        output ram0_we_o,
77
        output [31:0] ram0_wdata_bo,
78
        input [31:0] ram0_rdata_bi,
79
 
80
        // RAM1 bus //
81
        output [31:0] ram1_addr_bo,
82
        output ram1_we_o,
83
        output [31:0] ram1_wdata_bo,
84
        input  [31:0] ram1_rdata_bi,
85
 
86
        // Expansion bus //
87
        output reg xport_req_o,
88
        input  xport_ack_i,
89
        input  xport_err_i,
90
        output reg xport_we_o,
91
        output reg [31:0] xport_addr_bo,
92
        output reg [31:0] xport_wdata_bo,
93
        input xport_resp_i,
94
        input [31:0] xport_rdata_bi,
95
 
96
        input  cpu_present_i,
97
        input  [31:0] cpu_pc_bi,
98
        input  cpu_break_i,
99
        output cpu_reset_o,
100
        output cpu_enb_o
101
);
102
 
103
wire app_reset;
104
assign app_reset = srst_i | srst_o;
105
 
106
pss_reset_cntrl reset_cntrl
107
(
108
        .clk_i(clk_i),
109
        .arst_i(arst_i),
110
        .srst_o(srst_o)
111
);
112
 
113
// interrupts
114
wire [3:0]  INT;
115
wire            bus_error_int;
116
wire            trap_int;
117
wire            sgi_int;
118
wire            dma_int;
119
 
120
wire bus_error;
121
wire [31:0] bus_error_addr;
122
 
123
assign bus_error_int = bus_error;
124
 
125
// INTC programming interface
126
wire            intc_ie;
127
wire            intc_ie_we;
128
wire            intc_ie_data;
129
wire [7:0]  intc_mask;
130
wire [7:0]       intc_pending;
131
wire            intc_clr_cmd;
132
wire [7:0]       intc_clr_code;
133
 
134
pss_edge_detector edge_det0
135
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_bi[0]), .out(INT[0]) );
136
 
137
pss_edge_detector edge_det1
138
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_bi[1]), .out(INT[1]) );
139
 
140
pss_edge_detector edge_det2
141
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_bi[2]), .out(INT[2]) );
142
 
143
pss_edge_detector edge_det3
144
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_bi[3]), .out(INT[3]) );
145
 
146
// Interrupt controller
147
pss_int_controller int_controller
148
(
149
        .clk_i(clk_i),
150
        .rst_i(rst_i),
151
        .interrupt_bi({INT, dma_int, sgi_int, trap_int, bus_error_int}),
152
 
153
        .ie_o(intc_ie),
154
        .ie_we_i(intc_ie_we),
155
        .ie_data_i(intc_ie_data),
156
        .mask_bi(intc_mask),
157
        .pending_bo(intc_pending),
158
        .clr_cmd_i(intc_clr_cmd),
159
        .clr_code_bi(intc_clr_code),
160
 
161
        .cpu_req_o(cpu_ireq_o),
162
        .cpu_ack_i(cpu_iack_i)
163
);
164
 
165
assign cpu_enb_o = 1'b1;
166
 
167
reg trap_enable;
168
reg [31:0] trap_addr;
169
 
170
wire dma_req, dma_cmd, dma_autoinc;
171
wire [31:0] dma_sourceaddr;
172
wire [31:0] dma_destaddr;
173
wire [31:0] dma_size;
174
 
175
wire a31;
176
wire dma_works, bb_works;
177
 
178
////////
179
wire sfr_enb;
180
wire sfr_we;
181
wire [31:0] sfr_wdata;
182
wire [31:0] sfr_addr;
183
wire [3:0] sfr_writemask;
184
wire sfr_ack;
185
wire [31:0] sfr_rdata;
186
 
187
wire ext_enb;
188
wire ext_we;
189
wire [31:0] ext_wdata;
190
wire [31:0] ext_addr;
191
wire [3:0] ext_writemask;
192
wire ext_ack;
193
wire [31:0] ext_rdata;
194
 
195
// RAM0 control //
196
wire ram0_enb;
197
reg ram0_ack, ram0_ack_rd;
198
 
199
always @(posedge clk_i)
200
        begin
201
        if (app_reset == 1'b1) ram0_ack_rd <= 1'b0;
202
        else if ((ram0_enb == 1'b1) && (ram0_we_o == 1'b0) && (ram0_ack_rd == 1'b0)) ram0_ack_rd <= 1'b1;
203
        else ram0_ack_rd <= 1'b0;
204
        end
205
 
206
always @*
207
        begin
208
        if ((ram0_enb == 1'b1) && (ram0_we_o == 1'b1)) ram0_ack = 1'b1;
209
        else ram0_ack = ram0_ack_rd;
210
        end
211
 
212
 
213
PSS_IC
214
#(
215
        .MEM_SIZE_KB(MEM_SIZE_KB)
216
)
217
IC_fabric
218
(
219
        .clk_i(clk_i),
220
        .rst_i(app_reset),
221
 
222
        //// Masters ////
223
        .m0_enb_i(dbg_enb_i),
224
        .m0_we_i(dbg_we_i),
225
        .m0_addr_bi(dbg_addr_bi),
226
        .m0_wdata_bi(dbg_wdata_bi),
227
        .m0_writemask_bi(dbg_writemask_bi),
228
        .m0_ack_o(dbg_ack_o),
229
        .m0_rdata_bo(dbg_rdata_bo),
230
 
231
        .m1_enb_i(cpu_enb_i),
232
        .m1_we_i(cpu_we_i),
233
        .m1_addr_bi(cpu_addr_bi),
234
        .m1_wdata_bi(cpu_wdata_bi),
235
        .m1_writemask_bi(cpu_writemask_bi),
236
        .m1_ack_o(cpu_ack_o),
237
        .m1_rdata_bo(cpu_rdata_bo),
238
 
239
        //// Slaves ////
240
        .s0_enb_o(ram0_enb),
241
        .s0_we_o(ram0_we_o),
242
        .s0_addr_bo(ram0_addr_bo),
243
        .s0_wdata_bo(ram0_wdata_bo),
244
        .s0_writemask_bo(ram0_writemask_bo),
245
        .s0_ack_i(ram0_ack),
246
        .s0_rdata_bi(ram0_rdata_bi),
247
 
248
        .s1_enb_o(sfr_enb),
249
        .s1_we_o(sfr_we),
250
        .s1_addr_bo(sfr_addr),
251
        .s1_wdata_bo(sfr_wdata),
252
        .s1_writemask_bo(sfr_writemask),
253
        .s1_ack_i(sfr_ack),
254
        .s1_rdata_bi(sfr_rdata),
255
 
256
        .s2_enb_o(ext_enb),
257
        .s2_we_o(ext_we),
258
        .s2_addr_bo(ext_addr),
259
        .s2_wdata_bo(ext_wdata),
260
        .s2_writemask_bo(ext_writemask),
261
        .s2_ack_i(ext_ack),
262
        .s2_rdata_bi(ext_rdata),
263
 
264
        .error_o(bus_error),
265
        .error_addr_bo(bus_error_addr)
266
);
267
 
268
 
269
PSS_SFR
270
#(
271
        .CPU_RESET_DEFAULT(CPU_RESET_DEFAULT),
272
        .A31_DEFAULT(A31_DEFAULT),
273
        .MEM_SIZE_KB(MEM_SIZE_KB)
274
)
275
SFR
276
(
277
        .clk_i(clk_i),
278
        .rst_i(app_reset),
279
 
280
        .bus_enb_i(sfr_enb),
281
        .bus_we_i(sfr_we),
282
        .bus_wdata_bi(sfr_wdata),
283
        .bus_addr_bi(sfr_addr),
284
        .bus_writemask_bi(sfr_writemask),
285
        .bus_ack_o(sfr_ack),
286
        .bus_rdata_bo(sfr_rdata),
287
 
288
        .cpu_present_i(cpu_present_i),
289
        .cpu_break_i(cpu_break_i),
290
        .cpu_pc_bi(cpu_pc_bi),
291
 
292
        .trap_cpu_enb_i(cpu_enb_i),
293
        .trap_cpu_addr_bi(cpu_addr_bi),
294
 
295
        .cpu_reset_o(cpu_reset_o),
296
        .a31_o(a31),
297
 
298
        .bus_error_i(bus_error),
299
        .bus_error_addr_bi(bus_error_addr),
300
 
301
        .sgi_int_o(sgi_int),
302
        .trap_int_o(trap_int),
303
 
304
        .intc_ie_i(intc_ie),
305
        .intc_pending_bi(intc_pending),
306
        .intc_ie_we_o(intc_ie_we),
307
        .intc_ie_data_o(intc_ie_data),
308
        .intc_mask_bo(intc_mask),
309
        .intc_clr_cmd_o(intc_clr_cmd),
310
        .intc_clr_code_bo(intc_clr_code),
311
 
312
        .dma_req_o(dma_req),
313
        .dma_cmd_o(dma_cmd),
314
        .dma_autoinc_o(dma_autoinc),
315
        .dma_size_bo(dma_size),
316
        .dma_sourceaddr_bo(dma_sourceaddr),
317
        .dma_destaddr_bo(dma_destaddr)
318
);
319
 
320
 
321
wire bb_xport_req;
322
reg  bb_xport_ack;
323
reg  bb_xport_err;
324
wire bb_xport_we;
325
wire [31:0] bb_xport_addr;
326
wire [31:0] bb_xport_wdata;
327
reg  bb_xport_resp;
328
reg [31:0] bb_xport_rdata;
329
 
330
wire dma_xport_req;
331
reg  dma_xport_ack;
332
reg  dma_xport_err;
333
wire dma_xport_we;
334
wire [31:0] dma_xport_addr;
335
wire [31:0] dma_xport_wdata;
336
reg  dma_xport_resp;
337
reg [31:0] dma_xport_rdata;
338
 
339
 
340
PSS_DMA DMA
341
(
342
        .clk_i(clk_i),
343
        .rst_i(app_reset),
344
 
345
        .xport_busy_i(bb_works),
346
        .xport_busy_o(dma_works),
347
 
348
        .dma_int_o(dma_int),
349
 
350
        .dma_req_i(dma_req),
351
        .dma_cmd_i(dma_cmd),
352
        .dma_autoinc_i(dma_autoinc),
353
        .dma_size_bi(REG_DMA_SIZE),
354
        .dma_sourceaddr_bi(REG_DMA_SOURCEADDR),
355
        .dma_destaddr_bi(REG_DMA_DESTADDR),
356
 
357
        .ram_addr_bo(ram1_addr_bo),
358
        .ram_we_o(ram1_we_o),
359
        .ram_wdata_bo(ram1_wdata_bo),
360
        .ram_rdata_bi(ram1_rdata_bi),
361
 
362
        .xport_req_o(dma_xport_req),
363
        .xport_ack_i(dma_xport_ack),
364
        .xport_err_i(dma_xport_err),
365
        .xport_we_o(dma_xport_we),
366
        .xport_addr_bo(dma_xport_addr),
367
        .xport_wdata_bo(dma_xport_wdata),
368
        .xport_resp_i(dma_xport_resp),
369
        .xport_rdata_bi(dma_xport_rdata)
370
);
371
 
372
 
373
PSS_BusBridge BusBridge
374
(
375
        .clk_i(clk_i),
376
        .rst_i(app_reset),
377
 
378
        .xport_busy_i(dma_works),
379
        .xport_busy_o(bb_works),
380
 
381
        .a31_i(a31),
382
 
383
        .bus_enb_i(ext_enb),
384
        .bus_we_i(ext_we),
385
        .bus_addr_bi(ext_addr),
386
        .bus_wdata_bi(ext_wdata),
387
        .bus_writemask_bi(ext_writemask),
388
        .bus_ack_o(ext_ack),
389
        .bus_rdata_bo(ext_rdata),
390
 
391
        // Expansion bus //
392
        .xport_req_o(bb_xport_req),
393
        .xport_ack_i(bb_xport_ack),
394
        .xport_err_i(bb_xport_err),
395
        .xport_we_o(bb_xport_we),
396
        .xport_addr_bo(bb_xport_addr),
397
        .xport_wdata_bo(bb_xport_wdata),
398
        .xport_resp_i(bb_xport_resp),
399
        .xport_rdata_bi(bb_xport_rdata)
400
);
401
 
402
// bus switch
403
always @*
404
        begin
405
 
406
        bb_xport_ack = 1'b0;
407
        bb_xport_err = 1'b0;
408
        bb_xport_resp = 1'b0;
409
        bb_xport_rdata = 32'bx;
410
 
411
        dma_xport_ack = 1'b0;
412
        dma_xport_err = 1'b0;
413
        dma_xport_resp = 1'b0;
414
        dma_xport_rdata = 32'bx;
415
 
416
        if (dma_works == 1'b0)          // switch to bus bridge
417
                begin
418
 
419
                bb_xport_ack = xport_ack_i;
420
                bb_xport_err = xport_err_i;
421
                bb_xport_resp = xport_resp_i;
422
                bb_xport_rdata = xport_rdata_bi;
423
 
424
                xport_req_o = bb_xport_req;
425
                xport_we_o = bb_xport_we;
426
                xport_addr_bo = bb_xport_addr;
427
                xport_wdata_bo = bb_xport_wdata;
428
 
429
                end
430
 
431
        else                                            // switch to dma
432
                begin
433
 
434
                dma_xport_ack = xport_ack_i;
435
                dma_xport_err = xport_err_i;
436
                dma_xport_resp = xport_resp_i;
437
                dma_xport_rdata = xport_rdata_bi;
438
 
439
                xport_req_o = dma_xport_req;
440
                xport_we_o = dma_xport_we;
441
                xport_addr_bo = dma_xport_addr;
442
                xport_wdata_bo = dma_xport_wdata;
443
 
444
                end
445
 
446
        end
447
 
448
endmodule

powered by: WebSVN 2.1.0

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