-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathPAL_44401B.v
147 lines (111 loc) · 4.7 KB
/
PAL_44401B.v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
// 44401B,5D,BTIM
// PAL16R4D (https://rocelec.widen.net/view/pdf/c6dwcslffz/VANTS00080-1.pdf)
// PCB 3202D sheet 6:
//
// PAL input signal PD1 is connected to PAL OE_n (and PD1 to PD4 is ALWAYS 0/FALSE in the 3202 circuit board)
// input signal OSC is connectec to PAL CK pin
// I/O 1,2,7, and 8 is not controlled by OE_n
// Four D flip-flops controleed by CLK signal (and reads input to O3,O4,O5 and O6) when transision from LOW to HIGH.
// O3-O6 output is controlled by OE_n (HIGH signal means output is three-state)
module PAL_44401B(
input CK,
input OE_n,
input CC2_n, // I0
input CACT_n, // I1
input CACT25_n, // I2
input BDRY50_n, // I3
input CGNT_n, // I4
input CGNT50_n, // I5
input TERM_n, // I6
input IORQ_n, // I7
output Q0_n, // Q0_n
output Q1_n, // Q1_n
output Q2_n, // Q2_n
// Q3_n (not connected, no signal)
output APR_n, // B0_n
output DAP_n, // B1_n
output EIOD_n, // B2_n
output EADR_n // B3_n
);
// Creating non-negated wires for active-low inputs
wire CC2 = ~CC2_n;
wire CACT = ~CACT_n;
wire CACT25 = ~CACT25_n;
wire CGNT = ~CGNT_n;
wire IORQ = ~IORQ_n;
// Temporary removed because of "unused" warning.
// Which is related to " Feedback to public clock or circular logic: 'DAP_n'"
//wire DAP = ~DAP_n;
// Logic for Q0, Q1, Q2
reg Q0, Q1, Q2;
// Flip-flop logic for Q0, Q1, Q2
always @(posedge CK) begin
Q0 <=
(CACT & Q2_n & Q1_n & Q0_n & CACT25_n) |
(Q2_n & Q1_n & Q0) |
(Q2 & Q1 & Q0) |
(Q2 & Q1 & Q0_n);
Q1 <=
(Q2_n & Q0 & Q1) |
(Q2_n & Q0 & Q1_n) |
(Q1 & Q0_n & Q2) |
(Q1 & Q0_n & Q2_n);
Q2 <=
(Q1 & Q0_n & Q2) |
(Q1 & Q0_n & Q2_n) |
(Q2 & Q0 & Q1) |
(Q2 & Q0 & Q1_n);
end
// Output logic for Q0_n, Q1_n, Q2_n
assign Q0_n = OE_n ? 1'b0 : ~Q0;
assign Q1_n = OE_n ? 1'b0 : ~Q1;
assign Q2_n = OE_n ? 1'b0 : ~Q2;
// Logic for APR
assign APR_n = ~(Q2_n & Q1 & CACT);
// Logic for EADR_n (active-low)
assign EADR_n = ~(
(Q2_n & Q0 & CACT) | // t + u
(Q2_n & Q1 & CACT) | // u + v
(Q1 & Q0_n & CACT) | // v + w
(Q2_n & Q1_n & Q0_n & CACT & CACT25_n) | // s
(CGNT & CGNT50_n)); // address part for CPU cycle
// Logic for DAP
reg DAP;
always @(*) begin
if (Q2_n & Q1_n & Q0_n & CACT & CACT25)
DAP = 1'b1;
else if ((TERM_n & IORQ & CC2) == 0)
DAP = 1'b0;
end
assign DAP_n = ~DAP;
// Logic for EIOD_n (active-low)
assign EIOD_n = ~(IORQ & Q2_n & Q1_n & Q0_n & CACT & CACT25 & BDRY50_n & CC2);
// STARTS WHEN THE s STATE HAS BEEN REACHED AFTER COMPLETING THE LOOP.
endmodule
/*
DESCRIPTION
; |<----------------------------------------------------|
; |
; ------<(s)000 |
; | / |
; /CACT+CACT25 | / | |
; | / | |
; --/ | |
; | |
; |
; (t)001 |
; |
; |-----(u)-----(v)-----(w)-----(x)-----(y)-----(z)---->|
; O11 010 110 111 101 100
; 010387 JLB: EIOD TOO SOON, ONLY 15NS SETUP FOR BD BEFORE BIOXE.
; WOULD NOT LOAD FROM FLOPPY. EIOD FRONT FLANK DELAYED 25NS.
: SAME WITH DAP. DAP HELD FOR THE REST OF THE CYCLE UNTIL TERM
; ON IORQ.
; 060387 JLB: DAP HELD INTO ADDRESS PART OF IOX CYCLES AFTER A
; BUFFERED WRITE CYCLE. SWAPPED IOD FOR IORQ IN EIOD.
; USING CC2 (NEW INPUT) TO QUALIFY DAP AND EIOD
; STATE MACHINE
;
; 180587 M3202B
; 090887 B JLB: MAXIMIZED EQUATIONS TO MATCH CLOCK SKEW.
*/