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 7

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 7 AlexAntono
        parameter EXT_RESET_DEFAULT = 1,
42 5 AlexAntono
        parameter MEM_SIZE_KB = 1
43
)
44
(
45
        input clk_i,
46
 
47
        input  arst_i,
48
        output srst_o,
49
        input  srst_i,
50
        output ext_rst_o,
51
 
52
        input [3:0] INT_bi,
53
        output cpu_ireq_o,
54
        input  cpu_iack_i,
55
 
56
        //// Masters ////
57
        // Debug bus //
58
        input dbg_enb_i,
59
        input dbg_we_i,
60
        input [31:0] dbg_addr_bi,
61
        input [31:0] dbg_wdata_bi,
62
        output dbg_ack_o,
63
        output [31:0] dbg_rdata_bo,
64
 
65
        // ZPU bus //
66
        input cpu_enb_i,
67
        input cpu_we_i,
68
        input [31:0] cpu_wdata_bi,
69
        input [31:0] cpu_addr_bi,
70
        input [3:0] cpu_writemask_bi,
71
        output cpu_ack_o,
72
        output [31:0] cpu_rdata_bo,
73
 
74
        //// Slaves ////
75
        // RAM0 bus //
76
        output [31:0] ram0_addr_bo,
77
        output ram0_we_o,
78
        output [31:0] ram0_wdata_bo,
79
        input [31:0] ram0_rdata_bi,
80
 
81
        // RAM1 bus //
82
        output [31:0] ram1_addr_bo,
83
        output ram1_we_o,
84
        output [31:0] ram1_wdata_bo,
85
        input  [31:0] ram1_rdata_bi,
86
 
87
        // Expansion bus //
88
        output reg xport_req_o,
89
        input  xport_ack_i,
90
        input  xport_err_i,
91
        output reg xport_we_o,
92
        output reg [31:0] xport_addr_bo,
93
        output reg [31:0] xport_wdata_bo,
94
        input xport_resp_i,
95
        input [31:0] xport_rdata_bi,
96
 
97
        input  cpu_present_i,
98
        input  [31:0] cpu_pc_bi,
99
        input  cpu_break_i,
100
        output cpu_reset_o,
101
        output cpu_enb_o
102
);
103
 
104
wire app_reset;
105
assign app_reset = srst_i | srst_o;
106
 
107
pss_reset_cntrl reset_cntrl
108
(
109
        .clk_i(clk_i),
110
        .arst_i(arst_i),
111
        .srst_o(srst_o)
112
);
113
 
114
// interrupts
115
wire [3:0]  INT;
116
wire            bus_error_int;
117
wire            trap_int;
118
wire            sgi_int;
119
wire            dma_int;
120
 
121
wire bus_error;
122
wire [31:0] bus_error_addr;
123
 
124
assign bus_error_int = bus_error;
125
 
126
// INTC programming interface
127
wire            intc_ie;
128
wire            intc_ie_we;
129
wire            intc_ie_data;
130
wire [7:0]  intc_mask;
131
wire [7:0]       intc_pending;
132
wire            intc_clr_cmd;
133
wire [7:0]       intc_clr_code;
134
 
135
pss_edge_detector edge_det0
136
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_bi[0]), .out(INT[0]) );
137
 
138
pss_edge_detector edge_det1
139
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_bi[1]), .out(INT[1]) );
140
 
141
pss_edge_detector edge_det2
142
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_bi[2]), .out(INT[2]) );
143
 
144
pss_edge_detector edge_det3
145
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_bi[3]), .out(INT[3]) );
146
 
147
// Interrupt controller
148
pss_int_controller int_controller
149
(
150
        .clk_i(clk_i),
151
        .rst_i(rst_i),
152
        .interrupt_bi({INT, dma_int, sgi_int, trap_int, bus_error_int}),
153
 
154
        .ie_o(intc_ie),
155
        .ie_we_i(intc_ie_we),
156
        .ie_data_i(intc_ie_data),
157
        .mask_bi(intc_mask),
158
        .pending_bo(intc_pending),
159
        .clr_cmd_i(intc_clr_cmd),
160
        .clr_code_bi(intc_clr_code),
161
 
162
        .cpu_req_o(cpu_ireq_o),
163
        .cpu_ack_i(cpu_iack_i)
164
);
165
 
166
assign cpu_enb_o = 1'b1;
167
 
168
reg trap_enable;
169
reg [31:0] trap_addr;
170
 
171
wire dma_req, dma_cmd, dma_autoinc;
172
wire [31:0] dma_sourceaddr;
173
wire [31:0] dma_destaddr;
174
wire [31:0] dma_size;
175
 
176
wire a31;
177
wire dma_works, bb_works;
178
 
179
////////
180
wire sfr_enb;
181
wire sfr_we;
182
wire [31:0] sfr_wdata;
183
wire [31:0] sfr_addr;
184
wire [3:0] sfr_writemask;
185
wire sfr_ack;
186
wire [31:0] sfr_rdata;
187
 
188
wire ext_enb;
189
wire ext_we;
190
wire [31:0] ext_wdata;
191
wire [31:0] ext_addr;
192
wire [3:0] ext_writemask;
193
wire ext_ack;
194
wire [31:0] ext_rdata;
195
 
196
// RAM0 control //
197
wire ram0_enb;
198
reg ram0_ack, ram0_ack_rd;
199
 
200
always @(posedge clk_i)
201
        begin
202
        if (app_reset == 1'b1) ram0_ack_rd <= 1'b0;
203
        else if ((ram0_enb == 1'b1) && (ram0_we_o == 1'b0) && (ram0_ack_rd == 1'b0)) ram0_ack_rd <= 1'b1;
204
        else ram0_ack_rd <= 1'b0;
205
        end
206
 
207
always @*
208
        begin
209
        if ((ram0_enb == 1'b1) && (ram0_we_o == 1'b1)) ram0_ack = 1'b1;
210
        else ram0_ack = ram0_ack_rd;
211
        end
212
 
213
 
214
PSS_IC
215
#(
216
        .MEM_SIZE_KB(MEM_SIZE_KB)
217
)
218
IC_fabric
219
(
220
        .clk_i(clk_i),
221
        .rst_i(app_reset),
222
 
223
        //// Masters ////
224
        .m0_enb_i(dbg_enb_i),
225
        .m0_we_i(dbg_we_i),
226
        .m0_addr_bi(dbg_addr_bi),
227
        .m0_wdata_bi(dbg_wdata_bi),
228
        .m0_writemask_bi(dbg_writemask_bi),
229
        .m0_ack_o(dbg_ack_o),
230
        .m0_rdata_bo(dbg_rdata_bo),
231
 
232
        .m1_enb_i(cpu_enb_i),
233
        .m1_we_i(cpu_we_i),
234
        .m1_addr_bi(cpu_addr_bi),
235
        .m1_wdata_bi(cpu_wdata_bi),
236
        .m1_writemask_bi(cpu_writemask_bi),
237
        .m1_ack_o(cpu_ack_o),
238
        .m1_rdata_bo(cpu_rdata_bo),
239
 
240
        //// Slaves ////
241
        .s0_enb_o(ram0_enb),
242
        .s0_we_o(ram0_we_o),
243
        .s0_addr_bo(ram0_addr_bo),
244
        .s0_wdata_bo(ram0_wdata_bo),
245
        .s0_writemask_bo(ram0_writemask_bo),
246
        .s0_ack_i(ram0_ack),
247
        .s0_rdata_bi(ram0_rdata_bi),
248
 
249
        .s1_enb_o(sfr_enb),
250
        .s1_we_o(sfr_we),
251
        .s1_addr_bo(sfr_addr),
252
        .s1_wdata_bo(sfr_wdata),
253
        .s1_writemask_bo(sfr_writemask),
254
        .s1_ack_i(sfr_ack),
255
        .s1_rdata_bi(sfr_rdata),
256
 
257
        .s2_enb_o(ext_enb),
258
        .s2_we_o(ext_we),
259
        .s2_addr_bo(ext_addr),
260
        .s2_wdata_bo(ext_wdata),
261
        .s2_writemask_bo(ext_writemask),
262
        .s2_ack_i(ext_ack),
263
        .s2_rdata_bi(ext_rdata),
264
 
265
        .error_o(bus_error),
266
        .error_addr_bo(bus_error_addr)
267
);
268
 
269
 
270
PSS_SFR
271
#(
272
        .CPU_RESET_DEFAULT(CPU_RESET_DEFAULT),
273 7 AlexAntono
        .EXT_RESET_DEFAULT(EXT_RESET_DEFAULT),
274 5 AlexAntono
        .A31_DEFAULT(A31_DEFAULT),
275
        .MEM_SIZE_KB(MEM_SIZE_KB)
276
)
277
SFR
278
(
279
        .clk_i(clk_i),
280
        .rst_i(app_reset),
281
 
282
        .bus_enb_i(sfr_enb),
283
        .bus_we_i(sfr_we),
284
        .bus_wdata_bi(sfr_wdata),
285
        .bus_addr_bi(sfr_addr),
286
        .bus_writemask_bi(sfr_writemask),
287
        .bus_ack_o(sfr_ack),
288
        .bus_rdata_bo(sfr_rdata),
289
 
290
        .cpu_present_i(cpu_present_i),
291
        .cpu_break_i(cpu_break_i),
292
        .cpu_pc_bi(cpu_pc_bi),
293
 
294
        .trap_cpu_enb_i(cpu_enb_i),
295
        .trap_cpu_addr_bi(cpu_addr_bi),
296
 
297
        .cpu_reset_o(cpu_reset_o),
298 7 AlexAntono
        .ext_reset_o(ext_rst_o),
299 5 AlexAntono
        .a31_o(a31),
300
 
301
        .bus_error_i(bus_error),
302
        .bus_error_addr_bi(bus_error_addr),
303
 
304
        .sgi_int_o(sgi_int),
305
        .trap_int_o(trap_int),
306
 
307
        .intc_ie_i(intc_ie),
308
        .intc_pending_bi(intc_pending),
309
        .intc_ie_we_o(intc_ie_we),
310
        .intc_ie_data_o(intc_ie_data),
311
        .intc_mask_bo(intc_mask),
312
        .intc_clr_cmd_o(intc_clr_cmd),
313
        .intc_clr_code_bo(intc_clr_code),
314
 
315
        .dma_req_o(dma_req),
316
        .dma_cmd_o(dma_cmd),
317
        .dma_autoinc_o(dma_autoinc),
318
        .dma_size_bo(dma_size),
319
        .dma_sourceaddr_bo(dma_sourceaddr),
320
        .dma_destaddr_bo(dma_destaddr)
321
);
322
 
323
 
324
wire bb_xport_req;
325
reg  bb_xport_ack;
326
reg  bb_xport_err;
327
wire bb_xport_we;
328
wire [31:0] bb_xport_addr;
329
wire [31:0] bb_xport_wdata;
330
reg  bb_xport_resp;
331
reg [31:0] bb_xport_rdata;
332
 
333
wire dma_xport_req;
334
reg  dma_xport_ack;
335
reg  dma_xport_err;
336
wire dma_xport_we;
337
wire [31:0] dma_xport_addr;
338
wire [31:0] dma_xport_wdata;
339
reg  dma_xport_resp;
340
reg [31:0] dma_xport_rdata;
341
 
342
 
343
PSS_DMA DMA
344
(
345
        .clk_i(clk_i),
346
        .rst_i(app_reset),
347
 
348
        .xport_busy_i(bb_works),
349
        .xport_busy_o(dma_works),
350
 
351
        .dma_int_o(dma_int),
352
 
353
        .dma_req_i(dma_req),
354
        .dma_cmd_i(dma_cmd),
355
        .dma_autoinc_i(dma_autoinc),
356
        .dma_size_bi(REG_DMA_SIZE),
357
        .dma_sourceaddr_bi(REG_DMA_SOURCEADDR),
358
        .dma_destaddr_bi(REG_DMA_DESTADDR),
359
 
360
        .ram_addr_bo(ram1_addr_bo),
361
        .ram_we_o(ram1_we_o),
362
        .ram_wdata_bo(ram1_wdata_bo),
363
        .ram_rdata_bi(ram1_rdata_bi),
364
 
365
        .xport_req_o(dma_xport_req),
366
        .xport_ack_i(dma_xport_ack),
367
        .xport_err_i(dma_xport_err),
368
        .xport_we_o(dma_xport_we),
369
        .xport_addr_bo(dma_xport_addr),
370
        .xport_wdata_bo(dma_xport_wdata),
371
        .xport_resp_i(dma_xport_resp),
372
        .xport_rdata_bi(dma_xport_rdata)
373
);
374
 
375
 
376
PSS_BusBridge BusBridge
377
(
378
        .clk_i(clk_i),
379
        .rst_i(app_reset),
380
 
381
        .xport_busy_i(dma_works),
382
        .xport_busy_o(bb_works),
383
 
384
        .a31_i(a31),
385
 
386
        .bus_enb_i(ext_enb),
387
        .bus_we_i(ext_we),
388
        .bus_addr_bi(ext_addr),
389
        .bus_wdata_bi(ext_wdata),
390
        .bus_writemask_bi(ext_writemask),
391
        .bus_ack_o(ext_ack),
392
        .bus_rdata_bo(ext_rdata),
393
 
394
        // Expansion bus //
395
        .xport_req_o(bb_xport_req),
396
        .xport_ack_i(bb_xport_ack),
397
        .xport_err_i(bb_xport_err),
398
        .xport_we_o(bb_xport_we),
399
        .xport_addr_bo(bb_xport_addr),
400
        .xport_wdata_bo(bb_xport_wdata),
401
        .xport_resp_i(bb_xport_resp),
402
        .xport_rdata_bi(bb_xport_rdata)
403
);
404
 
405
// bus switch
406
always @*
407
        begin
408
 
409
        bb_xport_ack = 1'b0;
410
        bb_xport_err = 1'b0;
411
        bb_xport_resp = 1'b0;
412
        bb_xport_rdata = 32'bx;
413
 
414
        dma_xport_ack = 1'b0;
415
        dma_xport_err = 1'b0;
416
        dma_xport_resp = 1'b0;
417
        dma_xport_rdata = 32'bx;
418
 
419
        if (dma_works == 1'b0)          // switch to bus bridge
420
                begin
421
 
422
                bb_xport_ack = xport_ack_i;
423
                bb_xport_err = xport_err_i;
424
                bb_xport_resp = xport_resp_i;
425
                bb_xport_rdata = xport_rdata_bi;
426
 
427
                xport_req_o = bb_xport_req;
428
                xport_we_o = bb_xport_we;
429
                xport_addr_bo = bb_xport_addr;
430
                xport_wdata_bo = bb_xport_wdata;
431
 
432
                end
433
 
434
        else                                            // switch to dma
435
                begin
436
 
437
                dma_xport_ack = xport_ack_i;
438
                dma_xport_err = xport_err_i;
439
                dma_xport_resp = xport_resp_i;
440
                dma_xport_rdata = xport_rdata_bi;
441
 
442
                xport_req_o = dma_xport_req;
443
                xport_we_o = dma_xport_we;
444
                xport_addr_bo = dma_xport_addr;
445
                xport_wdata_bo = dma_xport_wdata;
446
 
447
                end
448
 
449
        end
450
 
451
endmodule

powered by: WebSVN 2.1.0

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