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

Subversion Repositories hd63701

[/] [hd63701/] [trunk/] [HD63701_EXEC.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 thasega
/***************************************************************************
2
       This file is part of "HD63701V0 Compatible Processor Core".
3
****************************************************************************/
4
`timescale 1ps / 1ps
5
`include "HD63701_defs.i"
6
 
7
module HD63701_EXEC
8
(
9
        input                                           CLK,
10
        input                                           RST,
11
 
12
        input                   [7:0]            DI,
13
 
14
        output    [15:0]         AD,
15
        output reg                              RW,
16
        output reg  [7:0]                DO,
17
 
18
        input           `mcwidth                mcode,
19
        output reg      [7:0]            vect,
20
        output                                  inte,
21
        input                                           fncu,
22
 
23
        output  [15:0]           REG_D,
24
        output  [15:0]           REG_X,
25
        output  [15:0]           REG_S,
26
        output   [5:0]           REG_C
27
);
28
 
29
// MicroCode Format
30
wire       mcpi = mcode[0];
31
wire [2:0] mcam = mcode[3:1];
32
wire [2:0] mcph = mcode[6:4];
33
wire [3:0] mcr2 = mcode[10:7];
34
wire [3:0] mcr1 = mcode[14:11];
35
wire [3:0] mcr0 = mcode[18:15];
36
wire [4:0] mcop = mcode[23:19];
37
 
38
wire              mcnw = (mcop==`mcCCB)|(mcop==`mcSCB)|(mcop==`mcAPC)|
39
                                                (mcop==`mcLDV)|(mcop==`mcINT);
40
 
41
wire [7:0] mccf = {mcr0,mcr1};   // case of mcCCB & mcSCB & mcAPC
42
wire [7:0] mcva = {mcr0,mcr1};   // case of mcLDV & mcINT
43
 
44
 
45
// Registers
46
reg  [15:0] rT, rE, rD, rX, rS, rSp, rP;
47
reg     [5:0]    rC;
48
 
49
`define rA      rD[15:8]
50
`define rB      rD[7:0]
51
`define rU      rT[15:8]
52
`define rV      rT[7:0]
53
 
54
 
55
// ALU
56
wire IsCCR   = (mcop==`mcCCB)|(mcop==`mcSCB);
57
wire IsCChit = (({(rC[1]^rC[3]),rC} & mccf[6:0]) == 7'h0) ^ mccf[7];
58
 
59
wire [15:0] R0, R1, RR;
60
wire  [5:0] CC;
61
 
62
HD63701_DSEL13 sR0(
63
        .o(R0),
64
        .f0((mcr0 == `mcrC)|IsCCR),.d0({10'b00000000_11,rC}),
65
        .f1(mcr0 == `mcrA), .d1({8'h0,`rA}),
66
        .f2(mcr0 == `mcrB), .d2({8'h0,`rB}),
67
        .f3(mcr0 == `mcrD), .d3(rD),
68
        .f4(mcr0 == `mcrX), .d4(rX),
69
        .f5(mcr0 == `mcrS), .d5(rS),
70
        .f6(mcr0 == `mcrP), .d6(rP),
71
        .f7(mcr0 == `mcrU), .d7({8'h0,`rU}),
72
        .f8(mcr0 == `mcrV), .d8({8'h0,`rV}),
73
        .f9(mcr0 == `mcrN), .d9({DI,8'h0}),
74
        .fA(mcr0 == `mcrM), .dA({8'h0,DI}),
75
        .fB(mcr0 == `mcrT), .dB(rT),
76
        .fC(mcr0 == `mcrE), .dC(rE)
77
);
78
 
79
HD63701_DSEL13 sR1(
80
        .o(R1),
81
        .f0((mcr1 == `mcrC)|IsCCR),.d0({10'b00000000_11,rC}),
82
        .f1(mcr1 == `mcrA), .d1({8'h0,`rA}),
83
        .f2(mcr1 == `mcrB), .d2({8'h0,`rB}),
84
        .f3(mcr1 == `mcrD), .d3(rD),
85
        .f4(mcr1 == `mcrX), .d4(rX),
86
        .f5(mcr1 == `mcrS), .d5(rS),
87
        .f6(mcr1 == `mcrP), .d6(rP),
88
        .f7(mcr1 == `mcrU), .d7({8'h0,`rU}),
89
        .f8(mcr1 == `mcrV), .d8({8'h0,`rV}),
90
        .f9(mcr1 == `mcrN), .d9({DI,8'h0}),
91
        .fA(mcr1 == `mcrM), .dA({8'h0,DI}),
92
        .fB(mcr1 == `mcrT), .dB(rT),
93
        .fC(mcr1 == `mcrE), .dC(rE)
94
);
95
 
96
HD63701_ALU ALU(
97
        .op(mcop),.cf(mccf),.bw((mcr2==`mcrn) ? mcr0[2] : mcr2[2]),
98
        .R0(R0),.R1(R1),.C(rC[0]),
99
        .RR(RR),.RC(CC)
100
);
101
 
102
 
103
// Bus Control
104
HD63701_DSEL8 sAB(
105
        .o(AD),
106
        .f0(mcam==`amPC), .d0(rP),
107
        .f1(mcam==`amP1), .d1(rP+16'h1),
108
        .f2(mcam==`amSP), .d2(rS),
109
        .f3(mcam==`amS1), .d3(rS+16'h1),
110
        .f4(mcam==`amX0), .d4(rX),
111
        .f5(mcam==`amXT), .d5(rX+rT),
112
        .f6(mcam==`amE0), .d6(rE),
113
        .f7(mcam==`amE1), .d7(rE+16'h1)
114
);
115
 
116
 
117
// Update Registers
118
reg [4:0] pmcop;
119
always @( posedge CLK ) begin
120
                  if (pmcop==`mcPSH) rS <= rSp-16'h1;
121
        else if (pmcop==`mcPUL) rS <= rSp+16'h1;
122
        else rS <= rSp;
123
end
124
 
125
wire noCCop = (mcop!=`mcLDV)&(mcop!=`mcLDN)&(mcop!=`mcPSH)&(mcop!=`mcPUL)&(mcop!=`mcAPC)&(mcop!=`mcTST)&(~fncu);
126
wire noCCrg = (mcr2!=`mcrC )&(mcr2!=`mcrS )&(mcr2!=`mcrP )&(mcr0!=`mcrC );
127
 
128
always @( negedge CLK or posedge RST ) begin
129
        if (RST) begin
130
                pmcop <= 0;
131
                vect <= 0;
132
                rT   <= 0;
133
                rE   <= 0;
134
                rP   <= 0;
135
                rC   <= 6'b010000;
136
                DO   <= 0;
137
        end
138
        else begin
139
                if ((mcr2!=`mcrP)&(mcpi==`pcI)) rP <= rP+16'h1;
140
                if (noCCrg & noCCop) rC <= {CC[5],rC[4],CC[3:0]};
141
                if (mcr2!=`mcrS) rSp <= rS;
142
                case (mcop)
143
                        `mcXTD: begin rT <= rX; rX <= rD; end
144
                        `mcAPC: if (IsCChit) rP <= rP+{{8{rT[7]}},rT[7:0]};
145
                        `mcINT: vect <= mcva;
146
                        `mcLDV: rE   <= {8'hFF,mcva};
147
                        `mcTST: rC   <= {rC[5:3],CC[2],rC[1:0]};
148
                  default: case (mcr2)
149
                                        `mcrA: `rA  <= RR[7:0];
150
                                        `mcrB: `rB  <= RR[7:0];
151
                                        `mcrC:  rC  <= RR[5:0];
152
                                        `mcrD:  rD  <= RR;
153
                                        `mcrX:  rX  <= RR;
154
                                        `mcrS:  rSp <= RR;
155
                                        `mcrP:  rP  <= RR;
156
                                        `mcrU: `rU  <= RR[7:0];
157
                                        `mcrV: `rV  <= RR[7:0];
158
                                        `mcrT:  rT  <= RR;
159
                                        `mcrE:  rE  <= RR;
160
                                 default:;
161
                        endcase
162
                endcase
163
                DO <=  mcnw ? 8'h0 :
164
                                (mcr2==`mcrN) ? RR[15:8] :
165
                           (mcr2==`mcrM) ? RR[ 7:0] :
166
                                 8'h0;
167
 
168
                pmcop <= mcop;
169
        end
170
end
171
 
172
wire RWRES = CLK;
173
always @( negedge CLK or posedge RWRES ) begin
174
        if (RWRES) RW <= 0;
175
        else begin
176
                RW <= ((mcr2==`mcrN)|(mcr2==`mcrM)) & (~mcnw);
177
        end
178
end
179
 
180
assign inte = ~rC[4];
181
 
182
 
183
assign REG_D = rD;
184
assign REG_X = rX;
185
assign REG_S = rS;
186
assign REG_C = rC;
187
 
188
endmodule
189
 
190
 
191
module HD63701_DSEL13
192
(
193
        output [15:0] o,
194
 
195
        input f0, input [15:0] d0,
196
        input f1, input [15:0] d1,
197
        input f2, input [15:0] d2,
198
        input f3, input [15:0] d3,
199
        input f4, input [15:0] d4,
200
        input f5, input [15:0] d5,
201
        input f6, input [15:0] d6,
202
        input f7, input [15:0] d7,
203
        input f8, input [15:0] d8,
204
        input f9, input [15:0] d9,
205
        input fA, input [15:0] dA,
206
        input fB, input [15:0] dB,
207
        input fC, input [15:0] dC
208
);
209
 
210
assign o =
211
                        f0 ? d0 :
212
                        f1 ? d1 :
213
                        f2 ? d2 :
214
                        f3 ? d3 :
215
                        f4 ? d4 :
216
                        f5 ? d5 :
217
                        f6 ? d6 :
218
                        f7 ? d7 :
219
                        f8 ? d8 :
220
                        f9 ? d9 :
221
                        fA ? dA :
222
                        fB ? dB :
223
                        fC ? dC :
224
                        16'h0 ;
225
 
226
endmodule
227
 
228
 
229
module HD63701_DSEL8
230
(
231
        output [15:0] o,
232
 
233
        input f0, input [15:0] d0,
234
        input f1, input [15:0] d1,
235
        input f2, input [15:0] d2,
236
        input f3, input [15:0] d3,
237
        input f4, input [15:0] d4,
238
        input f5, input [15:0] d5,
239
        input f6, input [15:0] d6,
240
        input f7, input [15:0] d7
241
);
242
 
243
assign o =
244
                        f0 ? d0 :
245
                        f1 ? d1 :
246
                        f2 ? d2 :
247
                        f3 ? d3 :
248
                        f4 ? d4 :
249
                        f5 ? d5 :
250
                        f6 ? d6 :
251
                        f7 ? d7 :
252
                        16'h0 ;
253
 
254
endmodule
255
 

powered by: WebSVN 2.1.0

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