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

Subversion Repositories rtf65002

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

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 5 robfinch
`define TRUE            1'b1
28
`define FALSE           1'b0
29
 
30
`define RST_VECT        34'h3FFFFFFF8
31
`define NMI_VECT        34'h3FFFFFFF4
32
`define IRQ_VECT        34'h3FFFFFFF0
33 13 robfinch
`define BRK_VECTNO      9'd0
34
`define SLP_VECTNO      9'd1
35 5 robfinch
`define BYTE_NMI_VECT   34'h00000FFFA
36
`define BYTE_IRQ_VECT   34'h00000FFFE
37
 
38
`define BRK                     8'h00
39
`define RTI                     8'h40
40
`define RTS                     8'h60
41
`define PHP                     8'h08
42
`define CLC                     8'h18
43
`define PLP                     8'h28
44
`define SEC                     8'h38
45
`define PHA                     8'h48
46
`define CLI                     8'h58
47
`define PLA                     8'h68
48
`define SEI                     8'h78
49
`define DEY                     8'h88
50
`define TYA                     8'h98
51
`define TAY                     8'hA8
52
`define CLV                     8'hB8
53
`define INY                     8'hC8
54
`define CLD                     8'hD8
55
`define INX                     8'hE8
56
`define SED                     8'hF8
57
`define ROR_ACC         8'h6A
58
`define TXA                     8'h8A
59
`define TXS                     8'h9A
60
`define TAX                     8'hAA
61
`define TSX                     8'hBA
62
`define DEX                     8'hCA
63
`define NOP                     8'hEA
64
`define TXY                     8'h9B
65
`define TYX                     8'hBB
66
`define TAS                     8'h1B
67
`define TSA                     8'h3B
68
`define TRS                     8'h8B
69
`define TSR                     8'hAB
70
`define STP                     8'hDB
71
`define NAT                     8'hFB
72
`define EMM                     8'hFB
73
`define INA                     8'h1A
74
`define DEA                     8'h3A
75
 
76
`define RR                      8'h02
77 12 robfinch
`define ADD_RR                  4'd0
78
`define SUB_RR                  4'd1
79
`define CMP_RR                  4'd2
80
`define AND_RR                  4'd3
81
`define EOR_RR                  4'd4
82
`define OR_RR                   4'd5
83
`define MUL_RR                  4'd8
84
`define MULS_RR                 4'd9
85
`define DIV_RR                  4'd10
86
`define DIVS_RR                 4'd11
87
`define MOD_RR                  4'd12
88
`define MODS_RR                 4'd13
89 19 robfinch
`define ASL_RRR                 4'd14
90
`define LSR_RRR                 4'd15
91 12 robfinch
`define LD_RR           8'h7B
92 5 robfinch
 
93
`define ADD_IMM8        8'h65           // 8 bit operand
94
`define ADD_IMM16       8'h79           // 16 bit operand
95
`define ADD_IMM32       8'h69           // 32 bit operand
96
`define ADD_ZPX         8'h75           // there is no ZP mode, use R0 to syntheisze
97
`define ADD_IX          8'h61
98
`define ADD_IY          8'h71
99
`define ADD_ABS         8'h6D
100
`define ADD_ABSX        8'h7D
101
`define ADD_RIND        8'h72
102
 
103
`define SUB_IMM8        8'hE5
104
`define SUB_IMM16       8'hF9
105
`define SUB_IMM32       8'hE9
106
`define SUB_ZPX         8'hF5
107
`define SUB_IX          8'hE1
108
`define SUB_IY          8'hF1
109
`define SUB_ABS         8'hED
110
`define SUB_ABSX        8'hFD
111
`define SUB_RIND        8'hF2
112
 
113
// CMP = SUB r0,....
114
 
115
`define ADC_IMM         8'h69
116
`define ADC_ZP          8'h65
117
`define ADC_ZPX         8'h75
118
`define ADC_IX          8'h61
119
`define ADC_IY          8'h71
120
`define ADC_ABS         8'h6D
121
`define ADC_ABSX        8'h7D
122
`define ADC_ABSY        8'h79
123
`define ADC_I           8'h72
124
 
125
`define SBC_IMM         8'hE9
126
`define SBC_ZP          8'hE5
127
`define SBC_ZPX         8'hF5
128
`define SBC_IX          8'hE1
129
`define SBC_IY          8'hF1
130
`define SBC_ABS         8'hED
131
`define SBC_ABSX        8'hFD
132
`define SBC_ABSY        8'hF9
133
`define SBC_I           8'hF2
134
 
135 19 robfinch
`define CMP_IMM8        8'hC5
136 5 robfinch
`define CMP_IMM32       8'hC9
137
`define CMP_IMM         8'hC9
138
`define CMP_ZP          8'hC5
139
`define CMP_ZPX         8'hD5
140
`define CMP_IX          8'hC1
141
`define CMP_IY          8'hD1
142
`define CMP_ABS         8'hCD
143
`define CMP_ABSX        8'hDD
144
`define CMP_ABSY        8'hD9
145
`define CMP_I           8'hD2
146
 
147
 
148
`define LDA_IMM8        8'hA5
149
`define LDA_IMM16       8'hB9
150
`define LDA_IMM32       8'hA9
151
 
152
`define AND_IMM8        8'h25
153
`define AND_IMM16       8'h39
154
`define AND_IMM32       8'h29
155
`define AND_IMM         8'h29
156
`define AND_ZP          8'h25
157
`define AND_ZPX         8'h35
158
`define AND_IX          8'h21
159
`define AND_IY          8'h31
160
`define AND_ABS         8'h2D
161
`define AND_ABSX        8'h3D
162
`define AND_ABSY        8'h39
163
`define AND_RIND        8'h32
164
`define AND_I           8'h32
165
 
166
`define OR_IMM8         8'h05
167
`define OR_IMM16        8'h19
168
`define OR_IMM32        8'h09
169
`define OR_ZPX          8'h15
170
`define OR_IX           8'h01
171
`define OR_IY           8'h11
172
`define OR_ABS          8'h0D
173
`define OR_ABSX         8'h1D
174
`define OR_RIND         8'h12
175
 
176
`define ORA_IMM         8'h09
177
`define ORA_ZP          8'h05
178
`define ORA_ZPX         8'h15
179
`define ORA_IX          8'h01
180
`define ORA_IY          8'h11
181
`define ORA_ABS         8'h0D
182
`define ORA_ABSX        8'h1D
183
`define ORA_ABSY        8'h19
184
`define ORA_I           8'h12
185
 
186
`define EOR_IMM         8'h49
187
`define EOR_IMM8        8'h45
188
`define EOR_IMM16       8'h59
189
`define EOR_IMM32       8'h49
190
`define EOR_ZP          8'h45
191
`define EOR_ZPX         8'h55
192
`define EOR_IX          8'h41
193
`define EOR_IY          8'h51
194
`define EOR_ABS         8'h4D
195
`define EOR_ABSX        8'h5D
196
`define EOR_ABSY        8'h59
197
`define EOR_RIND        8'h52
198
`define EOR_I           8'h52
199
 
200
// LD is OR rt,r0,....
201
 
202
`define ST_ZPX          8'h95
203
`define ST_IX           8'h81
204
`define ST_IY           8'h91
205
`define ST_ABS          8'h8D
206
`define ST_ABSX         8'h9D
207
`define ST_RIND         8'h92
208
 
209
`define ORB_ZPX         8'hB5
210
`define ORB_IX          8'hA1
211
`define ORB_IY          8'hB1
212
`define ORB_ABS         8'hAD
213
`define ORB_ABSX        8'hBD
214
 
215
`define STB_ZPX         8'h74
216
`define STB_ABS         8'h9C
217
`define STB_ABSX        8'h9E
218
 
219
 
220
//`define LDB_RIND      8'hB2   // Conflict with LDX #imm16
221
 
222
`define LDA_IMM         8'hA9
223
`define LDA_ZP          8'hA5
224
`define LDA_ZPX         8'hB5
225
`define LDA_IX          8'hA1
226
`define LDA_IY          8'hB1
227
`define LDA_ABS         8'hAD
228
`define LDA_ABSX        8'hBD
229
`define LDA_ABSY        8'hB9
230
`define LDA_I           8'hB2
231
 
232
`define STA_ZP          8'h85
233
`define STA_ZPX         8'h95
234
`define STA_IX          8'h81
235
`define STA_IY          8'h91
236
`define STA_ABS         8'h8D
237
`define STA_ABSX        8'h9D
238
`define STA_ABSY        8'h99
239
`define STA_I           8'h92
240
 
241 19 robfinch
`define ASL_IMM8        8'h24
242 5 robfinch
`define ASL_ACC         8'h0A
243
`define ASL_ZP          8'h06
244
`define ASL_RR          8'h06
245
`define ASL_ZPX         8'h16
246
`define ASL_ABS         8'h0E
247
`define ASL_ABSX        8'h1E
248
 
249
`define ROL_ACC         8'h2A
250
`define ROL_ZP          8'h26
251
`define ROL_RR          8'h26
252
`define ROL_ZPX         8'h36
253
`define ROL_ABS         8'h2E
254
`define ROL_ABSX        8'h3E
255
 
256 19 robfinch
`define LSR_IMM8        8'h34
257 5 robfinch
`define LSR_ACC         8'h4A
258
`define LSR_ZP          8'h46
259
`define LSR_RR          8'h46
260
`define LSR_ZPX         8'h56
261
`define LSR_ABS         8'h4E
262
`define LSR_ABSX        8'h5E
263
 
264
`define ROR_RR          8'h66
265
`define ROR_ZP          8'h66
266
`define ROR_ZPX         8'h76
267
`define ROR_ABS         8'h6E
268
`define ROR_ABSX        8'h7E
269
 
270 12 robfinch
`define DEC_RR          8'hC6
271 5 robfinch
`define DEC_ZP          8'hC6
272
`define DEC_ZPX         8'hD6
273
`define DEC_ABS         8'hCE
274
`define DEC_ABSX        8'hDE
275 12 robfinch
`define INC_RR          8'hE6
276 5 robfinch
`define INC_ZP          8'hE6
277
`define INC_ZPX         8'hF6
278
`define INC_ABS         8'hEE
279
`define INC_ABSX        8'hFE
280
 
281
`define BIT_IMM         8'h89
282
`define BIT_ZP          8'h24
283
`define BIT_ZPX         8'h34
284
`define BIT_ABS         8'h2C
285
`define BIT_ABSX        8'h3C
286
 
287
// CMP = SUB r0,...
288
// BIT = AND r0,...
289
`define BPL                     8'h10
290
`define BVC                     8'h50
291
`define BCC                     8'h90
292
`define BNE                     8'hD0
293
`define BMI                     8'h30
294
`define BVS                     8'h70
295
`define BCS                     8'hB0
296
`define BEQ                     8'hF0
297
`define BRL                     8'h82
298 20 robfinch
`define BRA                     8'h80
299 5 robfinch
 
300
`define JML                     8'h5C
301
`define JMP                     8'h4C
302
`define JMP_IND         8'h6C
303
`define JMP_INDX        8'h7C
304
`define JMP_RIND        8'hD2
305
`define JSR                     8'h20
306
`define JSL                     8'h22
307
`define JSR_INDX        8'hFC
308
`define JSR_RIND        8'hC2
309
`define RTS                     8'h60
310
`define RTL                     8'h6B
311
`define BSR                     8'h62
312
`define NOP                     8'hEA
313
 
314
`define BRK                     8'h00
315
`define PLX                     8'hFA
316
`define PLY                     8'h7A
317
`define PHX                     8'hDA
318
`define PHY                     8'h5A
319
`define WAI                     8'hCB
320
`define PUSH            8'h0B
321
`define POP                     8'h2B
322
 
323
`define LDX_IMM         8'hA2
324
`define LDX_ZP          8'hA6
325
`define LDX_ZPX         8'hB6
326
`define LDX_ZPY         8'hB6
327
`define LDX_ABS         8'hAE
328
`define LDX_ABSY        8'hBE
329
 
330
`define LDX_IMM32       8'hA2
331
`define LDX_IMM16       8'hB2
332
`define LDX_IMM8        8'hA6
333
 
334
`define LDY_IMM         8'hA0
335
`define LDY_ZP          8'hA4
336
`define LDY_ZPX         8'hB4
337
`define LDY_IMM32       8'hA0
338
`define LDY_ABS         8'hAC
339
`define LDY_ABSX        8'hBC
340
 
341
`define STX_ZP          8'h86
342
`define STX_ZPX         8'h96
343
`define STX_ZPY         8'h96
344
`define STX_ABS         8'h8E
345
 
346
`define STY_ZP          8'h84
347
`define STY_ZPX         8'h94
348
`define STY_ABS         8'h8C
349
 
350
`define STZ_ZP          8'h64
351
`define STZ_ZPX         8'h74
352
`define STZ_ABS         8'h9C
353
`define STZ_ABSX        8'h9E
354
 
355
`define CPX_IMM         8'hE0
356
`define CPX_IMM32       8'hE0
357
`define CPX_ZP          8'hE4
358
`define CPX_ZPX         8'hE4
359
`define CPX_ABS         8'hEC
360
`define CPY_IMM         8'hC0
361
`define CPY_IMM32       8'hC0
362
`define CPY_ZP          8'hC4
363
`define CPY_ZPX         8'hC4
364
`define CPY_ABS         8'hCC
365
 
366
`define TRB_ZP          8'h14
367
`define TRB_ZPX         8'h14
368
`define TRB_ABS         8'h1C
369
`define TSB_ZP          8'h04
370
`define TSB_ZPX         8'h04
371
`define TSB_ABS         8'h0C
372
 
373 10 robfinch
`define BAZ                     8'hC1
374
`define BXZ                     8'hD1
375
`define BEQ_RR          8'hE2
376
 
377 5 robfinch
module icachemem(wclk, wr, adr, dat, rclk, pc, insn);
378
input wclk;
379
input wr;
380
input [33:0] adr;
381
input [31:0] dat;
382
input rclk;
383
input [31:0] pc;
384
output reg [55:0] insn;
385
 
386
wire [63:0] insn0;
387
wire [63:0] insn1;
388
wire [31:0] pcp8 = pc + 32'd8;
389
reg [31:0] rpc;
390
 
391
always @(posedge rclk)
392
        rpc <= pc;
393
 
394
// memL and memH combined allow a 64 bit read
395 10 robfinch
syncRam2kx32_1rw1r ramL0
396 5 robfinch
(
397
        .wrst(1'b0),
398
        .wclk(wclk),
399
        .wce(~adr[2]),
400
        .we(wr),
401
        .wsel(4'hF),
402 10 robfinch
        .wadr(adr[13:3]),
403 5 robfinch
        .i(dat),
404
        .wo(),
405
        .rrst(1'b0),
406
        .rclk(rclk),
407
        .rce(1'b1),
408 10 robfinch
        .radr(pc[13:3]),
409 5 robfinch
        .o(insn0[31:0])
410
);
411
 
412 10 robfinch
syncRam2kx32_1rw1r ramH0
413 5 robfinch
(
414
        .wrst(1'b0),
415
        .wclk(wclk),
416
        .wce(adr[2]),
417
        .we(wr),
418
        .wsel(4'hF),
419 10 robfinch
        .wadr(adr[13:3]),
420 5 robfinch
        .i(dat),
421
        .wo(),
422
        .rrst(1'b0),
423
        .rclk(rclk),
424
        .rce(1'b1),
425 10 robfinch
        .radr(pc[13:3]),
426 5 robfinch
        .o(insn0[63:32])
427
);
428
 
429 10 robfinch
syncRam2kx32_1rw1r ramL1
430 5 robfinch
(
431
        .wrst(1'b0),
432
        .wclk(wclk),
433
        .wce(~adr[2]),
434
        .we(wr),
435
        .wsel(4'hF),
436 10 robfinch
        .wadr(adr[13:3]),
437 5 robfinch
        .i(dat),
438
        .wo(),
439
        .rrst(1'b0),
440
        .rclk(rclk),
441
        .rce(1'b1),
442 10 robfinch
        .radr(pcp8[13:3]),
443 5 robfinch
        .o(insn1[31:0])
444
);
445
 
446 10 robfinch
syncRam2kx32_1rw1r ramH1
447 5 robfinch
(
448
        .wrst(1'b0),
449
        .wclk(wclk),
450
        .wce(adr[2]),
451
        .we(wr),
452
        .wsel(4'hF),
453 10 robfinch
        .wadr(adr[13:3]),
454 5 robfinch
        .i(dat),
455
        .wo(),
456
        .rrst(1'b0),
457
        .rclk(rclk),
458
        .rce(1'b1),
459 10 robfinch
        .radr(pcp8[13:3]),
460 5 robfinch
        .o(insn1[63:32])
461
);
462
 
463
always @(rpc or insn0 or insn1)
464
case(rpc[2:0])
465
3'd0:   insn <= insn0[55:0];
466
3'd1:   insn <= insn0[63:8];
467
3'd2:   insn <= {insn1[7:0],insn0[63:16]};
468
3'd3:   insn <= {insn1[15:0],insn0[63:24]};
469
3'd4:   insn <= {insn1[23:0],insn0[63:32]};
470
3'd5:   insn <= {insn1[31:0],insn0[63:40]};
471
3'd6:   insn <= {insn1[39:0],insn0[63:48]};
472
3'd7:   insn <= {insn1[47:0],insn0[63:56]};
473
endcase
474
endmodule
475
 
476
module tagmem(wclk, wr, adr, rclk, pc, hit0, hit1);
477
input wclk;
478
input wr;
479
input [33:0] adr;
480
input rclk;
481
input [31:0] pc;
482
output hit0;
483
output hit1;
484
 
485
wire [31:0] pcp8 = pc + 32'd8;
486
wire [31:0] tag0;
487
wire [31:0] tag1;
488
reg [31:0] rpc;
489
reg [31:0] rpcp8;
490
 
491
always @(posedge rclk)
492
        rpc <= pc;
493
always @(posedge rclk)
494
        rpcp8 <= pcp8;
495
 
496 10 robfinch
syncRam1kx32_1rw1r ram0 (
497 5 robfinch
        .wrst(1'b0),
498
        .wclk(wclk),
499
        .wce(adr[3:2]==2'b11),
500
        .we(wr),
501 10 robfinch
        .wsel(4'hF),
502
        .wadr(adr[13:4]),
503 5 robfinch
        .i(adr[31:0]),
504
        .wo(),
505
 
506 10 robfinch
        .rrst(1'b0),
507
        .rclk(rclk),
508
        .rce(1'b1),
509
        .radr(pc[13:4]),
510
        .o(tag0)
511
);
512 5 robfinch
 
513 10 robfinch
syncRam1kx32_1rw1r ram1 (
514
        .wrst(1'b0),
515
        .wclk(wclk),
516
        .wce(adr[3:2]==2'b11),
517
        .we(wr),
518
        .wsel(4'hF),
519
        .wadr(adr[13:4]),
520
        .i(adr[31:0]),
521
        .wo(),
522
 
523
        .rrst(1'b0),
524
        .rclk(rclk),
525
        .rce(1'b1),
526
        .radr(pcp8[13:4]),
527
        .o(tag1)
528 5 robfinch
);
529
 
530 10 robfinch
assign hit0 = tag0[31:14]==rpc[31:14] && tag0[0];
531
assign hit1 = tag1[31:14]==rpcp8[31:14] && tag1[0];
532 5 robfinch
 
533
endmodule
534
 
535
module dcachemem(wclk, wr, sel, wadr, wdat, rclk, radr, rdat);
536
input wclk;
537
input wr;
538
input [3:0] sel;
539
input [31:0] wadr;
540
input [31:0] wdat;
541
input rclk;
542
input [31:0] radr;
543
output [31:0] rdat;
544
 
545
syncRam2kx32_1rw1r ram0 (
546
        .wrst(1'b0),
547
        .wclk(wclk),
548
        .wce(1'b1),
549
        .we(wr),
550
        .wsel(sel),
551
        .wadr(wadr[10:0]),
552
        .i(wdat),
553
        .wo(),
554
        .rrst(1'b0),
555
        .rclk(rclk),
556
        .rce(1'b1),
557
        .radr(radr[10:0]),
558
        .o(rdat)
559
);
560
 
561
endmodule
562
 
563
module dtagmem(wclk, wr, wadr, rclk, radr, hit);
564
input wclk;
565
input wr;
566
input [31:0] wadr;
567
input rclk;
568
input [31:0] radr;
569
output hit;
570
 
571
reg [31:0] rradr;
572
wire [31:0] tag;
573
 
574
syncRam512x32_1rw1r u1
575
        (
576
                .wrst(1'b0),
577
                .wclk(wclk),
578
                .wce(wadr[1:0]==2'b11),
579
                .we(wr),
580
                .wadr(wadr[10:2]),
581
                .i(wadr),
582
                .wo(),
583
                .rrst(1'b0),
584
                .rclk(rclk),
585
                .rce(1'b1),
586
                .radr(radr[10:2]),
587
                .o(tag)
588
        );
589
 
590
 
591
always @(rclk)
592
        rradr <= radr;
593
 
594
assign hit = tag[31:11]==rradr[31:11];
595
 
596
endmodule
597
 
598
module overflow(op, a, b, s, v);
599
 
600
input op;       // 0=add,1=sub
601
input a;
602
input b;
603
input s;        // sum
604
output v;
605
 
606
// Overflow:
607
// Add: the signs of the inputs are the same, and the sign of the
608
// sum is different
609
// Sub: the signs of the inputs are different, and the sign of
610
// the sum is the same as B
611
assign v = (op ^ s ^ b) & (~op ^ a ^ b);
612
 
613 12 robfinch
endmodule
614 5 robfinch
 
615 12 robfinch
 
616 13 robfinch
module rtf65002d(rst_i, clk_i, nmi_i, irq_i, irq_vect, bte_o, cti_o, bl_o, lock_o, cyc_o, stb_o, ack_i, we_o, sel_o, adr_o, dat_i, dat_o);
617 5 robfinch
parameter IDLE = 3'd0;
618
parameter LOAD_DCACHE = 3'd1;
619
parameter LOAD_ICACHE = 3'd2;
620
parameter LOAD_IBUF1 = 3'd3;
621
parameter LOAD_IBUF2 = 3'd4;
622
parameter LOAD_IBUF3 = 3'd5;
623 10 robfinch
parameter RESET1 = 7'd0;
624 5 robfinch
parameter IFETCH = 7'd1;
625
parameter JMP_IND1 = 7'd2;
626
parameter JMP_IND2 = 7'd3;
627
parameter DECODE = 7'd4;
628
parameter STORE1 = 7'd5;
629
parameter STORE2 = 7'd6;
630
parameter LOAD1 = 7'd7;
631
parameter LOAD2 = 7'd8;
632
parameter IRQ1 = 7'd9;
633
parameter IRQ2 = 7'd10;
634
parameter IRQ3 = 7'd11;
635
parameter CALC = 7'd12;
636
parameter JSR1 = 7'd13;
637
parameter JSR_INDX1 = 7'd14;
638
parameter JSR161 = 7'd15;
639
parameter RTS1 = 7'd16;
640
parameter RTS2 = 7'd17;
641
parameter IX1 = 7'd18;
642
parameter IX2 = 7'd19;
643
parameter IX3 = 7'd20;
644
parameter IX4 = 7'd21;
645
parameter IY1 = 7'd22;
646
parameter IY2 = 7'd23;
647
parameter IY3 = 7'd24;
648
parameter PHP1 = 7'd27;
649
parameter PLP1 = 7'd28;
650
parameter PLP2 = 7'd29;
651
parameter PLA1 = 7'd30;
652
parameter PLA2 = 7'd31;
653
parameter BSR1 = 7'd32;
654
parameter BYTE_IX1 = 7'd33;
655
parameter BYTE_IX2 = 7'd34;
656
parameter BYTE_IX3 = 7'd35;
657
parameter BYTE_IX4 = 7'd36;
658
parameter BYTE_IX5 = 7'd37;
659
parameter BYTE_IY1 = 7'd38;
660
parameter BYTE_IY2 = 7'd39;
661
parameter BYTE_IY3 = 7'd40;
662
parameter BYTE_IY4 = 7'd41;
663
parameter BYTE_IY5 = 7'd42;
664
parameter RTS3 = 7'd43;
665
parameter RTS4 = 7'd44;
666
parameter RTS5 = 7'd45;
667
parameter BYTE_JSR1 = 7'd46;
668
parameter BYTE_JSR2 = 7'd47;
669
parameter BYTE_JSR3 = 7'd48;
670
parameter BYTE_IRQ1 = 7'd49;
671
parameter BYTE_IRQ2 = 7'd50;
672
parameter BYTE_IRQ3 = 7'd51;
673
parameter BYTE_IRQ4 = 7'd52;
674
parameter BYTE_IRQ5 = 7'd53;
675
parameter BYTE_IRQ6 = 7'd54;
676
parameter BYTE_IRQ7 = 7'd55;
677
parameter BYTE_IRQ8 = 7'd56;
678
parameter BYTE_IRQ9 = 7'd57;
679
parameter BYTE_JMP_IND1 = 7'd58;
680
parameter BYTE_JMP_IND2 = 7'd59;
681
parameter BYTE_JMP_IND3 = 7'd60;
682
parameter BYTE_JMP_IND4 = 7'd61;
683
parameter BYTE_JSR_INDX1 = 7'd62;
684
parameter BYTE_JSR_INDX2 = 7'd63;
685
parameter BYTE_JSR_INDX3 = 7'd64;
686
parameter RTI1 = 7'd65;
687
parameter RTI2 = 7'd66;
688
parameter RTI3 = 7'd67;
689
parameter RTI4 = 7'd68;
690
parameter BYTE_RTS1 = 7'd69;
691
parameter BYTE_RTS2 = 7'd70;
692
parameter BYTE_RTS3 = 7'd71;
693
parameter BYTE_RTS4 = 7'd72;
694
parameter BYTE_RTS5 = 7'd73;
695
parameter BYTE_RTS6 = 7'd74;
696
parameter BYTE_RTS7 = 7'd75;
697
parameter BYTE_RTS8 = 7'd76;
698
parameter BYTE_RTS9 = 7'd77;
699
parameter BYTE_RTI1 = 7'd78;
700
parameter BYTE_RTI2 = 7'd79;
701
parameter BYTE_RTI3 = 7'd80;
702
parameter BYTE_RTI4 = 7'd81;
703
parameter BYTE_RTI5 = 7'd82;
704
parameter BYTE_RTI6 = 7'd83;
705
parameter BYTE_RTI7 = 7'd84;
706
parameter BYTE_RTI8 = 7'd85;
707
parameter BYTE_RTI9 = 7'd86;
708
parameter BYTE_RTI10 = 7'd87;
709
parameter BYTE_JSL1 = 7'd88;
710
parameter BYTE_JSL2 = 7'd89;
711
parameter BYTE_JSL3 = 7'd90;
712
parameter BYTE_JSL4 = 7'd91;
713
parameter BYTE_JSL5 = 7'd92;
714
parameter BYTE_JSL6 = 7'd93;
715
parameter BYTE_JSL7 = 7'd94;
716
parameter BYTE_PLP1 = 7'd95;
717
parameter BYTE_PLP2 = 7'd96;
718
parameter BYTE_PLA1 = 7'd97;
719
parameter BYTE_PLA2 = 7'd98;
720 10 robfinch
parameter WAIT_DHIT = 7'd99;
721
parameter RESET2 = 7'd100;
722 12 robfinch
parameter MULDIV1 = 7'd101;
723
parameter MULDIV2 = 7'd102;
724 20 robfinch
parameter BYTE_DECODE = 7'd103;
725
parameter BYTE_CALC = 7'd104;
726 5 robfinch
 
727
input rst_i;
728
input clk_i;
729
input nmi_i;
730
input irq_i;
731 13 robfinch
input [8:0] irq_vect;
732 5 robfinch
output reg [1:0] bte_o;
733
output reg [2:0] cti_o;
734
output reg [5:0] bl_o;
735
output reg lock_o;
736
output reg cyc_o;
737
output reg stb_o;
738
input ack_i;
739
output reg we_o;
740
output reg [3:0] sel_o;
741
output reg [33:0] adr_o;
742
input [31:0] dat_i;
743
output reg [31:0] dat_o;
744
 
745
reg [6:0] state;
746 10 robfinch
reg [6:0] retstate;
747 5 robfinch
reg [2:0] cstate;
748
wire [55:0] insn;
749
reg [55:0] ibuf;
750
reg [31:0] bufadr;
751
 
752
reg cf,nf,zf,vf,bf,im,df,em;
753
reg em1;
754 10 robfinch
reg gie;
755 5 robfinch
reg nmoi;       // native mode on interrupt
756
wire [31:0] sr = {nf,vf,em,24'b0,bf,df,im,zf,cf};
757
wire [7:0] sr8 = {nf,vf,1'b0,bf,df,im,zf,cf};
758
reg nmi1,nmi_edge;
759
reg wai;
760
reg [31:0] acc;
761
reg [31:0] x;
762
reg [31:0] y;
763
reg [7:0] sp;
764 13 robfinch
reg [31:0] spage;        // stack page
765 5 robfinch
wire [7:0] acc8 = acc[7:0];
766
wire [7:0] x8 = x[7:0];
767
wire [7:0] y8 = y[7:0];
768
reg [31:0] isp;          // interrupt stack pointer
769 12 robfinch
wire [63:0] prod;
770
wire [31:0] q,r;
771
reg [31:0] tick;
772 5 robfinch
wire [7:0] sp_dec = sp - 8'd1;
773
wire [7:0] sp_inc = sp + 8'd1;
774
wire [31:0] isp_dec = isp - 32'd1;
775
wire [31:0] isp_inc = isp + 32'd1;
776
reg [31:0] pc;
777
wire [31:0] pcp1 = pc + 32'd1;
778
wire [31:0] pcp2 = pc + 32'd2;
779
wire [31:0] pcp3 = pc + 32'd3;
780
wire [31:0] pcp4 = pc + 32'd4;
781
wire [31:0] pcp8 = pc + 32'd8;
782 13 robfinch
reg [31:0] dp;           // 32 bit mode direct page register
783
reg [31:0] dp8;          // 8 bit mode direct page register
784
reg [31:0] abs8; // 8 bit mode absolute address register
785
reg [31:0] vbr;          // vector table base register
786 5 robfinch
wire bhit=pc==bufadr;
787
reg [31:0] regfile [15:0];
788
reg [55:0] ir;
789
wire [3:0] Ra = ir[11:8];
790
wire [3:0] Rb = ir[15:12];
791
reg [31:0] rfoa;
792
reg [31:0] rfob;
793
always @(Ra or x or y or acc)
794
case(Ra)
795
4'h0:   rfoa <= 32'd0;
796
4'h1:   rfoa <= acc;
797
4'h2:   rfoa <= x;
798
4'h3:   rfoa <= y;
799
default:        rfoa <= regfile[Ra];
800
endcase
801
always @(Rb or x or y or acc)
802
case(Rb)
803
4'h0:   rfob <= 32'd0;
804
4'h1:   rfob <= acc;
805
4'h2:   rfob <= x;
806
4'h3:   rfob <= y;
807
default:        rfob <= regfile[Rb];
808
endcase
809
reg [3:0] Rt;
810
reg [33:0] ea;
811
reg first_ifetch;
812 12 robfinch
reg [31:0] lfsr;
813
wire lfsr_fb;
814
xnor(lfsr_fb,lfsr[0],lfsr[1],lfsr[21],lfsr[31]);
815 5 robfinch
reg [31:0] a, b;
816 19 robfinch
wire [31:0] shlo = a << b[4:0];
817
wire [31:0] shro = a >> b[4:0];
818 5 robfinch
reg [7:0] b8;
819
reg [32:0] res;
820
reg [8:0] res8;
821
wire resv8,resv32;
822
wire resc8 = res8[8];
823
wire resc32 = res[32];
824
wire resz8 = res8[7:0]==8'h00;
825
wire resz32 = res[31:0]==32'd0;
826
wire resn8 = res8[7];
827
wire resn32 = res[31];
828
wire resn = em ? res8[7] : res[31];
829
wire resz = em ? res8[7:0]==8'h00 : res[31:0]==32'd0;
830
wire resc = em ? res8[8] : res[32];
831
wire resv = em ? resv8 : resv32;
832
 
833
reg [31:0] vect;
834
reg [31:0] ia;                   // temporary reg to hold indirect address
835 20 robfinch
wire [31:0] iapy8 = abs8 + ia + y[7:0];
836 5 robfinch
reg isInsnCacheLoad;
837
reg isDataCacheLoad;
838 10 robfinch
reg isCacheReset;
839 5 robfinch
wire hit0,hit1;
840
wire dhit;
841 10 robfinch
reg write_allocate;
842 5 robfinch
reg wr;
843
reg [3:0] wrsel;
844
reg [31:0] radr;
845
reg [1:0] radr2LSB;
846
wire [33:0] radr34 = {radr,radr2LSB};
847
wire [33:0] radr34p1 = radr34 + 34'd1;
848
reg [31:0] wadr;
849
reg [1:0] wadr2LSB;
850
reg [31:0] wdat;
851
wire [31:0] rdat;
852
reg imiss;
853
reg dmiss;
854
reg icacheOn,dcacheOn;
855 20 robfinch
wire unCachedData = radr[31:20]==12'hFFD || !dcacheOn;  // I/O area is uncached
856
wire unCachedInsn = pc[31:13]==19'h0 || !icacheOn;              // The lowest 8kB is uncached.
857 5 robfinch
 
858
wire isSub = ir[7:0]==`SUB_ZPX || ir[7:0]==`SUB_IX || ir[7:0]==`SUB_IY ||
859
                         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;
860
wire 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 ||
861
                         ir[7:0]==`SBC_ABS || ir[7:0]==`SBC_ABSX || ir[7:0]==`SBC_ABSY || ir[7:0]==`SBC_IMM;
862
wire isCmp = ir[7:0]==`CPX_ZPX || ir[7:0]==`CPX_ABS || ir[7:0]==`CPX_IMM32 ||
863
                         ir[7:0]==`CPY_ZPX || ir[7:0]==`CPY_ABS || ir[7:0]==`CPY_IMM32;
864
wire isRMW32 =
865
                         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 ||
866
                         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 ||
867
                         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 ||
868
                         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;
869
                         ;
870
wire isRMW8 =
871
                         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 ||
872
                         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 ||
873
                         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 ||
874
                         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 ||
875
                         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;
876
                         ;
877
wire isRMW = em ? isRMW8 : isRMW32;
878
wire 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;
879
wire isStb = ir[7:0]==`STB_ZPX || ir[7:0]==`STB_ABS || ir[7:0]==`STB_ABSX;
880
 
881 12 robfinch
wire ld_muldiv = state==DECODE && ir[7:0]==`RR;
882
wire md_done;
883
wire clk;
884
 
885
mult_div umd1
886
(
887
        .rst(rst),
888
        .clk(clk),
889
        .ld(ld_muldiv),
890
        .op(ir[23:20]),
891
        .a(rfoa),
892
        .b(rfob),
893
        .p(prod),
894
        .q(q),
895
        .r(r),
896
        .done(md_done)
897
);
898
 
899 5 robfinch
icachemem icm0 (
900 12 robfinch
        .wclk(clk),
901 5 robfinch
        .wr(ack_i & isInsnCacheLoad),
902
        .adr(adr_o),
903
        .dat(dat_i),
904
        .rclk(~clk_i),
905
        .pc(pc),
906
        .insn(insn)
907
);
908
 
909
tagmem tgm0 (
910 12 robfinch
        .wclk(clk),
911 10 robfinch
        .wr((ack_i & isInsnCacheLoad)|isCacheReset),
912
        .adr({adr_o[31:1],!isCacheReset}),
913 5 robfinch
        .rclk(~clk_i),
914
        .pc(pc),
915
        .hit0(hit0),
916
        .hit1(hit1)
917
);
918
 
919
wire ihit = (hit0 & hit1);//(pc[2:0] > 3'd1 ? hit1 : 1'b1));
920
 
921
dcachemem dcm0 (
922 12 robfinch
        .wclk(clk),
923 5 robfinch
        .wr(wr | (ack_i & isDataCacheLoad)),
924
        .sel(wr ? wrsel : sel_o),
925
        .wadr(wr ? wadr : adr_o[33:2]),
926
        .wdat(wr ? wdat : dat_i),
927
        .rclk(~clk_i),
928
        .radr(radr),
929
        .rdat(rdat)
930
);
931
 
932
dtagmem dtm0 (
933 12 robfinch
        .wclk(clk),
934 5 robfinch
        .wr(wr | (ack_i & isDataCacheLoad)),
935
        .wadr(wr ? wadr : adr_o[33:2]),
936
        .rclk(~clk_i),
937
        .radr(radr),
938
        .hit(dhit)
939
);
940
 
941
overflow uovr1 (
942
        .op(isSub),
943
        .a(a[31]),
944
        .b(b[31]),
945
        .s(res[31]),
946
        .v(resv32)
947
);
948
 
949
overflow uovr2 (
950
        .op(isSub8),
951
        .a(acc8[7]),
952
        .b(b8[7]),
953
        .s(res8[7]),
954
        .v(resv8)
955
);
956
 
957
wire [7:0] bcaio;
958
wire [7:0] bcao;
959
wire [7:0] bcsio;
960
wire [7:0] bcso;
961
wire bcaico,bcaco,bcsico,bcsco;
962
 
963
BCDAdd ubcdai1 (.ci(cf),.a(acc8),.b(ir[15:8]),.o(bcaio),.c(bcaico));
964
BCDAdd ubcda2 (.ci(cf),.a(acc8),.b(b8),.o(bcao),.c(bcaco));
965
BCDSub ubcdsi1 (.ci(cf),.a(acc8),.b(ir[15:8]),.o(bcsio),.c(bcsico));
966
BCDSub ubcds2 (.ci(cf),.a(acc8),.b(b8),.o(bcso),.c(bcsco));
967
 
968
reg [7:0] dati;
969
always @(radr2LSB or dat_i)
970
case(radr2LSB)
971
2'd0:   dati <= dat_i[7:0];
972
2'd1:   dati <= dat_i[15:8];
973
2'd2:   dati <= dat_i[23:16];
974
2'd3:   dati <= dat_i[31:24];
975
endcase
976
reg [7:0] rdat8;
977
always @(radr2LSB or rdat)
978
case(radr2LSB)
979
2'd0:   rdat8 <= rdat[7:0];
980
2'd1:   rdat8 <= rdat[15:8];
981
2'd2:   rdat8 <= rdat[23:16];
982
2'd3:   rdat8 <= rdat[31:24];
983
endcase
984
 
985
reg takb;
986
always @(ir or cf or vf or nf or zf)
987
case(ir[7:0])
988
`BEQ:   takb <= zf;
989
`BNE:   takb <= !zf;
990
`BPL:   takb <= !nf;
991
`BMI:   takb <= nf;
992
`BCS:   takb <= cf;
993
`BCC:   takb <= !cf;
994
`BVS:   takb <= vf;
995
`BVC:   takb <= !vf;
996
`BRA:   takb <= 1'b1;
997
`BRL:   takb <= 1'b1;
998 10 robfinch
//`BAZ: takb <= acc8==8'h00;
999
//`BXZ: takb <= x8==8'h00;
1000 5 robfinch
default:        takb <= 1'b0;
1001
endcase
1002
 
1003 13 robfinch
wire [31:0] zpx_address = dp8 + ir[15:8] + x8;
1004
wire [31:0] zpy_address = dp8 + ir[15:8] + y8;
1005
wire [31:0] zp_address = dp8 + ir[15:8];
1006
wire [31:0] abs_address = abs8 + {16'h0,ir[23:8]};
1007
wire [31:0] absx_address = abs8 + {16'h0,ir[23:8] + {8'h0,x8}};
1008
wire [31:0] absy_address = abs8 + {16'h0,ir[23:8] + {8'h0,y8}};
1009 5 robfinch
wire [31:0] zpx32xy_address = dp + ir[23:12] + rfoa;
1010
wire [31:0] absx32xy_address = ir[47:16] + rfob;
1011
wire [31:0] zpx32_address = dp + ir[31:20] + rfob;
1012
wire [31:0] absx32_address = ir[55:24] + rfob;
1013
 
1014
//-----------------------------------------------------------------------------
1015
// Clock control
1016
// - reset or NMI reenables the clock
1017
// - this circuit must be under the clk_i domain
1018
//-----------------------------------------------------------------------------
1019
//
1020
reg cpu_clk_en;
1021
reg clk_en;
1022
BUFGCE u20 (.CE(cpu_clk_en), .I(clk_i), .O(clk) );
1023
 
1024
always @(posedge clk_i)
1025
if (rst_i) begin
1026
        cpu_clk_en <= 1'b1;
1027
        nmi1 <= 1'b0;
1028
end
1029
else begin
1030
        nmi1 <= nmi_i;
1031
        if (nmi_i)
1032
                cpu_clk_en <= 1'b1;
1033
        else
1034
                cpu_clk_en <= clk_en;
1035
end
1036
 
1037
always @(posedge clk)
1038
if (rst_i) begin
1039
        bte_o <= 2'b00;
1040
        cti_o <= 3'b000;
1041
        bl_o <= 6'd0;
1042
        cyc_o <= 1'b0;
1043
        stb_o <= 1'b0;
1044
        we_o <= 1'b0;
1045
        sel_o <= 4'h0;
1046
        adr_o <= 34'd0;
1047
        dat_o <= 32'd0;
1048
        nmi_edge <= 1'b0;
1049
        wai <= 1'b0;
1050
        first_ifetch <= `TRUE;
1051
        wr <= 1'b0;
1052
        em <= 1'b0;
1053
        cf <= 1'b0;
1054
        ir <= 56'hEAEAEAEAEAEAEA;
1055
        imiss <= `FALSE;
1056
        dmiss <= `FALSE;
1057
        dcacheOn <= 1'b0;
1058
        icacheOn <= 1'b1;
1059 10 robfinch
        write_allocate <= 1'b0;
1060 5 robfinch
        nmoi <= 1'b1;
1061 10 robfinch
        state <= RESET1;
1062 5 robfinch
        cstate <= IDLE;
1063
        vect <= `RST_VECT;
1064
        pc <= 32'hFFFFFFF0;
1065 13 robfinch
        spage <= 32'h00000100;
1066 5 robfinch
        bufadr <= 32'd0;
1067
        dp <= 32'd0;
1068 13 robfinch
        dp8 <= 32'd0;
1069
        abs8 <= 32'd0;
1070 5 robfinch
        clk_en <= 1'b1;
1071 10 robfinch
        isCacheReset <= `TRUE;
1072
        gie <= 1'b0;
1073 12 robfinch
        tick <= 32'd0;
1074 5 robfinch
end
1075
else begin
1076 12 robfinch
tick <= tick + 32'd1;
1077 5 robfinch
wr <= 1'b0;
1078
if (nmi_i & !nmi1)
1079
        nmi_edge <= 1'b1;
1080
if (nmi_i|nmi1)
1081
        clk_en <= 1'b1;
1082
case(state)
1083 10 robfinch
RESET1:
1084 5 robfinch
        begin
1085 10 robfinch
                adr_o <= adr_o + 32'd4;
1086
                if (adr_o[13:4]==10'h3FF) begin
1087
                        state <= RESET2;
1088
                        isCacheReset <= `FALSE;
1089
                end
1090
        end
1091
RESET2:
1092
        begin
1093 5 robfinch
                vect <= `RST_VECT;
1094
                radr <= vect[31:2];
1095
                state <= JMP_IND1;
1096
        end
1097
 
1098 20 robfinch
`include "ifetch.v"
1099
`include "decode.v"
1100
`include "byte_decode.v"
1101 10 robfinch
 
1102 20 robfinch
`include "load.v"
1103
`include "store.v"
1104 10 robfinch
 
1105
WAIT_DHIT:
1106
        if (dhit)
1107
                state <= retstate;
1108 5 robfinch
 
1109
`include "byte_ix.v"
1110
`include "byte_iy.v"
1111
 
1112
// Indirect and indirect X addressing mode eg. LDA ($12,x) : (zp)
1113
IX1:
1114
        if (unCachedData) begin
1115
                cyc_o <= 1'b1;
1116
                stb_o <= 1'b1;
1117
                sel_o <= 4'hf;
1118
                adr_o <= {radr,2'b00};
1119
                state <= IX2;
1120
        end
1121
        else if (dhit) begin
1122
                radr <= rdat;
1123 20 robfinch
                wadr <= rdat;
1124
                wdat <= a;
1125
                if (ir[7:0]==`ST_IX)
1126
                        state <= STORE1;
1127
                else
1128
                        state <= LOAD1;
1129 5 robfinch
        end
1130
        else
1131
                dmiss <= `TRUE;
1132
IX2:
1133
        if (ack_i) begin
1134
                cyc_o <= 1'b0;
1135
                stb_o <= 1'b0;
1136
                sel_o <= 4'h0;
1137
                adr_o <= 34'h0;
1138
                radr <= dat_i;
1139 20 robfinch
                wadr <= dat_i;          // for stores
1140
                wdat <= a;
1141
                if (ir[7:0]==`ST_IX)
1142
                        state <= STORE1;
1143
                else
1144
                        state <= LOAD1;
1145 5 robfinch
        end
1146
 
1147
 
1148
// Indirect Y addressing mode eg. LDA ($12),y
1149
IY1:
1150
        if (unCachedData) begin
1151
                cyc_o <= 1'b1;
1152
                stb_o <= 1'b1;
1153
                sel_o <= 4'hf;
1154
                adr_o <= {radr,2'b00};
1155
                state <= IY2;
1156
        end
1157
        else if (dhit) begin
1158
                radr <= rdat;
1159
                state <= IY3;
1160
        end
1161
        else
1162
                dmiss <= `TRUE;
1163
IY2:
1164
        if (ack_i) begin
1165
                cyc_o <= 1'b0;
1166
                stb_o <= 1'b0;
1167
                sel_o <= 4'h0;
1168
                adr_o <= 34'h0;
1169
                radr <= dat_i;
1170
                state <= IY3;
1171
        end
1172
IY3:
1173
        begin
1174
                radr <= radr + y;
1175
                wadr <= radr + y;
1176 20 robfinch
                wdat <= a;
1177
                if (ir[7:0]==`ST_IY)
1178 5 robfinch
                        state <= STORE1;
1179
                else
1180
                        state <= LOAD1;
1181
        end
1182
 
1183 20 robfinch
`include "byte_calc.v"
1184 5 robfinch
`include "calc.v"
1185 20 robfinch
`include "byte_jsr.v"
1186
`include "byte_jsl.v"
1187 5 robfinch
 
1188
JSR1:
1189
        if (ack_i) begin
1190 10 robfinch
                state <= IFETCH;
1191
                retstate <= IFETCH;
1192 5 robfinch
                cyc_o <= 1'b0;
1193
                stb_o <= 1'b0;
1194
                we_o <= 1'b0;
1195
                sel_o <= 4'h0;
1196
                adr_o <= 34'd0;
1197
                dat_o <= 32'd0;
1198
                pc <= vect;
1199
                isp <= isp_dec;
1200
                if (dhit) begin
1201
                        wrsel <= sel_o;
1202
                        wr <= 1'b1;
1203
                end
1204 10 robfinch
                else if (write_allocate) begin
1205
                        state <= WAIT_DHIT;
1206
                        dmiss <= `TRUE;
1207
                end
1208 5 robfinch
        end
1209
 
1210
JSR_INDX1:
1211
        if (ack_i) begin
1212 10 robfinch
                state <= JMP_IND1;
1213
                retstate <= JMP_IND1;
1214 5 robfinch
                cyc_o <= 1'b0;
1215
                stb_o <= 1'b0;
1216
                we_o <= 1'b0;
1217
                sel_o <= 4'h0;
1218
                adr_o <= 34'd0;
1219
                dat_o <= 32'd0;
1220
                radr <= ir[39:8] + x;
1221
                isp <= isp_dec;
1222
                if (dhit) begin
1223
                        wrsel <= sel_o;
1224
                        wr <= 1'b1;
1225
                end
1226 10 robfinch
                else if (write_allocate) begin
1227
                        dmiss <= `TRUE;
1228
                        state <= WAIT_DHIT;
1229
                end
1230 5 robfinch
        end
1231 20 robfinch
 
1232 5 robfinch
JSR161:
1233
        if (ack_i) begin
1234 10 robfinch
                state <= IFETCH;
1235
                retstate <= IFETCH;
1236 5 robfinch
                cyc_o <= 1'b0;
1237
                stb_o <= 1'b0;
1238
                we_o <= 1'b0;
1239
                sel_o <= 4'h0;
1240
                pc <= {{16{ir[23]}},ir[23:8]};
1241
                isp <= isp_dec;
1242
                if (dhit) begin
1243
                        wrsel <= sel_o;
1244
                        wr <= 1'b1;
1245
                end
1246 10 robfinch
                else if (write_allocate) begin
1247
                        state <= WAIT_DHIT;
1248
                        dmiss <= `TRUE;
1249
                end
1250 5 robfinch
        end
1251
 
1252
`include "byte_plp.v"
1253
`include "byte_rts.v"
1254
`include "byte_rti.v"
1255
`include "rti.v"
1256
`include "rts.v"
1257
 
1258 20 robfinch
`include "php.v"
1259 5 robfinch
`include "plp.v"
1260
`include "pla.v"
1261
 
1262
`include "byte_irq.v"
1263
`include "byte_jmp_ind.v"
1264
 
1265
IRQ1:
1266
        if (ack_i) begin
1267 10 robfinch
                state <= IRQ2;
1268
                retstate <= IRQ2;
1269 5 robfinch
                cyc_o <= 1'b0;
1270
                stb_o <= 1'b0;
1271
                we_o <= 1'b0;
1272
                sel_o <= 4'h0;
1273
                isp <= isp_dec;
1274
                if (dhit) begin
1275
                        wrsel <= sel_o;
1276
                        wr <= 1'b1;
1277
                end
1278 10 robfinch
                else if (write_allocate) begin
1279
                        state <= WAIT_DHIT;
1280
                        dmiss <= `TRUE;
1281
                end
1282 5 robfinch
        end
1283
IRQ2:
1284
        begin
1285
                cyc_o <= 1'b1;
1286
                stb_o <= 1'b1;
1287
                we_o <= 1'b1;
1288
                sel_o <= 4'hF;
1289
                radr <= isp_dec;
1290
                wadr <= isp_dec;
1291
                wdat <= sr;
1292
                adr_o <= {isp_dec,2'b00};
1293
                dat_o <= sr;
1294
                state <= IRQ3;
1295
        end
1296
IRQ3:
1297
        if (ack_i) begin
1298 10 robfinch
                state <= JMP_IND1;
1299
                retstate <= JMP_IND1;
1300 5 robfinch
                cyc_o <= 1'b0;
1301
                stb_o <= 1'b0;
1302
                we_o <= 1'b0;
1303
                sel_o <= 4'h0;
1304
                isp <= isp_dec;
1305
                if (dhit) begin
1306
                        wrsel <= sel_o;
1307
                        wr <= 1'b1;
1308
                end
1309 10 robfinch
                else if (write_allocate) begin
1310
                        dmiss <= `TRUE;
1311
                        state <= WAIT_DHIT;
1312
                end
1313 5 robfinch
                radr <= vect[31:2];
1314
                if (!bf)
1315
                        im <= 1'b1;
1316
                em <= 1'b0;                     // make sure we process in native mode; we might have been called up during emulation mode
1317
        end
1318
JMP_IND1:
1319
        if (unCachedData) begin
1320
                cyc_o <= 1'b1;
1321
                stb_o <= 1'b1;
1322
                sel_o <= 4'hF;
1323
                adr_o <= {radr,2'b00};
1324
                state <= JMP_IND2;
1325
        end
1326
        else if (dhit) begin
1327
                pc <= rdat;
1328
                state <= IFETCH;
1329
        end
1330
        else
1331
                dmiss <= `TRUE;
1332
JMP_IND2:
1333
        if (ack_i) begin
1334
                cyc_o <= 1'b0;
1335
                stb_o <= 1'b0;
1336
                sel_o <= 4'h0;
1337
                adr_o <= 34'd0;
1338
                pc <= dat_i;
1339
                state <= IFETCH;
1340
        end
1341 12 robfinch
MULDIV1:
1342
        state <= MULDIV2;
1343
MULDIV2:
1344
        if (md_done) begin
1345
                state <= IFETCH;
1346
                case(ir[23:20])
1347
                `MUL_RR:        begin res <= prod[31:0]; end
1348
                `MULS_RR:       begin res <= prod[31:0]; end
1349
                `DIV_RR:        begin res <= q; end
1350
                `DIVS_RR:       begin res <= q; end
1351
                `MOD_RR:        begin res <= r; end
1352
                `MODS_RR:       begin res <= r; end
1353
                endcase
1354
        end
1355
 
1356 5 robfinch
endcase
1357
 
1358
`include "cache_controller.v"
1359
 
1360
end
1361
endmodule

powered by: WebSVN 2.1.0

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