1 |
8 |
gdevic |
//=============================================================================
|
2 |
|
|
// This module implements the instruction execute state logic.
|
3 |
|
|
//
|
4 |
|
|
// Copyright (C) 2014-2016 Goran Devic
|
5 |
|
|
//
|
6 |
|
|
// This program is free software; you can redistribute it and/or modify it
|
7 |
|
|
// under the terms of the GNU General Public License as published by the Free
|
8 |
|
|
// Software Foundation; either version 2 of the License, or (at your option)
|
9 |
|
|
// any later version.
|
10 |
|
|
//
|
11 |
|
|
// This program is distributed in the hope that it will be useful, but WITHOUT
|
12 |
|
|
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
13 |
|
|
// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
14 |
|
|
// more details.
|
15 |
|
|
//
|
16 |
|
|
// You should have received a copy of the GNU General Public License along
|
17 |
|
|
// with this program; if not, write to the Free Software Foundation, Inc.,
|
18 |
|
|
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
19 |
|
|
//=============================================================================
|
20 |
|
|
// Using a compiled format will include files generated by "gencompile.py" script
|
21 |
|
|
// These files are a processed version of "exec_matrix_compiled.vh"
|
22 |
|
|
// You would define this on Xilinx and undefine (comment out) on Altera
|
23 |
|
|
`define USE_COMPILED_FORMAT
|
24 |
|
|
|
25 |
|
|
module execute
|
26 |
|
|
(
|
27 |
|
|
//----------------------------------------------------------
|
28 |
|
|
// Control signals generated by the instruction execution
|
29 |
|
|
//----------------------------------------------------------
|
30 |
|
|
`include "exec_module.vh"
|
31 |
|
|
|
32 |
|
|
output reg nextM, // Last M cycle of any instruction
|
33 |
|
|
output reg setM1, // Last T clock of any instruction
|
34 |
|
|
output reg fFetch, // Function: opcode fetch cycle ("M1")
|
35 |
|
|
output reg fMRead, // Function: memory read cycle
|
36 |
|
|
output reg fMWrite, // Function: memory write cycle
|
37 |
|
|
output reg fIORead, // Function: IO Read cycle
|
38 |
|
|
output reg fIOWrite, // Function: IO Write cycle
|
39 |
|
|
|
40 |
|
|
//----------------------------------------------------------
|
41 |
|
|
// Inputs from the instruction decode PLA
|
42 |
|
|
//----------------------------------------------------------
|
43 |
|
|
input wire [104:0] pla, // Statically decoded instructions
|
44 |
|
|
|
45 |
|
|
//----------------------------------------------------------
|
46 |
|
|
// Inputs from various blocks
|
47 |
|
|
//----------------------------------------------------------
|
48 |
|
|
input wire in_intr, // Servicing maskable interrupt
|
49 |
|
|
input wire in_nmi, // Servicing non-maskable interrupt
|
50 |
|
|
input wire in_halt, // Currently in HALT mode
|
51 |
|
|
input wire im1, // Interrupt Mode 1
|
52 |
|
|
input wire im2, // Interrupt Mode 2
|
53 |
|
|
input wire use_ixiy, // Special decode signal
|
54 |
|
|
input wire flags_cond_true, // Flags condition is true
|
55 |
|
|
input wire repeat_en, // Enable repeat of a block instruction
|
56 |
|
|
input wire flags_zf, // ZF to test a condition
|
57 |
|
|
input wire flags_nf, // NF to test for subtraction
|
58 |
|
|
input wire flags_sf, // SF to test for 8-bit sign of a value
|
59 |
|
|
input wire flags_cf, // CF to set HF for CCF
|
60 |
|
|
|
61 |
|
|
//----------------------------------------------------------
|
62 |
|
|
// Machine and clock cycles
|
63 |
|
|
//----------------------------------------------------------
|
64 |
|
|
input wire M1, // Machine cycle #1
|
65 |
|
|
input wire M2, // Machine cycle #2
|
66 |
|
|
input wire M3, // Machine cycle #3
|
67 |
|
|
input wire M4, // Machine cycle #4
|
68 |
|
|
input wire M5, // Machine cycle #5
|
69 |
|
|
input wire T1, // T-cycle #1
|
70 |
|
|
input wire T2, // T-cycle #2
|
71 |
|
|
input wire T3, // T-cycle #3
|
72 |
|
|
input wire T4, // T-cycle #4
|
73 |
|
|
input wire T5, // T-cycle #5
|
74 |
|
|
input wire T6 // T-cycle #6
|
75 |
|
|
);
|
76 |
|
|
|
77 |
|
|
// Detects unknown instructions by signalling the known ones
|
78 |
|
|
reg validPLA; // Valid PLA asserts this reg
|
79 |
|
|
// Activates a state machine to compute WZ=IX+d; takes 5T cycles
|
80 |
|
|
reg ixy_d; // Compute WX=IX+d
|
81 |
13 |
gdevic |
// Signals the setting of IX/IY prefix flags; inhibits clearing them
|
82 |
8 |
gdevic |
reg setIXIY; // Set IX/IY flag at the next T cycle
|
83 |
|
|
// Holds asserted by non-repeating versions of block instructions (LDI/CPI,...)
|
84 |
|
|
reg nonRep; // Non-repeating block instruction
|
85 |
|
|
// Suspends incrementing PC through address latch unless in HALT or interrupt mode
|
86 |
|
|
reg pc_inc_hold; // Normally 0 unless in one of those modes
|
87 |
|
|
|
88 |
|
|
//--------------------------------------------------------------
|
89 |
|
|
// Define various shortcuts to field naming
|
90 |
|
|
//--------------------------------------------------------------
|
91 |
|
|
`define GP_REG_BC 2'h0
|
92 |
|
|
`define GP_REG_DE 2'h1
|
93 |
|
|
`define GP_REG_HL 2'h2
|
94 |
|
|
`define GP_REG_AF 2'h3
|
95 |
|
|
|
96 |
|
|
`define PFSEL_P 2'h0
|
97 |
|
|
`define PFSEL_V 2'h1
|
98 |
|
|
`define PFSEL_IFF2 2'h2
|
99 |
|
|
`define PFSEL_REP 2'h3
|
100 |
|
|
|
101 |
|
|
//--------------------------------------------------------------
|
102 |
|
|
// Make available different bits and sections of the opcode byte
|
103 |
|
|
//--------------------------------------------------------------
|
104 |
|
|
wire op0 = pla[99];
|
105 |
|
|
wire op1 = pla[100];
|
106 |
|
|
wire op2 = pla[101];
|
107 |
|
|
wire op3 = pla[102];
|
108 |
|
|
wire op4 = pla[103];
|
109 |
|
|
wire op5 = pla[104];
|
110 |
|
|
|
111 |
|
|
wire [1:0] op21 = { pla[101], pla[100] };
|
112 |
|
|
wire [1:0] op54 = { pla[104], pla[103] };
|
113 |
|
|
|
114 |
|
|
//--------------------------------------------------------------
|
115 |
|
|
// 8-bit register selections needs to swizzle mux for A and F
|
116 |
|
|
//--------------------------------------------------------------
|
117 |
|
|
wire rsel0 = op0 ^ (op1 & op2);
|
118 |
|
|
wire rsel3 = op3 ^ (op4 & op5);
|
119 |
|
|
|
120 |
|
|
`ifdef USE_COMPILED_FORMAT
|
121 |
|
|
`include "temp_wires.vh" // Define all temp wires used with compiled equations
|
122 |
|
|
`endif
|
123 |
|
|
|
124 |
|
|
always @(*) // always_comb
|
125 |
|
|
begin
|
126 |
|
|
//-----------------------------------------------------------------------------
|
127 |
|
|
// Default assignment of all control outputs to 0 to prevent generating latches
|
128 |
|
|
//-----------------------------------------------------------------------------
|
129 |
|
|
`include "exec_zero.vh" // Initial assignment to all ctl wires to zero
|
130 |
|
|
|
131 |
|
|
// Reset internal control regs
|
132 |
|
|
validPLA = 0; // Will be set by every *valid* PLA entry
|
133 |
|
|
nextM = 0; // Will be set to advance to the next M cycle
|
134 |
|
|
setM1 = 0; // Will be set on a last M/T cycle of an instruction
|
135 |
|
|
|
136 |
|
|
// Reset global machine cycle functions
|
137 |
|
|
fFetch = M1; // Fetch is aliased to M1
|
138 |
|
|
fMRead = 0; fMWrite = 0; fIORead = 0; fIOWrite = 0;
|
139 |
|
|
ixy_d = 0;
|
140 |
|
|
setIXIY = 0;
|
141 |
|
|
nonRep = 0;
|
142 |
|
|
pc_inc_hold = 0;
|
143 |
|
|
|
144 |
|
|
//-------------------------------------------------------------------------
|
145 |
|
|
// State-based signal assignment; code generated from Timings spreadsheet
|
146 |
|
|
//-------------------------------------------------------------------------
|
147 |
|
|
`ifdef USE_COMPILED_FORMAT
|
148 |
|
|
`include "exec_matrix_compiled.vh" // Compiled execution equations
|
149 |
|
|
`else
|
150 |
|
|
`include "exec_matrix.vh" // Execution statements in the original nested-if format
|
151 |
|
|
`endif
|
152 |
|
|
|
153 |
|
|
// Needed by data bus 0 override logic, make only one bus writer active at any time
|
154 |
|
|
ctl_bus_db_oe = ctl_bus_db_oe & ~(ctl_bus_zero_oe | ctl_bus_ff_oe);
|
155 |
|
|
|
156 |
|
|
end
|
157 |
|
|
|
158 |
|
|
endmodule
|