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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v7/] [rtl/] [common/] [FT64_mpu.v] - Blame information for rev 61

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 60 robfinch
`timescale 1ns / 1ps
2
// ============================================================================
3
//        __
4 61 robfinch
//   \\__/ o\    (C) 2017-2019  Robert Finch, Waterloo
5 60 robfinch
//    \  __ /    All rights reserved.
6
//     \/_//     robfinch<remove>@finitron.ca
7
//       ||
8
//
9
//      FT64_MPU.v
10
//              
11
//
12
// This source file is free software: you can redistribute it and/or modify 
13
// it under the terms of the GNU Lesser General Public License as published 
14
// by the Free Software Foundation, either version 3 of the License, or     
15
// (at your option) any later version.                                      
16
//                                                                          
17
// This source file is distributed in the hope that it will be useful,      
18
// but WITHOUT ANY WARRANTY; without even the implied warranty of           
19
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            
20
// GNU General Public License for more details.                             
21
//                                                                          
22
// You should have received a copy of the GNU General Public License        
23
// along with this program.  If not, see <http://www.gnu.org/licenses/>.    
24
//                                                                          
25
//
26
// ============================================================================
27
//
28
//`define CARD_MEMORY   1'b1
29
 
30
module FT64_mpu(hartid_i,rst_i, clk4x_i, clk_i, tm_clk_i,
31
        pit_clk2, pit_gate2, pit_out2,
32
        irq_o,
33
    i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i17,i18,i19,
34
    i20,i21,i22,i23,i24,i25,i26,i27,i28,
35
        cti_o,bte_o,bok_i,cyc_o,stb_o,ack_i,err_i,we_o,sel_o,adr_o,dat_o,dat_i,
36
        sr_o, cr_o, rb_i);
37
input [63:0] hartid_i;
38
input rst_i;
39
input clk4x_i;
40
input clk_i;
41
input tm_clk_i;
42
input pit_clk2;
43
input pit_gate2;
44
output pit_out2;
45
output [3:0] irq_o;
46
input i1;
47
input i2;
48
input i3;
49
input i4;
50
input i5;
51
input i6;
52
input i7;
53
input i8;
54
input i9;
55
input i10;
56
input i11;
57
input i12;
58
input i13;
59
input i14;
60
input i15;
61
input i16;
62
input i17;
63
input i18;
64
input i19;
65
input i20;
66
input i21;
67
input i22;
68
input i23;
69
input i24;
70
input i25;
71
input i26;
72
input i27;
73
input i28;
74 61 robfinch
output [2:0] cti_o;
75
output [1:0] bte_o;
76 60 robfinch
input bok_i;
77
output cyc_o;
78
output reg stb_o;
79
input ack_i;
80
input err_i;
81
output we_o;
82 61 robfinch
output [7:0] sel_o;
83 60 robfinch
output [31:0] adr_o;
84
output reg [63:0] dat_o;
85
input [63:0] dat_i;
86
output sr_o;
87
output cr_o;
88
input rb_i;
89
 
90
wire [3:0] cti;
91
wire [2:0] bte;
92
wire cyc,stb,we;
93
wire [7:0] sel;
94 61 robfinch
(* mark_debug="true" *)
95 60 robfinch
wire [63:0] adr;
96
reg [63:0] dati;
97
wire [63:0] dato;
98
wire [3:0] irq;
99
wire [7:0] cause;
100
wire pic_ack;
101
wire [31:0] pic_dato;
102
wire pit_ack;
103
wire [31:0] pit_dato;
104
wire pit_out0, pit_out1;
105
wire crd_ack;
106
wire [63:0] crd_dato;
107
reg ack;
108
wire [63:0] ipt_dato;
109
wire ipt_ack;
110
wire [1:0] ol;
111
wire [31:0] pcr;
112
wire [63:0] pcr2;
113
wire icl;           // instruction cache load
114
wire exv,rdv,wrv;
115
wire pulse60;
116
wire sptr_o;
117
wire [63:0] pkeys;
118
 
119
//always @(posedge clk_i)
120
//      cyc_o <= cyc;
121
always @(posedge clk_i)
122
        stb_o <= stb;
123
//always @(posedge clk_i)
124
//      we_o <= we;
125
//always @(posedge clk_i)
126
//      adr_o <= adr;
127
always @(posedge clk_i)
128
        dat_o <= dato;
129
 
130
wire cs_pit = adr[31:8]==24'hFFDC11;
131
wire cs_ipt = adr[31:8]==24'hFFDCD0;
132
`ifdef CARD_MEMORY
133
wire cs_crd = adr[31:11]==21'd0;        // $00000000 in virtual address space
134
`else
135
wire cs_crd = 1'b0;
136
`endif
137
 
138
// Need to recreate the a2 address bit for 32 bit peripherals.
139
wire [31:0] adr32 = {adr[31:3],|sel[7:4],2'b00};
140
wire [31:0] dat32 = |sel[7:4] ? dato[63:32] : dato[31:0];
141
 
142
FT64_pit upit1
143
(
144
        .rst_i(rst_i),
145
        .clk_i(clk_i),
146
        .cs_i(cs_pit),
147
        .cyc_i(cyc_o),
148
        .stb_i(stb_o),
149
        .ack_o(pit_ack),
150
        .sel_i(sel_o[7:4]|sel_o[3:0]),
151
        .we_i(we_o),
152
        .adr_i(adr32[5:0]),
153
        .dat_i(dat32),
154
        .dat_o(pit_dato),
155
        .clk0(1'b0),
156
        .gate0(1'b0),
157
        .out0(pit_out0),
158
        .clk1(1'b0),
159
        .gate1(1'b0),
160
        .out1(pit_out1),
161
        .clk2(1'b0),
162
        .gate2(1'b0),
163
        .out2(pit_out2)
164
);
165
 
166
FT64_pic upic1
167
(
168
        .rst_i(rst_i),          // reset
169
        .clk_i(clk_i),          // system clock
170
        .cyc_i(cyc_o),
171
        .stb_i(stb_o),
172
        .ack_o(pic_ack),    // controller is ready
173
        .wr_i(we_o),            // write
174
        .adr_i(adr32),          // address
175
        .dat_i(dat32),
176
        .dat_o(pic_dato),
177
        .vol_o(),                       // volatile register selected
178
        .i1(i1),
179
        .i2(i2),
180
        .i3(i3),
181
        .i4(i4),
182
        .i5(i5),
183
        .i6(i6),
184
        .i7(i7),
185
        .i8(i8),
186
        .i9(i9),
187
        .i10(i10),
188
        .i11(i11),
189
        .i12(i12),
190
        .i13(i13),
191
        .i14(i14),
192
        .i15(i15),
193
        .i16(i16),
194
        .i17(i17),
195
        .i18(i18),
196
        .i19(i19),
197
        .i20(i20),
198
        .i21(i21),
199
        .i22(i22),
200
        .i23(i23),
201
        .i24(i24),
202
        .i25(i25),
203
        .i26(i26),
204
        .i27(i27),
205
        .i28(i28),
206
        .i29(pit_out2), // garbage collector stop interrupt
207
        .i30(pit_out1), // garbage collector interrupt
208
        .i31(pit_out0), // time slice interrupt
209
        .irqo(irq),
210
        .nmii(1'b0),
211
        .nmio(),
212
        .causeo(cause)
213
);
214
 
215
assign irq_o = irq;
216
 
217
`ifdef CARD_MEMORY
218
CardMemory ucrd1
219
(
220
        .clk_i(clk_i),
221
        .cs_i(cs_crd & cyc_o & stb_o),
222
        .ack_o(crd_ack),
223
        .wr_i(we_o),
224
        .adr_i(adr),
225
        .dat_i(dato),
226
        .dat_o(crd_dato),
227
        .stp(1'b0),
228
        .mapno(pcr[5:0])
229
);
230
`else
231
assign crd_dato = 64'd0;
232
assign crd_ack = 1'b0;
233
`endif
234
 
235
FT64_ipt uipt1
236
(
237
        .rst(rst_i),
238
        .clk(clk_i),
239
        .pkeys_i(pkeys),
240
        .ol_i(ol),
241 61 robfinch
        .bte_i(bte),
242 60 robfinch
        .cti_i(cti),
243
        .cs_i(cs_ipt),
244
        .icl_i(icl),
245
        .cyc_i(cyc),
246
        .stb_i(stb),
247
        .ack_o(ipt_ack),
248
        .we_i(we),
249
        .sel_i(sel),
250
        .vadr_i(adr),
251
        .dat_i(dato),
252
        .dat_o(ipt_dato),
253 61 robfinch
        .bte_o(bte_o),
254
        .cti_o(cti_o),
255 60 robfinch
        .cyc_o(cyc_o),
256
        .ack_i(ack),
257
        .we_o(we_o),
258 61 robfinch
        .sel_o(sel_o),
259 60 robfinch
        .padr_o(adr_o),
260
        .exv_o(exv),
261
        .rdv_o(rdv),
262
        .wrv_o(wrv)
263
);
264
 
265
always @(posedge clk_i)
266 61 robfinch
casez({pic_ack,pit_ack,crd_ack,cs_ipt,ack_i})
267
5'b1????:       dati <= {2{pic_dato}};
268
5'b01???:       dati <= {2{pit_dato}};
269
5'b001??:       dati <= crd_dato;
270
5'b0001?:       dati <= ipt_dato;
271
5'b00001:       dati <= dat_i;
272
default:  dati <= dati;
273 60 robfinch
endcase
274
 
275
always @(posedge clk_i)
276
        ack <= ack_i|pic_ack|pit_ack|crd_ack|ipt_ack;
277
 
278
FT64 ucpu1
279
(
280
    .hartid(hartid_i),
281
    .rst(rst_i),
282
    .clk_i(clk_i),
283
    .clk4x(clk4x_i),
284
    .tm_clk_i(tm_clk_i),
285
    .irq_i(irq),
286
    .vec_i(cause),
287
    .cti_o(cti),
288
    .bte_o(bte),
289
    .bok_i(bok_i),
290
    .cyc_o(cyc),
291
    .stb_o(stb),
292
    .ack_i(ack),
293
    .err_i(err_i),
294
    .we_o(we),
295
    .sel_o(sel),
296
    .adr_o(adr),
297
    .dat_o(dato),
298
    .dat_i(dati),
299
    .ol_o(ol),
300
    .pcr_o(pcr),
301
    .pcr2_o(pcr2),
302
    .pkeys_o(pkeys),
303
    .icl_o(icl),
304
    .sr_o(sr_o),
305
    .cr_o(cr_o),
306
    .rbi_i(rb_i)
307
);
308
 
309
endmodule

powered by: WebSVN 2.1.0

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