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

Subversion Repositories rtf65002

[/] [rtf65002/] [trunk/] [rtl/] [verilog/] [rtf65002d.v] - Blame information for rev 30

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

Line No. Rev Author Line
1 10 robfinch
`timescale 1ns / 1ps
2
// ============================================================================
3
//        __
4
//   \\__/ o\    (C) 2013  Robert Finch, Stratford
5
//    \  __ /    All rights reserved.
6
//     \/_//     robfinch<remove>@opencores.org
7
//       ||
8
//
9
// rtf65002.v
10
//  - 32 bit CPU
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 30 robfinch
`include "rtf65002_defines.v"
28 5 robfinch
 
29 21 robfinch
module rtf65002d(rst_md, rst_i, clk_i, nmi_i, irq_i, irq_vect, bte_o, cti_o, bl_o, lock_o, cyc_o, stb_o, ack_i, err_i, we_o, sel_o, adr_o, dat_i, dat_o);
30 5 robfinch
parameter IDLE = 3'd0;
31
parameter LOAD_DCACHE = 3'd1;
32
parameter LOAD_ICACHE = 3'd2;
33
parameter LOAD_IBUF1 = 3'd3;
34
parameter LOAD_IBUF2 = 3'd4;
35
parameter LOAD_IBUF3 = 3'd5;
36 30 robfinch
parameter RESET1 = 6'd0;
37
parameter IFETCH = 6'd1;
38
parameter DECODE = 6'd2;
39
parameter STORE1 = 6'd3;
40
parameter STORE2 = 6'd4;
41
parameter IRQ0 = 6'd5;
42
parameter IRQ1 = 6'd6;
43
parameter IRQ2 = 6'd7;
44
parameter IRQ3 = 6'd8;
45
parameter CALC = 6'd9;
46
parameter JSR_INDX1 = 6'd10;
47
parameter JSR161 = 6'd11;
48
parameter RTS1 = 6'd12;
49
parameter IY3 = 6'd13;
50
parameter BSR1 = 6'd14;
51
parameter BYTE_IX5 = 6'd15;
52
parameter BYTE_IY5 = 6'd16;
53
parameter BYTE_JSR1 = 6'd17;
54
parameter BYTE_JSR2 = 6'd18;
55
parameter BYTE_JSR3 = 6'd19;
56
parameter BYTE_IRQ1 = 6'd20;
57
parameter BYTE_IRQ2 = 6'd21;
58
parameter BYTE_IRQ3 = 6'd22;
59
parameter BYTE_IRQ4 = 6'd23;
60
parameter BYTE_IRQ5 = 6'd24;
61
parameter BYTE_IRQ6 = 6'd25;
62
parameter BYTE_IRQ7 = 6'd26;
63
parameter BYTE_IRQ8 = 6'd27;
64
parameter BYTE_IRQ9 = 6'd28;
65
parameter BYTE_JSR_INDX1 = 6'd29;
66
parameter BYTE_JSR_INDX2 = 6'd30;
67
parameter BYTE_JSR_INDX3 = 6'd31;
68
parameter BYTE_JSL1 = 6'd32;
69
parameter BYTE_JSL2 = 6'd33;
70
parameter BYTE_JSL3 = 6'd34;
71
parameter BYTE_JSL4 = 6'd35;
72
parameter BYTE_JSL5 = 6'd36;
73
parameter BYTE_JSL6 = 6'd37;
74
parameter BYTE_JSL7 = 6'd38;
75
parameter BYTE_PLP1 = 6'd39;
76
parameter BYTE_PLP2 = 6'd40;
77
parameter BYTE_PLA1 = 6'd41;
78
parameter BYTE_PLA2 = 6'd42;
79
parameter WAIT_DHIT = 6'd43;
80
parameter RESET2 = 6'd44;
81
parameter MULDIV1 = 6'd45;
82
parameter MULDIV2 = 6'd46;
83
parameter BYTE_DECODE = 6'd47;
84
parameter BYTE_CALC = 6'd48;
85
parameter BUS_ERROR = 6'd49;
86
parameter INSN_BUS_ERROR = 6'd50;
87
parameter LOAD_MAC1 = 6'd51;
88
parameter LOAD_MAC2 = 6'd52;
89
parameter MVN1 = 6'd53;
90
parameter MVN2 = 6'd54;
91
parameter MVN3 = 6'd55;
92
parameter MVP1 = 6'd56;
93
parameter MVP2 = 6'd57;
94
parameter STS1 = 6'd58;
95 5 robfinch
 
96 21 robfinch
input rst_md;           // reset mode, 1=emulation mode, 0=native mode
97 5 robfinch
input rst_i;
98
input clk_i;
99
input nmi_i;
100
input irq_i;
101 13 robfinch
input [8:0] irq_vect;
102 5 robfinch
output reg [1:0] bte_o;
103
output reg [2:0] cti_o;
104
output reg [5:0] bl_o;
105
output reg lock_o;
106
output reg cyc_o;
107
output reg stb_o;
108
input ack_i;
109 21 robfinch
input err_i;
110 5 robfinch
output reg we_o;
111
output reg [3:0] sel_o;
112
output reg [33:0] adr_o;
113
input [31:0] dat_i;
114
output reg [31:0] dat_o;
115
 
116 30 robfinch
reg [5:0] state;
117
reg [5:0] retstate;
118 5 robfinch
reg [2:0] cstate;
119 21 robfinch
wire [63:0] insn;
120
reg [63:0] ibuf;
121 5 robfinch
reg [31:0] bufadr;
122 25 robfinch
reg [63:0] exbuf;
123 5 robfinch
 
124
reg cf,nf,zf,vf,bf,im,df,em;
125
reg em1;
126 10 robfinch
reg gie;
127 25 robfinch
reg hwi;        // hardware interrupt indicator
128 5 robfinch
reg nmoi;       // native mode on interrupt
129
wire [31:0] sr = {nf,vf,em,24'b0,bf,df,im,zf,cf};
130
wire [7:0] sr8 = {nf,vf,1'b0,bf,df,im,zf,cf};
131
reg nmi1,nmi_edge;
132
reg wai;
133
reg [31:0] acc;
134
reg [31:0] x;
135
reg [31:0] y;
136
reg [7:0] sp;
137 13 robfinch
reg [31:0] spage;        // stack page
138 5 robfinch
wire [7:0] acc8 = acc[7:0];
139
wire [7:0] x8 = x[7:0];
140
wire [7:0] y8 = y[7:0];
141
reg [31:0] isp;          // interrupt stack pointer
142 12 robfinch
wire [63:0] prod;
143
wire [31:0] q,r;
144
reg [31:0] tick;
145 5 robfinch
wire [7:0] sp_dec = sp - 8'd1;
146
wire [7:0] sp_inc = sp + 8'd1;
147
wire [31:0] isp_dec = isp - 32'd1;
148
wire [31:0] isp_inc = isp + 32'd1;
149 25 robfinch
reg [3:0] suppress_pcinc;
150 5 robfinch
reg [31:0] pc;
151 23 robfinch
reg [31:0] opc;
152 30 robfinch
wire [3:0] pc_inc;
153
wire [31:0] pcp2 = pc + (32'd2 & suppress_pcinc);        // for branches
154
wire [31:0] pcp4 = pc + (32'd4 & suppress_pcinc);        // for branches
155
wire [31:0] pcp8 = pc + 32'd8;                                           // cache controller needs this
156 13 robfinch
reg [31:0] abs8; // 8 bit mode absolute address register
157
reg [31:0] vbr;          // vector table base register
158 5 robfinch
wire bhit=pc==bufadr;
159
reg [31:0] regfile [15:0];
160 21 robfinch
reg [63:0] ir;
161 5 robfinch
wire [3:0] Ra = ir[11:8];
162
wire [3:0] Rb = ir[15:12];
163
reg [31:0] rfoa;
164
reg [31:0] rfob;
165
always @(Ra or x or y or acc)
166
case(Ra)
167
4'h0:   rfoa <= 32'd0;
168
4'h1:   rfoa <= acc;
169
4'h2:   rfoa <= x;
170
4'h3:   rfoa <= y;
171
default:        rfoa <= regfile[Ra];
172
endcase
173
always @(Rb or x or y or acc)
174
case(Rb)
175
4'h0:   rfob <= 32'd0;
176
4'h1:   rfob <= acc;
177
4'h2:   rfob <= x;
178
4'h3:   rfob <= y;
179
default:        rfob <= regfile[Rb];
180
endcase
181
reg [3:0] Rt;
182
reg [33:0] ea;
183
reg first_ifetch;
184 12 robfinch
reg [31:0] lfsr;
185
wire lfsr_fb;
186
xnor(lfsr_fb,lfsr[0],lfsr[1],lfsr[21],lfsr[31]);
187 5 robfinch
reg [31:0] a, b;
188 30 robfinch
`ifdef SUPPORT_SHIFT
189 19 robfinch
wire [31:0] shlo = a << b[4:0];
190
wire [31:0] shro = a >> b[4:0];
191 30 robfinch
`else
192
wire [31:0] shlo = 32'd0;
193
wire [31:0] shro = 32'd0;
194
`endif
195 5 robfinch
reg [7:0] b8;
196
reg [32:0] res;
197
reg [8:0] res8;
198
wire resv8,resv32;
199
wire resc8 = res8[8];
200
wire resc32 = res[32];
201
wire resz8 = res8[7:0]==8'h00;
202
wire resz32 = res[31:0]==32'd0;
203
wire resn8 = res8[7];
204
wire resn32 = res[31];
205
 
206
reg [31:0] vect;
207
reg [31:0] ia;                   // temporary reg to hold indirect address
208 20 robfinch
wire [31:0] iapy8 = abs8 + ia + y[7:0];
209 5 robfinch
reg isInsnCacheLoad;
210
reg isDataCacheLoad;
211 10 robfinch
reg isCacheReset;
212 5 robfinch
wire hit0,hit1;
213 30 robfinch
`ifdef SUPPORT_DCACHE
214 5 robfinch
wire dhit;
215 30 robfinch
`else
216
wire dhit = 1'b0;
217
`endif
218 10 robfinch
reg write_allocate;
219 5 robfinch
reg wr;
220
reg [3:0] wrsel;
221
reg [31:0] radr;
222
reg [1:0] radr2LSB;
223
wire [33:0] radr34 = {radr,radr2LSB};
224
wire [33:0] radr34p1 = radr34 + 34'd1;
225
reg [31:0] wadr;
226
reg [1:0] wadr2LSB;
227
reg [31:0] wdat;
228
wire [31:0] rdat;
229 21 robfinch
reg [3:0] load_what;
230
reg [3:0] store_what;
231 23 robfinch
reg [31:0] derr_address;
232 5 robfinch
reg imiss;
233
reg dmiss;
234
reg icacheOn,dcacheOn;
235 30 robfinch
`ifdef SUPPORT_DCACHE
236 20 robfinch
wire unCachedData = radr[31:20]==12'hFFD || !dcacheOn;  // I/O area is uncached
237 30 robfinch
`else
238
wire unCachedData = 1'b1;
239
`endif
240
`ifdef SUPPORT_ICACHE
241 20 robfinch
wire unCachedInsn = pc[31:13]==19'h0 || !icacheOn;              // The lowest 8kB is uncached.
242 30 robfinch
`else
243
wire unCachedInsn = 1'b1;
244
`endif
245 5 robfinch
 
246 30 robfinch
reg [31:0] history_buf [63:0];
247
reg [5:0] history_ndx;
248
reg hist_capture;
249
 
250
reg isBrk,isMove,isSts;
251
reg isRTI,isRTL,isRTS;
252
reg isOrb,isStb;
253
reg isRMW;
254
reg isSub,isSub8;
255
 
256
 
257 5 robfinch
wire isCmp = ir[7:0]==`CPX_ZPX || ir[7:0]==`CPX_ABS || ir[7:0]==`CPX_IMM32 ||
258
                         ir[7:0]==`CPY_ZPX || ir[7:0]==`CPY_ABS || ir[7:0]==`CPY_IMM32;
259
wire isRMW32 =
260
                         ir[7:0]==`ASL_ZPX || ir[7:0]==`ROL_ZPX || ir[7:0]==`LSR_ZPX || ir[7:0]==`ROR_ZPX || ir[7:0]==`INC_ZPX || ir[7:0]==`DEC_ZPX ||
261
                         ir[7:0]==`ASL_ABS || ir[7:0]==`ROL_ABS || ir[7:0]==`LSR_ABS || ir[7:0]==`ROR_ABS || ir[7:0]==`INC_ABS || ir[7:0]==`DEC_ABS ||
262
                         ir[7:0]==`ASL_ABSX || ir[7:0]==`ROL_ABSX || ir[7:0]==`LSR_ABSX || ir[7:0]==`ROR_ABSX || ir[7:0]==`INC_ABSX || ir[7:0]==`DEC_ABSX ||
263
                         ir[7:0]==`TRB_ZP || ir[7:0]==`TRB_ZPX || ir[7:0]==`TRB_ABS || ir[7:0]==`TSB_ZP || ir[7:0]==`TSB_ZPX || ir[7:0]==`TSB_ABS;
264
                         ;
265
wire isRMW8 =
266
                         ir[7:0]==`ASL_ZP || ir[7:0]==`ROL_ZP || ir[7:0]==`LSR_ZP || ir[7:0]==`ROR_ZP || ir[7:0]==`INC_ZP || ir[7:0]==`DEC_ZP ||
267
                         ir[7:0]==`ASL_ZPX || ir[7:0]==`ROL_ZPX || ir[7:0]==`LSR_ZPX || ir[7:0]==`ROR_ZPX || ir[7:0]==`INC_ZPX || ir[7:0]==`DEC_ZPX ||
268
                         ir[7:0]==`ASL_ABS || ir[7:0]==`ROL_ABS || ir[7:0]==`LSR_ABS || ir[7:0]==`ROR_ABS || ir[7:0]==`INC_ABS || ir[7:0]==`DEC_ABS ||
269
                         ir[7:0]==`ASL_ABSX || ir[7:0]==`ROL_ABSX || ir[7:0]==`LSR_ABSX || ir[7:0]==`ROR_ABSX || ir[7:0]==`INC_ABSX || ir[7:0]==`DEC_ABSX ||
270
                         ir[7:0]==`TRB_ZP || ir[7:0]==`TRB_ZPX || ir[7:0]==`TRB_ABS || ir[7:0]==`TSB_ZP || ir[7:0]==`TSB_ZPX || ir[7:0]==`TSB_ABS;
271
                         ;
272 30 robfinch
 
273
// Registerable decodes
274
// The following decodes can be registered because they aren't needed until at least the cycle after
275
// the DECODE stage.
276
 
277
always @(posedge clk)
278
        if (state==DECODE) begin
279
                isSub <= ir[7:0]==`SUB_ZPX || ir[7:0]==`SUB_IX || ir[7:0]==`SUB_IY ||
280
                         ir[7:0]==`SUB_ABS || ir[7:0]==`SUB_ABSX || ir[7:0]==`SUB_IMM8 || ir[7:0]==`SUB_IMM16 || ir[7:0]==`SUB_IMM32;
281
                isSub8 <= ir[7:0]==`SBC_ZP || ir[7:0]==`SBC_ZPX || ir[7:0]==`SBC_IX || ir[7:0]==`SBC_IY || ir[7:0]==`SBC_I ||
282
                         ir[7:0]==`SBC_ABS || ir[7:0]==`SBC_ABSX || ir[7:0]==`SBC_ABSY || ir[7:0]==`SBC_IMM;
283
                isRMW <= em ? isRMW8 : isRMW32;
284
                isOrb <= ir[7:0]==`ORB_ZPX || ir[7:0]==`ORB_IX || ir[7:0]==`ORB_IY || ir[7:0]==`ORB_ABS || ir[7:0]==`ORB_ABSX;
285
                isStb <= ir[7:0]==`STB_ZPX || ir[7:0]==`STB_ABS || ir[7:0]==`STB_ABSX;
286
                isRTI <= ir[7:0]==`RTI;
287
                isRTL <= ir[7:0]==`RTL;
288
                isRTS <= ir[7:0]==`RTS;
289
                isBrk <= ir[7:0]==`BRK;
290
                isMove <= ir[7:0]==`MVP || ir[7:0]==`MVN;
291
                isSts <= ir[7:0]==`STS;
292
        end
293
 
294
`ifdef SUPPORT_EXEC
295 25 robfinch
wire isExec = ir[7:0]==`EXEC;
296
wire isAtni = ir[7:0]==`ATNI;
297 30 robfinch
`else
298
wire isExec = 1'b0;
299
wire isAtni = 1'b0;
300
`endif
301 12 robfinch
wire ld_muldiv = state==DECODE && ir[7:0]==`RR;
302
wire md_done;
303
wire clk;
304 21 robfinch
reg isIY;
305 12 robfinch
 
306 30 robfinch
rtf65002_pcinc upci1
307
(
308
        .opcode(ir[7:0]),
309
        .suppress_pcinc(suppress_pcinc),
310
        .inc(pc_inc)
311
);
312
 
313 12 robfinch
mult_div umd1
314
(
315 30 robfinch
        .rst(rst_i),
316 12 robfinch
        .clk(clk),
317
        .ld(ld_muldiv),
318
        .op(ir[23:20]),
319
        .a(rfoa),
320
        .b(rfob),
321
        .p(prod),
322
        .q(q),
323
        .r(r),
324
        .done(md_done)
325
);
326 30 robfinch
 
327
`ifdef SUPPORT_ICACHE
328
rtf65002_icachemem icm0 (
329 12 robfinch
        .wclk(clk),
330 5 robfinch
        .wr(ack_i & isInsnCacheLoad),
331
        .adr(adr_o),
332
        .dat(dat_i),
333 30 robfinch
        .rclk(~clk),
334 5 robfinch
        .pc(pc),
335
        .insn(insn)
336
);
337
 
338 30 robfinch
rtf65002_itagmem tgm0 (
339 12 robfinch
        .wclk(clk),
340 10 robfinch
        .wr((ack_i & isInsnCacheLoad)|isCacheReset),
341
        .adr({adr_o[31:1],!isCacheReset}),
342 30 robfinch
        .rclk(~clk),
343 5 robfinch
        .pc(pc),
344
        .hit0(hit0),
345
        .hit1(hit1)
346
);
347
 
348
wire ihit = (hit0 & hit1);//(pc[2:0] > 3'd1 ? hit1 : 1'b1));
349 30 robfinch
`else
350
wire ihit = 1'b0;
351
`endif
352 5 robfinch
 
353 30 robfinch
`ifdef SUPPORT_DCACHE
354
rtf65002_dcachemem dcm0 (
355 12 robfinch
        .wclk(clk),
356 5 robfinch
        .wr(wr | (ack_i & isDataCacheLoad)),
357
        .sel(wr ? wrsel : sel_o),
358
        .wadr(wr ? wadr : adr_o[33:2]),
359
        .wdat(wr ? wdat : dat_i),
360 30 robfinch
        .rclk(~clk),
361 5 robfinch
        .radr(radr),
362
        .rdat(rdat)
363
);
364
 
365 30 robfinch
rtf65002_dtagmem dtm0 (
366 12 robfinch
        .wclk(clk),
367 5 robfinch
        .wr(wr | (ack_i & isDataCacheLoad)),
368
        .wadr(wr ? wadr : adr_o[33:2]),
369 30 robfinch
        .rclk(~clk),
370 5 robfinch
        .radr(radr),
371
        .hit(dhit)
372
);
373 30 robfinch
`endif
374 5 robfinch
 
375
overflow uovr1 (
376
        .op(isSub),
377
        .a(a[31]),
378
        .b(b[31]),
379
        .s(res[31]),
380
        .v(resv32)
381
);
382
 
383
overflow uovr2 (
384
        .op(isSub8),
385
        .a(acc8[7]),
386
        .b(b8[7]),
387
        .s(res8[7]),
388
        .v(resv8)
389
);
390
 
391
wire [7:0] bcaio;
392
wire [7:0] bcao;
393
wire [7:0] bcsio;
394
wire [7:0] bcso;
395
wire bcaico,bcaco,bcsico,bcsco;
396
 
397 30 robfinch
`ifdef SUPPORT_BCD
398 5 robfinch
BCDAdd ubcdai1 (.ci(cf),.a(acc8),.b(ir[15:8]),.o(bcaio),.c(bcaico));
399
BCDAdd ubcda2 (.ci(cf),.a(acc8),.b(b8),.o(bcao),.c(bcaco));
400
BCDSub ubcdsi1 (.ci(cf),.a(acc8),.b(ir[15:8]),.o(bcsio),.c(bcsico));
401
BCDSub ubcds2 (.ci(cf),.a(acc8),.b(b8),.o(bcso),.c(bcsco));
402 30 robfinch
`endif
403 5 robfinch
 
404
reg [7:0] dati;
405
always @(radr2LSB or dat_i)
406
case(radr2LSB)
407
2'd0:   dati <= dat_i[7:0];
408
2'd1:   dati <= dat_i[15:8];
409
2'd2:   dati <= dat_i[23:16];
410
2'd3:   dati <= dat_i[31:24];
411
endcase
412
reg [7:0] rdat8;
413
always @(radr2LSB or rdat)
414
case(radr2LSB)
415
2'd0:   rdat8 <= rdat[7:0];
416
2'd1:   rdat8 <= rdat[15:8];
417
2'd2:   rdat8 <= rdat[23:16];
418
2'd3:   rdat8 <= rdat[31:24];
419
endcase
420
 
421
reg takb;
422
always @(ir or cf or vf or nf or zf)
423
case(ir[7:0])
424
`BEQ:   takb <= zf;
425
`BNE:   takb <= !zf;
426
`BPL:   takb <= !nf;
427
`BMI:   takb <= nf;
428
`BCS:   takb <= cf;
429
`BCC:   takb <= !cf;
430
`BVS:   takb <= vf;
431
`BVC:   takb <= !vf;
432
`BRA:   takb <= 1'b1;
433
`BRL:   takb <= 1'b1;
434 30 robfinch
`BHI:   takb <= cf & !zf;
435
`BLS:   takb <= !cf | zf;
436
`BGE:   takb <= (nf & vf)|(!nf & !vf);
437
`BLT:   takb <= (nf & !vf)|(!nf & vf);
438
`BGT:   takb <= (nf & vf & !zf) + (!nf & !vf & !zf);
439
`BLE:   takb <= zf | (nf & !vf)|(!nf & vf);
440 10 robfinch
//`BAZ: takb <= acc8==8'h00;
441
//`BXZ: takb <= x8==8'h00;
442 5 robfinch
default:        takb <= 1'b0;
443
endcase
444
 
445 30 robfinch
wire [31:0] zp_address           = {abs8[31:12],4'h0,ir[15:8]};
446
wire [31:0] zpx_address  = {abs8[31:12],4'h0,ir[15:8]} + x8;
447
wire [31:0] zpy_address          = {abs8[31:12],4'h0,ir[15:8]} + y8;
448
wire [31:0] abs_address  = {abs8[31:12],12'h00} + {16'h0,ir[23:8]};
449
wire [31:0] absx_address         = {abs8[31:12],12'h00} + {16'h0,ir[23:8] + {8'h0,x8}};  // simulates 64k bank wrap-around
450
wire [31:0] absy_address         = {abs8[31:12],12'h00} + {16'h0,ir[23:8] + {8'h0,y8}};
451
wire [31:0] zpx32xy_address      = ir[23:12] + rfoa;
452
wire [31:0] absx32xy_address     = ir[47:16] + rfob;
453
wire [31:0] zpx32_address                = ir[31:20] + rfob;
454
wire [31:0] absx32_address               = ir[55:24] + rfob;
455 5 robfinch
 
456 30 robfinch
reg [32:0] calc_res;
457
always @(a or b or b8 or x or y or df or cf or Rt or shlo or shro)
458
begin
459
        case(ir[7:0])
460
        `RR:
461
                case(ir[23:20])
462
                `ASL_RRR:       calc_res <= shlo;
463
                `LSR_RRR:       calc_res <= shro;
464
                default:        calc_res <= 33'd0;
465
                endcase
466
        `ADD_ZPX,`ADD_IX,`ADD_IY,`ADD_ABS,`ADD_ABSX,`ADD_RIND:  calc_res <= a + b + {31'b0,df&cf};
467
        `SUB_ZPX,`SUB_IX,`SUB_IY,`SUB_ABS,`SUB_ABSX,`SUB_RIND:  calc_res <= a - b - {31'b0,df&~cf&|Rt}; // Also CMP
468
        `AND_ZPX,`AND_IX,`AND_IY,`AND_ABS,`AND_ABSX,`AND_RIND:  calc_res <= a & b;      // Also BIT
469
        `OR_ZPX,`OR_IX,`OR_IY,`OR_ABS,`OR_ABSX,`OR_RIND:                calc_res <= a | b;      // Also LD
470
        `EOR_ZPX,`EOR_IX,`EOR_IY,`EOR_ABS,`EOR_ABSX,`EOR_RIND:  calc_res <= a ^ b;
471
        `LDX_ZPY,`LDX_ABS,`LDX_ABSY:    calc_res <= b;
472
        `LDY_ZPX,`LDY_ABS,`LDY_ABSX:    calc_res <= b;
473
        `CPX_ZPX,`CPX_ABS:      calc_res <= x - b;
474
        `CPY_ZPX,`CPY_ABS:      calc_res <= y - b;
475
        `ASL_IMM8:      calc_res <= shlo;
476
        `LSR_IMM8:      calc_res <= shro;
477
        `ASL_ZPX,`ASL_ABS,`ASL_ABSX:    calc_res <= {b,1'b0};
478
        `ROL_ZPX,`ROL_ABS,`ROL_ABSX:    calc_res <= {b,cf};
479
        `LSR_ZPX,`LSR_ABS,`LSR_ABSX:    calc_res <= {b[0],1'b0,b[31:1]};
480
        `ROR_ZPX,`ROR_ABS,`ROR_ABSX:    calc_res <= {b[0],cf,b[31:1]};
481
        `INC_ZPX,`INC_ABS,`INC_ABSX:    calc_res <= b + 32'd1;
482
        `DEC_ZPX,`DEC_ABS,`DEC_ABSX:    calc_res <= b - 32'd1;
483
        `ORB_ZPX,`ORB_ABS,`ORB_ABSX:    calc_res <= a | {24'h0,b8};
484
        default:        calc_res <= 33'd0;
485
        endcase
486
end
487
 
488
 
489 5 robfinch
//-----------------------------------------------------------------------------
490
// Clock control
491
// - reset or NMI reenables the clock
492
// - this circuit must be under the clk_i domain
493
//-----------------------------------------------------------------------------
494
//
495
reg cpu_clk_en;
496
reg clk_en;
497
BUFGCE u20 (.CE(cpu_clk_en), .I(clk_i), .O(clk) );
498
 
499
always @(posedge clk_i)
500
if (rst_i) begin
501
        cpu_clk_en <= 1'b1;
502
        nmi1 <= 1'b0;
503
end
504
else begin
505
        nmi1 <= nmi_i;
506
        if (nmi_i)
507
                cpu_clk_en <= 1'b1;
508
        else
509
                cpu_clk_en <= clk_en;
510
end
511
 
512
always @(posedge clk)
513
if (rst_i) begin
514
        bte_o <= 2'b00;
515
        cti_o <= 3'b000;
516
        bl_o <= 6'd0;
517
        cyc_o <= 1'b0;
518
        stb_o <= 1'b0;
519
        we_o <= 1'b0;
520
        sel_o <= 4'h0;
521
        adr_o <= 34'd0;
522
        dat_o <= 32'd0;
523
        nmi_edge <= 1'b0;
524
        wai <= 1'b0;
525
        first_ifetch <= `TRUE;
526
        wr <= 1'b0;
527
        cf <= 1'b0;
528 30 robfinch
        ir <= 64'hEAEAEAEAEAEAEAEA;
529 5 robfinch
        imiss <= `FALSE;
530
        dmiss <= `FALSE;
531
        dcacheOn <= 1'b0;
532
        icacheOn <= 1'b1;
533 10 robfinch
        write_allocate <= 1'b0;
534 5 robfinch
        nmoi <= 1'b1;
535 10 robfinch
        state <= RESET1;
536 5 robfinch
        cstate <= IDLE;
537 21 robfinch
        if (rst_md) begin
538
                pc <= 32'h0000FFF0;             // set high-order pc to zero
539
                vect <= `BYTE_RST_VECT;
540
                em <= 1'b1;
541
        end
542
        else begin
543
                vect <= `RST_VECT;
544
                em <= 1'b0;
545
                pc <= 32'hFFFFFFF0;
546
        end
547 25 robfinch
        suppress_pcinc <= 4'hF;
548
        exbuf <= 64'd0;
549 13 robfinch
        spage <= 32'h00000100;
550 5 robfinch
        bufadr <= 32'd0;
551 13 robfinch
        abs8 <= 32'd0;
552 5 robfinch
        clk_en <= 1'b1;
553 10 robfinch
        isCacheReset <= `TRUE;
554
        gie <= 1'b0;
555 12 robfinch
        tick <= 32'd0;
556 21 robfinch
        isIY <= 1'b0;
557 30 robfinch
        load_what <= `NOTHING;
558
        hist_capture <= `TRUE;
559
        history_ndx <= 6'd0;
560 5 robfinch
end
561
else begin
562 12 robfinch
tick <= tick + 32'd1;
563 5 robfinch
wr <= 1'b0;
564
if (nmi_i & !nmi1)
565
        nmi_edge <= 1'b1;
566
if (nmi_i|nmi1)
567
        clk_en <= 1'b1;
568
case(state)
569 10 robfinch
RESET1:
570 5 robfinch
        begin
571 10 robfinch
                adr_o <= adr_o + 32'd4;
572
                if (adr_o[13:4]==10'h3FF) begin
573
                        state <= RESET2;
574
                        isCacheReset <= `FALSE;
575
                end
576
        end
577
RESET2:
578
        begin
579 5 robfinch
                radr <= vect[31:2];
580 21 robfinch
                radr2LSB <= vect[1:0];
581
                load_what <= em ? `PC_70 : `PC_310;
582
                state <= LOAD_MAC1;
583 5 robfinch
        end
584
 
585 20 robfinch
`include "ifetch.v"
586
`include "decode.v"
587 30 robfinch
`ifdef SUPPORT_EM8
588 20 robfinch
`include "byte_decode.v"
589 30 robfinch
`include "byte_calc.v"
590
`include "byte_jsr.v"
591
`include "byte_jsl.v"
592
`ifdef SUPPORT_BYTE_IRQ
593
`include "byte_irq.v"
594
`endif
595
`endif
596 10 robfinch
 
597 21 robfinch
`include "load_mac.v"
598 20 robfinch
`include "store.v"
599 10 robfinch
 
600
WAIT_DHIT:
601
        if (dhit)
602
                state <= retstate;
603 5 robfinch
 
604
`include "calc.v"
605
 
606
JSR_INDX1:
607
        if (ack_i) begin
608 21 robfinch
                load_what <= `PC_310;
609
                state <= LOAD_MAC1;
610
                retstate <= LOAD_MAC1;
611 5 robfinch
                cyc_o <= 1'b0;
612
                stb_o <= 1'b0;
613
                we_o <= 1'b0;
614
                sel_o <= 4'h0;
615
                adr_o <= 34'd0;
616
                dat_o <= 32'd0;
617
                radr <= ir[39:8] + x;
618
                isp <= isp_dec;
619
                if (dhit) begin
620
                        wrsel <= sel_o;
621
                        wr <= 1'b1;
622
                end
623 10 robfinch
                else if (write_allocate) begin
624
                        dmiss <= `TRUE;
625
                        state <= WAIT_DHIT;
626
                end
627 5 robfinch
        end
628 20 robfinch
 
629 5 robfinch
JSR161:
630
        if (ack_i) begin
631 10 robfinch
                state <= IFETCH;
632
                retstate <= IFETCH;
633 5 robfinch
                cyc_o <= 1'b0;
634
                stb_o <= 1'b0;
635
                we_o <= 1'b0;
636
                sel_o <= 4'h0;
637
                pc <= {{16{ir[23]}},ir[23:8]};
638
                isp <= isp_dec;
639
                if (dhit) begin
640
                        wrsel <= sel_o;
641
                        wr <= 1'b1;
642
                end
643 10 robfinch
                else if (write_allocate) begin
644
                        state <= WAIT_DHIT;
645
                        dmiss <= `TRUE;
646
                end
647 5 robfinch
        end
648 30 robfinch
/*
649
IRQ0:
650
        begin
651
                cyc_o <= 1'b1;
652
                stb_o <= 1'b1;
653
                we_o <= 1'b1;
654
                sel_o <= 4'hF;
655
                adr_o <= {wadr,2'b00};
656
                dat_o <= wdat;
657
                state <= IRQ1;
658
        end
659 5 robfinch
IRQ1:
660
        if (ack_i) begin
661 21 robfinch
                ir <= 64'd0;            // Force instruction decoder to BRK
662 10 robfinch
                state <= IRQ2;
663
                retstate <= IRQ2;
664 5 robfinch
                cyc_o <= 1'b0;
665
                stb_o <= 1'b0;
666
                we_o <= 1'b0;
667
                sel_o <= 4'h0;
668
                isp <= isp_dec;
669 30 robfinch
`ifdef SUPPORT_DCACHE
670 5 robfinch
                if (dhit) begin
671
                        wrsel <= sel_o;
672
                        wr <= 1'b1;
673
                end
674 10 robfinch
                else if (write_allocate) begin
675
                        state <= WAIT_DHIT;
676
                        dmiss <= `TRUE;
677
                end
678 30 robfinch
`endif
679 5 robfinch
        end
680
IRQ2:
681
        begin
682
                cyc_o <= 1'b1;
683
                stb_o <= 1'b1;
684
                we_o <= 1'b1;
685
                sel_o <= 4'hF;
686
                radr <= isp_dec;
687
                wadr <= isp_dec;
688
                wdat <= sr;
689
                adr_o <= {isp_dec,2'b00};
690
                dat_o <= sr;
691
                state <= IRQ3;
692
        end
693
IRQ3:
694
        if (ack_i) begin
695 21 robfinch
                load_what <= `PC_310;
696
                state <= LOAD_MAC1;
697
                retstate <= LOAD_MAC1;
698 5 robfinch
                cyc_o <= 1'b0;
699
                stb_o <= 1'b0;
700
                we_o <= 1'b0;
701
                sel_o <= 4'h0;
702
                isp <= isp_dec;
703 30 robfinch
`ifdef SUPPORT_DCACHE
704 5 robfinch
                if (dhit) begin
705
                        wrsel <= sel_o;
706
                        wr <= 1'b1;
707
                end
708 10 robfinch
                else if (write_allocate) begin
709
                        dmiss <= `TRUE;
710
                        state <= WAIT_DHIT;
711
                end
712 30 robfinch
`endif
713 5 robfinch
                radr <= vect[31:2];
714 25 robfinch
                if (hwi)
715 5 robfinch
                        im <= 1'b1;
716
                em <= 1'b0;                     // make sure we process in native mode; we might have been called up during emulation mode
717
        end
718 30 robfinch
*/
719 12 robfinch
MULDIV1:
720
        if (md_done) begin
721
                state <= IFETCH;
722
                case(ir[23:20])
723
                `MUL_RR:        begin res <= prod[31:0]; end
724
                `MULS_RR:       begin res <= prod[31:0]; end
725
                `DIV_RR:        begin res <= q; end
726
                `DIVS_RR:       begin res <= q; end
727
                `MOD_RR:        begin res <= r; end
728
                `MODS_RR:       begin res <= r; end
729
                endcase
730
        end
731
 
732 30 robfinch
`ifdef SUPPORT_BERR
733 21 robfinch
BUS_ERROR:
734
        begin
735
                radr <= isp_dec;
736
                wadr <= isp_dec;
737 23 robfinch
                wdat <= opc;
738
                if (em | isOrb | isStb)
739
                        derr_address <= adr_o[31:0];
740
                else
741
                        derr_address <= adr_o[33:2];
742 21 robfinch
                vect <= {vbr[31:9],9'd508,2'b00};
743 25 robfinch
                hwi <= `TRUE;
744 30 robfinch
                state <= IRQ0;
745 21 robfinch
        end
746
INSN_BUS_ERROR:
747
        begin
748
                radr <= isp_dec;
749
                wadr <= isp_dec;
750 23 robfinch
                wdat <= opc;
751 21 robfinch
                vect <= {vbr[31:9],9'd509,2'b00};
752 25 robfinch
                hwi <= `TRUE;
753 30 robfinch
                state <= IRQ0;
754 21 robfinch
        end
755 30 robfinch
`endif
756
 
757
`ifdef SUPPORT_STRING
758 23 robfinch
MVN1:
759
        begin
760
                radr <= x;
761 30 robfinch
                res <= x + 32'd1;
762 23 robfinch
                retstate <= MVN2;
763
                load_what <= `WORD_312;
764
                state <= LOAD_MAC1;
765
        end
766
MVN2:
767
        begin
768 25 robfinch
                radr <= y;
769 23 robfinch
                wadr <= y;
770 30 robfinch
                store_what <= `STW_B;
771
                x <= res;
772
                res <= y + 32'd1;
773 23 robfinch
                acc <= acc - 32'd1;
774
                state <= STORE1;
775
        end
776
MVN3:
777
        begin
778
                state <= IFETCH;
779 30 robfinch
                y <= res;
780 23 robfinch
                if (acc==32'hFFFFFFFF)
781
                        pc <= pc + 32'd1;
782
        end
783
MVP1:
784
        begin
785
                radr <= x;
786 30 robfinch
                res <= x - 32'd1;
787 23 robfinch
                retstate <= MVP2;
788
                load_what <= `WORD_312;
789
                state <= LOAD_MAC1;
790
        end
791
MVP2:
792
        begin
793 25 robfinch
                radr <= y;
794 23 robfinch
                wadr <= y;
795 30 robfinch
                store_what <= `STW_B;
796
                x <= res;
797
                res <= y - 32'd1;
798 23 robfinch
                acc <= acc - 32'd1;
799
                state <= STORE1;
800
        end
801 30 robfinch
STS1:
802
        begin
803
                radr <= y;
804
                wadr <= y;
805
                store_what <= `STW_X;
806
                res <= y + 32'd1;
807
                acc <= acc - 32'd1;
808
                state <= STORE1;
809
        end
810
`endif
811
 
812 5 robfinch
endcase
813
 
814
`include "cache_controller.v"
815
 
816
end
817
endmodule

powered by: WebSVN 2.1.0

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