dmgcpu

Форк
0
/
Bottom.v 
224 строки · 5.2 Кб
1
`timescale 1ns/1ns
2

3
module Bottom ( CLK2, CLK4, CLK5, CLK6, CLK7, DL, DV, bc, bq4, bq5, bq7, Temp_C, Temp_H, Temp_N, Temp_Z, alu, Res, IR, d, w, x, 
4
	SYNC_RES, TTB1, TTB2, TTB3, BUS_DISABLE, bro, A );
5

6
	input CLK2;
7
	input CLK4;
8
	input CLK5;
9
	input CLK6;
10
	input CLK7; 
11

12
	inout [7:0] DL;			// Internal databus
13
	output [7:0] DV;		// ALU Operand2
14
	input [5:0] bc;
15
	output bq4;
16
	output bq5;
17
	output bq7;
18
	output Temp_C;		// Flag C from temp Z register
19
	output Temp_H;		// Flag H from temp Z register
20
	output Temp_N;		// Flag N from temp Z register
21
	output Temp_Z;			// Flag Z from temp Z register  / zbus msb
22
	output [7:0] alu; 		// ALU Operand1
23
	input [7:0] Res;		// ALU Result
24

25
	output [7:0] IR;		// Current opcode
26
	input [106:0] d;		// Decoder1 output
27
	input [40:0] w;			// Decoder2 output
28
	input [68:0] x;			// Decoder3 output
29

30
	input SYNC_RES;
31
	input TTB1;				// 1: Perform pairwise increment/decrement (simultaneously for two 8-bit IncDec halves)
32
	input TTB2;				// 1: Perform decrement
33
	input TTB3;				// 1: Perform increment
34
	input BUS_DISABLE;			// 1: Bus disable
35
	input [7:3] bro; 		// IRQ Logic interrupt address
36
	output [15:0] A;		// External core address bus
37

38
	// Internal bottom buses
39

40
	wire [7:0] abus;
41
	wire [7:0] bbus;
42
	wire [7:0] cbus;
43
	wire [7:0] dbus;
44
	wire [7:0] ebus;
45
	wire [7:0] fbus;
46
	wire [7:0] zbus;
47
	wire [7:0] wbus;
48
	wire [7:0] adl;
49
	wire [7:0] adh;
50

51
	wire [7:0] Aout;	// Reg A out to bq Logic
52

53
	// Implementation
54

55
	BusPrecharge precharge (
56
		.CLK2(CLK2),
57
		.DL(DL),
58
		.abus(abus),
59
		.bbus(bbus),
60
		.cbus(cbus),
61
		.dbus(dbus) );
62

63
	BottomLeftLogic bottom_left (
64
		.CLK2(CLK2),
65
		.bc(bc),
66
		.bq4(bq4),
67
		.bq5(bq5),
68
		.bq7(bq7),
69
		.Aout(Aout),
70
		.abus(abus),
71
		.bbus(bbus),
72
		.alu(alu),
73
		.DV(DV) );
74

75
	RegsBuses regs (
76
		.CLK5(CLK5),
77
		.CLK6(CLK6),
78
		.w(w),
79
		.x(x),
80
		.DL(DL),
81
		.IR(IR),
82
		.abus(abus),
83
		.bbus(bbus),
84
		.cbus(cbus),
85
		.dbus(dbus),
86
		.ebus(ebus),
87
		.fbus(fbus),
88
		.Aout(Aout) );
89

90
	TempRegsBuses temp_regs (
91
		.CLK4(CLK4),
92
		.CLK5(CLK5),
93
		.CLK6(CLK6),
94
		.d60(`s1_op_ld_nn_sp_s010),
95
		.w(w),
96
		.x(x),
97
		.DL(DL),
98
		.bbus(bbus),
99
		.cbus(cbus),
100
		.dbus(dbus),
101
		.ebus(ebus),
102
		.fbus(fbus),
103
		.zbus(zbus),
104
		.wbus(wbus),
105
		.Res(Res),
106
		.adl(adl),
107
		.adh(adh) );
108

109
	SP sp (
110
		.CLK5(CLK5),
111
		.CLK6(CLK6),
112
		.CLK7(CLK7),
113
		.IR4(IR[4]),
114
		.IR5(IR[5]),
115
		.d60(`s1_op_ld_nn_sp_s010),
116
		.d66(`s1_op_ld_nn_sp_s011),
117
		.w(w),
118
		.x(x),
119
		.DL(DL),
120
		.abus(abus),
121
		.bbus(bbus),
122
		.cbus(cbus),
123
		.dbus(dbus),
124
		.zbus(zbus),
125
		.wbus(wbus),
126
		.adl(adl),
127
		.adh(adh) );
128

129
	PC pc (
130
		.CLK5(CLK5),
131
		.CLK6(CLK6),
132
		.CLK7(CLK7),
133
		.d92(`s1_op_rst_sx10),
134
		.w(w),
135
		.x(x),
136
		.DL(DL),
137
		.abus(abus),
138
		.cbus(cbus),
139
		.dbus(dbus),
140
		.zbus(zbus),
141
		.wbus(wbus),
142
		.adl(adl),
143
		.adh(adh),
144
		.IR(IR),
145
		.bro(bro),
146
		.SYNC_RES(SYNC_RES) );
147

148
	IncDec incdec (
149
		.CLK4(CLK4),
150
		.TTB1(TTB1),
151
		.TTB2(TTB2),
152
		.TTB3(TTB3),
153
		.BUS_DISABLE(BUS_DISABLE),
154
		.cbus(cbus),
155
		.dbus(dbus),
156
		.adl(adl),
157
		.adh(adh),
158
		.AddrBus(A) );
159

160
	assign Temp_C = zbus[4];
161
	assign Temp_H = zbus[5];
162
	assign Temp_N = zbus[6];
163
	assign Temp_Z = zbus[7];
164

165
endmodule // Bottom
166

167
module BusPrecharge ( CLK2, DL, abus, bbus, cbus, dbus );
168

169
	input CLK2;
170
	output [7:0] DL;
171
	output [7:0] abus;
172
	output [7:0] bbus;
173
	output [7:0] cbus;
174
	output [7:0] dbus;
175

176
	assign   DL = CLK2 ? 8'bzzzzzzzz : 8'b11111111;
177
	assign abus = CLK2 ? 8'bzzzzzzzz : 8'b11111111;
178
	assign bbus = CLK2 ? 8'bzzzzzzzz : 8'b11111111;
179
	assign cbus = CLK2 ? 8'bzzzzzzzz : 8'b11111111;
180
	assign dbus = CLK2 ? 8'bzzzzzzzz : 8'b11111111;
181

182
endmodule // BusPrecharge
183

184
// It is very difficult to put this circuit into any category. It belongs to both ALU and registers at the same time, and is generally at the bottom. So it's going to stay here untouched for now.
185
module BottomLeftLogic ( CLK2, bc, bq4, bq5, bq7, Aout, abus, bbus, alu, DV );
186

187
	input CLK2;
188
	input [5:0] bc;
189
	output bq4;
190
	output bq5;
191
	output bq7;
192
	input [7:0] Aout; 		// Current value of the `A` register  (directly from the register bits output)
193
	input [7:0] abus; 		// ⚠️ inverse hold (active low)
194
	input [7:0] bbus; 		// ⚠️ inverse hold (active low)
195
	output [7:0] alu; 		// abus -> ALU Operand 1
196
	output [7:0] DV; 		// bbus -> ALU Operand 2
197

198
	wire [7:0] abq; 	// abus Bus keepers outputs
199
	wire [7:0] bbq; 	// bbus Bus keepers outputs
200

201
	assign bq4 = Aout[1] | Aout[2] | Aout[3];
202
	assign bq5 = Aout[5] | Aout[6] | Aout[7];
203
	assign bq7 = Aout[4] & Aout[7];
204
	
205
	// This requires transparent latches, since nobody could set up a abus/bbus. On the actual circuit, they are also present as a memory on the `not` gate.
206
	BusKeeper abus_keepers [7:0] ( .d(abus), .q(abq) );
207
	BusKeeper bbus_keepers [7:0] ( .d(bbus), .q(bbq) );
208

209
	// TODO: wtf is this at all?
210

211
	assign DV[0] = ~(CLK2 ? (bbq[0] & ~bc[4]) : 1'b1);
212
	assign DV[1] = ~(CLK2 ? (bbq[1] & ~bc[4]) : 1'b1);
213
	assign DV[2] = ~(CLK2 ? (bbq[2] & ~bc[4]) : 1'b1);
214
	assign DV[3] = ~(CLK2 ? (bbq[3] & ~bc[4]) : 1'b1);
215
	assign DV[4] = ~(CLK2 ? (bbq[4] & ~(bc[4] | (bc[0] & bc[1])) ) : 1'b1);
216
	assign DV[5] = ~(CLK2 ? (bbq[5] & ~(bc[4] | (bc[0] & bc[5])) ) : 1'b1);
217
	assign DV[6] = ~(CLK2 ? (bbq[6] & ~(bc[4] | (bc[0] & bc[2])) ) : 1'b1);
218
	assign DV[7] = ~(CLK2 ? (bbq[7] & ~(bc[4] | (bc[0] & bc[3])) ) : 1'b1);
219

220
	assign alu = ~abq;
221

222
	// I decided to put the bc0/bc4 generation in the ALU, so that the bc signals would be made as output from the ALU (for beauty).
223

224
endmodule // BottomLeftLogic
225

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.