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

Subversion Repositories thor

[/] [thor/] [trunk/] [FT64v5/] [rtl/] [common/] [FT64_mpu.v] - Blame information for rev 55

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 robfinch
`timescale 1ns / 1ps
2
// ============================================================================
3
//        __
4
//   \\__/ o\    (C) 2017-2018  Robert Finch, Waterloo
5
//    \  __ /    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
module FT64_mpu(hartid_i,rst_i, clk4x_i, clk_i, tm_clk_i,
29
        pit_clk2, pit_gate2, pit_out2,
30
        irq_o,
31
    i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i17,i18,i19,
32
    i20,i21,i22,i23,i24,i25,i26,i27,i28,i29,
33
        cti_o,bte_o,cyc_o,stb_o,ack_i,err_i,we_o,sel_o,adr_o,dat_o,dat_i,
34
        sr_o, cr_o, rb_i);
35
input [63:0] hartid_i;
36
input rst_i;
37
input clk4x_i;
38
input clk_i;
39
input tm_clk_i;
40
input pit_clk2;
41
input pit_gate2;
42
output pit_out2;
43 55 robfinch
output [3:0] irq_o;
44 48 robfinch
input i1;
45
input i2;
46
input i3;
47
input i4;
48
input i5;
49
input i6;
50
input i7;
51
input i8;
52
input i9;
53
input i10;
54
input i11;
55
input i12;
56
input i13;
57
input i14;
58
input i15;
59
input i16;
60
input i17;
61
input i18;
62
input i19;
63
input i20;
64
input i21;
65
input i22;
66
input i23;
67
input i24;
68
input i25;
69
input i26;
70
input i27;
71
input i28;
72
input i29;
73
output [2:0] cti_o;
74
output [1:0] bte_o;
75
output cyc_o;
76
output stb_o;
77
input ack_i;
78
input err_i;
79
output we_o;
80
output [7:0] sel_o;
81
output [31:0] adr_o;
82
output [63:0] dat_o;
83
input [63:0] dat_i;
84
output sr_o;
85
output cr_o;
86
input rb_i;
87
 
88
wire cyc,stb,we;
89
wire [31:0] adr;
90
reg [63:0] dati;
91 49 robfinch
wire [3:0] irq;
92 52 robfinch
wire [7:0] cause;
93 48 robfinch
wire mmu_ack;
94
wire [31:0] mmu_dato;
95
wire pic_ack;
96
wire [31:0] pic_dato;
97
wire pit_ack;
98
wire [31:0] pit_dato;
99
wire pit_out0, pit_out1;
100
wire crd_ack;
101
wire [63:0] crd_dato;
102
wire ack;
103 55 robfinch
wire [1:0] ol;
104 48 robfinch
wire [31:0] pcr;
105
wire [63:0] pcr2;
106
wire icl;           // instruction cache load
107
wire exv,rdv,wrv;
108
wire pulse60;
109
wire sptr_o;
110
 
111
wire cs_pit = adr[31:8]==24'hFFDC11;
112
wire cs_crd = adr[31:11]==21'd0;        // $00000000 in virtual address space
113
 
114 51 robfinch
// Need to recreate the a2 address bit for 32 bit peripherals.
115
wire [31:0] adr32 = {adr[31:3],|sel_o[7:4],2'b00};
116
wire [31:0] dat32 = |sel_o[7:4] ? dat_o[63:32] : dat_o[31:0];
117
 
118 48 robfinch
FT64_pit upit1
119
(
120
        .rst_i(rst_i),
121
        .clk_i(clk_i),
122
        .cs_i(cs_pit),
123
        .cyc_i(cyc),
124
        .stb_i(stb),
125
        .ack_o(pit_ack),
126
        .sel_i(sel_o[7:4]|sel_o[3:0]),
127
        .we_i(we_o),
128 51 robfinch
        .adr_i(adr32[5:0]),
129
        .dat_i(dat32),
130 48 robfinch
        .dat_o(pit_dato),
131
        .clk0(1'b0),
132
        .gate0(1'b0),
133
        .out0(pit_out0),
134
        .clk1(1'b0),
135
        .gate1(1'b0),
136
        .out1(pit_out1),
137
        .clk2(1'b0),
138
        .gate2(1'b0),
139
        .out2(pit_out2)
140
);
141
 
142
FT64_pic upic1
143
(
144
        .rst_i(rst_i),          // reset
145
        .clk_i(clk_i),          // system clock
146
        .cyc_i(cyc),
147
        .stb_i(stb),
148
        .ack_o(pic_ack),    // controller is ready
149
        .wr_i(we_o),            // write
150 51 robfinch
        .adr_i(adr32),          // address
151
        .dat_i(dat32),
152 48 robfinch
        .dat_o(pic_dato),
153
        .vol_o(),                       // volatile register selected
154
        .i1(i1),
155
        .i2(i2),
156
        .i3(i3),
157
        .i4(i4),
158
        .i5(i5),
159
        .i6(i6),
160
        .i7(i7),
161
        .i8(i8),
162
        .i9(i9),
163
        .i10(i10),
164
        .i11(i11),
165
        .i12(i12),
166
        .i13(i13),
167
        .i14(i14),
168
        .i15(i15),
169
        .i16(i16),
170
        .i17(i17),
171
        .i18(i18),
172
        .i19(i19),
173
        .i20(i20),
174
        .i21(i21),
175
        .i22(i22),
176
        .i23(i23),
177
        .i24(i24),
178
        .i25(i25),
179
        .i26(i26),
180
        .i27(i27),
181
        .i28(i28),
182
        .i29(pit_out2), // garbage collector stop interrupt
183
        .i30(pit_out1), // garbage collector interrupt
184
        .i31(pit_out0), // time slice interrupt
185
        .irqo(irq),
186
        .nmii(1'b0),
187
        .nmio(),
188
        .causeo(cause)
189
);
190
 
191
assign irq_o = irq;
192
 
193
FT64_mmu ummu1
194
(
195 50 robfinch
        .rst_i(rst_i),
196
        .clk_i(clk_i),
197
        .ol_i(ol),
198
        .pcr_i(pcr),
199
        .pcr2_i(pcr2),
200
        .mapen_i(pcr[31]),
201
        .s_ex_i(icl),
202
        .s_cyc_i(cyc),
203
        .s_stb_i(stb),
204
        .s_ack_o(mmu_ack),
205
        .s_wr_i(we_o),
206 51 robfinch
        .s_adr_i(adr32),
207
        .s_dat_i(dat32),
208 50 robfinch
        .s_dat_o(mmu_dato),
209
        .cyc_o(cyc_o),
210
        .stb_o(stb_o),
211
        .pea_o(adr_o),
212
        .exv_o(exv),
213
        .rdv_o(rdv),
214
        .wrv_o(wrv)
215 48 robfinch
);
216
 
217
CardMemory ucrd1
218
(
219
        .clk_i(clk_i),
220 49 robfinch
        .cs_i(cs_crd & cyc_o & stb_o),
221 48 robfinch
        .ack_o(crd_ack),
222
        .wr_i(we_o),
223
        .adr_i(adr),
224
        .dat_i(dat_o),
225
        .dat_o(crd_dato),
226
        .stp(1'b0),
227
        .mapno(pcr[5:0])
228
);
229
 
230
 
231
always @*
232
casez({mmu_ack,pic_ack,pit_ack,crd_ack})
233
4'b1???:    dati <= {2{mmu_dato}};
234
4'b01??:        dati <= {2{pic_dato}};
235
4'b001?:        dati <= {2{pit_dato}};
236
4'b0001:        dati <= crd_dato;
237
default:    dati <= dat_i;
238
endcase
239
 
240 51 robfinch
assign ack = ack_i|mmu_ack|pic_ack|pit_ack|crd_ack;
241 48 robfinch
 
242
FT64 ucpu1
243
(
244
    .hartid(hartid_i),
245
    .rst(rst_i),
246
    .clk_i(clk_i),
247
    .clk4x(clk4x_i),
248
    .tm_clk_i(tm_clk_i),
249
    .irq_i(irq),
250
    .vec_i(cause),
251
    .cti_o(cti_o),
252
    .bte_o(bte_o),
253
    .cyc_o(cyc),
254
    .stb_o(stb),
255
    .ack_i(ack),
256
    .err_i(err_i),
257
    .we_o(we_o),
258
    .sel_o(sel_o),
259
    .adr_o(adr),
260
    .dat_o(dat_o),
261
    .dat_i(dati),
262
    .ol_o(ol),
263
    .pcr_o(pcr),
264
    .pcr2_o(pcr2),
265
    .icl_o(icl),
266
    .exv_i(exv),
267
    .rdv_i(rdv),
268
    .wrv_i(wrv),
269
    .sr_o(sr_o),
270
    .cr_o(cr_o),
271
    .rbi_i(rb_i)
272
);
273
 
274
endmodule

powered by: WebSVN 2.1.0

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