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

Subversion Repositories pss

[/] [pss/] [trunk/] [pss/] [hdl/] [pss/] [zpu_uc/] [zpu_uc.v] - Blame information for rev 2

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

Line No. Rev Author Line
1 2 AlexAntono
/*
2
 PSS
3
 
4
 Copyright (c) 2016 Alexander Antonov <153287@niuitmo.ru>
5
 All rights reserved.
6
 
7
 Version 0.9
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 ZPU_uC
38
#(
39
        parameter CPU_PRESENT = 1,
40
        parameter CPU_RESET_DEFAULT = 1,
41
        parameter A31_DEFAULTS = 1,
42
        parameter MEM_DATA = "data.bin",
43
        parameter MEM_SIZE_KB = 1
44
)
45
(
46
        input clk_i, rst_i,
47
        input [3:0] INT_i,
48
 
49
        // Expansion bus
50
        output xport_req_o,
51
        input  xport_ack_i,
52
        input  xport_err_i,
53
        output xport_we_o,
54
        output [31:0] xport_addr_bo,
55
        output [31:0] xport_wdata_bo,
56
        input  xport_resp_i,
57
        input  [31:0] xport_rdata_bi,
58
 
59
        //Debug interface
60
        input  dbg_enb_i,
61
        input  dbg_wr_i,
62
        input  [31:0] dbg_addr_bi,
63
        input  [31:0] dbg_data_bi,
64
        output dbg_resp_o,
65
        output [31:0] dbg_data_bo
66
);
67
 
68
// ZPU system bus
69
wire            cpu_bus_enb;
70
wire            cpu_bus_we;
71
wire            cpu_bus_ack;
72
wire [31:0] cpu_bus_read;
73
wire [31:0] cpu_bus_write;
74
wire [31:0] cpu_bus_addr;
75
wire [3:0]  cpu_bus_writemask;
76
 
77
// MAU-RAM bus
78
wire [31:0] ram0_bus_addr;
79
wire            ram0_bus_we;
80
wire [31:0] ram0_bus_rddata;
81
wire [31:0] ram0_bus_wrdata;
82
 
83
wire [31:0] ram1_bus_addr;
84
wire            ram1_bus_we;
85
wire [31:0] ram1_bus_rddata;
86
wire [31:0] ram1_bus_wrdata;
87
 
88
// ZPU control
89
wire cpu_present;
90
wire [63:0] zpu_status;
91
wire cpu_break;
92
wire [31:0] cpu_pc;
93
 
94
wire            cpu_interrupt;
95
wire            cpu_interrupt_ack;
96
wire            cpu_reset;
97
wire            cpu_enb;
98
 
99
// INTC programming interface
100
wire            intc_ie;
101
wire            intc_ie_we;
102
wire            intc_ie_data;
103
wire [7:0]  intc_mask;
104
wire [7:0]       intc_pending;
105
wire            intc_clr_cmd;
106
wire [7:0]       intc_clr_code;
107
 
108
// interrupts
109
wire [3:0]  INT;
110
wire            bus_error_int;
111
wire            trap_int;
112
wire            sgi_int;
113
wire            dma_int;
114
 
115
generate
116
        if (CPU_PRESENT == 1)
117
 
118
// Processor core
119
zpu_core
120
#(
121
        .stack_address((MEM_SIZE_KB * 1024) - 8)
122
)
123
zpu_core
124
(
125
        .clk(clk_i),
126
        .sreset(rst_i | cpu_reset),
127
        .enable(cpu_enb),
128
        .cpu_present(cpu_present),
129
        .pc_bo(cpu_pc),
130
 
131
        .mem_req(cpu_bus_enb),
132
        .mem_we(cpu_bus_we),
133
        .mem_ack(cpu_bus_ack),
134
        .mem_read(cpu_bus_read),
135
        .mem_write(cpu_bus_write),
136
        .out_mem_addr(cpu_bus_addr),
137
        .mem_writeMask(cpu_bus_writemask),
138
 
139
        .interrupt(cpu_interrupt),
140
        .interrupt_ack(cpu_interrupt_ack),
141
        .break_o(cpu_break),
142
        .zpu_status(zpu_status)
143
);
144
 
145
        else
146
 
147
zpu_core_stub zpu_core
148
(
149
        .clk(clk_i),
150
        .sreset(rst_i | cpu_reset),
151
        .enable(cpu_enb),
152
        .cpu_present(cpu_present),
153
        .pc_bo(cpu_pc),
154
 
155
        .mem_req(cpu_bus_enb),
156
        .mem_we(cpu_bus_we),
157
        .mem_ack(cpu_bus_ack),
158
        .mem_read(cpu_bus_read),
159
        .mem_write(cpu_bus_write),
160
        .out_mem_addr(cpu_bus_addr),
161
        .mem_writeMask(cpu_bus_writemask),
162
 
163
        .interrupt(cpu_interrupt),
164
        .interrupt_ack(cpu_interrupt_ack),
165
        .break_o(cpu_break),
166
        .zpu_status(zpu_status)
167
);
168
 
169
endgenerate
170
 
171
edge_detector edge_det0
172
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_i[0]), .out(INT[0]) );
173
 
174
edge_detector edge_det1
175
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_i[1]), .out(INT[1]) );
176
 
177
edge_detector edge_det2
178
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_i[2]), .out(INT[2]) );
179
 
180
edge_detector edge_det3
181
( .clk_i(clk_i), .rst_i(rst_i), .in(INT_i[3]), .out(INT[3]) );
182
 
183
// Interrupt controller
184
int_controller int_controller
185
(
186
        .clk_i(clk_i),
187
        .rst_i(rst_i),
188
        .interrupt_bi({INT, dma_int, sgi_int, trap_int, bus_error_int}),
189
 
190
        .ie_o(intc_ie),
191
        .ie_we_i(intc_ie_we),
192
        .ie_data_i(intc_ie_data),
193
        .mask_bi(intc_mask),
194
        .pending_bo(intc_pending),
195
        .clr_cmd_i(intc_clr_cmd),
196
        .clr_code_bi(intc_clr_code),
197
 
198
        .cpu_req_o(cpu_interrupt),
199
        .cpu_ack_i(cpu_interrupt_ack)
200
);
201
 
202
ZPU_uC_SystemController
203
#(
204
        .A31_DEFAULTS(A31_DEFAULTS),
205
        .CPU_RESET_DEFAULT(CPU_RESET_DEFAULT),
206
        .MEM_SIZE_KB(MEM_SIZE_KB)
207
)
208
SystemController
209
(
210
        .clk_i(clk_i),
211
        .rst_i(rst_i),
212
 
213
        //// Masters ////
214
        // Debug bus //
215
        .dbg_enb_i(dbg_enb_i),
216
        .dbg_we_i(dbg_wr_i),
217
        .dbg_addr_bi(dbg_addr_bi),
218
        .dbg_wdata_bi(dbg_data_bi),
219
        .dbg_ack_o(dbg_resp_o),
220
        .dbg_rdata_bo(dbg_data_bo),
221
 
222
        // ZPU bus //
223
        .cpu_enb_i(cpu_bus_enb),
224
        .cpu_we_i(cpu_bus_we),
225
        .cpu_ack_o(cpu_bus_ack),
226
        .cpu_rdata_bo(cpu_bus_read),
227
        .cpu_wdata_bi(cpu_bus_write),
228
        .cpu_addr_bi(cpu_bus_addr),
229
        .cpu_writemask_bi(cpu_bus_writemask),
230
 
231
        //// Slaves ////
232
        // RAM0 bus //
233
        .ram0_addr_bo(ram0_bus_addr),
234
        .ram0_we_o(ram0_bus_we),
235
        .ram0_wdata_bo(ram0_bus_wrdata),
236
        .ram0_rdata_bi(ram0_bus_rddata),
237
 
238
        // RAM1 bus //
239
        .ram1_addr_bo(ram1_bus_addr),
240
        .ram1_we_o(ram1_bus_we),
241
        .ram1_wdata_bo(ram1_bus_wrdata),
242
        .ram1_rdata_bi(ram1_bus_rddata),
243
 
244
        // Expansion port //
245
        .xport_req_o(xport_req_o),
246
        .xport_ack_i(xport_ack_i),
247
        .xport_err_i(xport_err_i),
248
        .xport_we_o(xport_we_o),
249
        .xport_addr_bo(xport_addr_bo),
250
        .xport_wdata_bo(xport_wdata_bo),
251
        .xport_resp_i(xport_resp_i),
252
        .xport_rdata_bi(xport_rdata_bi),
253
 
254
        // INTC bus //
255
        .intc_ie_i(intc_ie),
256
        .intc_ie_we_o(intc_ie_we),
257
        .intc_ie_data_o(intc_ie_data),
258
        .intc_mask_bo(intc_mask),
259
        .intc_pending_bi(intc_pending),
260
        .intc_clr_cmd_o(intc_clr_cmd),
261
        .intc_clr_code_bo(intc_clr_code),
262
 
263
        .cpu_present(cpu_present),
264
        .cpu_pc_bi(cpu_pc),
265
        .cpu_break_i(cpu_break),
266
        .cpu_reset_o(cpu_reset),
267
        .cpu_enb_o(cpu_enb),
268
 
269
        .bus_error_int_o(bus_error_int),
270
        .trap_int_o(trap_int),
271
        .dma_int_o(dma_int),
272
        .sgi_int_o(sgi_int)
273
);
274
 
275
ram_dual
276
#(
277
        .mem_data(MEM_DATA),
278
        .dat_width(32),
279
        .adr_width(32),
280
        .mem_size((MEM_SIZE_KB * 1024) / 4 )
281
)
282
ram_dual_port
283
(
284
        .clk(clk_i),
285
 
286
        .dat0_i(ram0_bus_wrdata),
287
    .adr0_i({2'h0, ram0_bus_addr[31:2]}),
288
    .we0_i(ram0_bus_we),
289
    .dat0_o(ram0_bus_rddata),
290
 
291
    .dat1_i(ram1_bus_wrdata),
292
    .adr1_i({2'h0, ram1_bus_addr[31:2]}),
293
    .we1_i(ram1_bus_we),
294
    .dat1_o(ram1_bus_rddata)
295
);
296
 
297
endmodule

powered by: WebSVN 2.1.0

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