forked from Apple-2-HW/GR8RAM
Fabbed
This commit is contained in:
parent
9f0867fe56
commit
db594211fa
@ -1 +1,50 @@
|
||||
Recovery
|
||||
GR8RAM/LibraryCard Slinky memory map
|
||||
-----------------------------
|
||||
1 FF FFFF | |
|
||||
. .. .... | LibCrd Sect. Cache (8 MB) |
|
||||
1 80 0000 | |
|
||||
-----------------------------
|
||||
1 7F FFFF | |
|
||||
. .. .... | reserved (6 MB) |
|
||||
1 20 0000 | |
|
||||
-----------------------------
|
||||
1 1F FFFF | |
|
||||
. .. .... | LibCrd registers (1 MB) |
|
||||
1 10 0000 | |
|
||||
-----------------------------
|
||||
1 0F FFFF | |
|
||||
. .. .... | 256x IOSTRB area (512 kB) |
|
||||
1 08 0000 | |
|
||||
-----------------------------
|
||||
1 07 FFFF | |
|
||||
. .. .... | 256x IOSEL area (512 kB) |
|
||||
1 00 0000 | |
|
||||
-----------------------------
|
||||
0 FF 0000 | |
|
||||
. .. .... | RAMFactor Memory (16 MB) |
|
||||
0 00 0000 | |
|
||||
-----------------------------
|
||||
|
||||
|
||||
Library Card register space
|
||||
-----------------------------
|
||||
1 7F FFFF | |
|
||||
. .. .... | reserved (768 kB) |
|
||||
1 74 0000 | |
|
||||
-----------------------------
|
||||
1 73 FFFF | |
|
||||
. .. .... | Response B (64 kB) |
|
||||
1 73 0000 | |
|
||||
-----------------------------
|
||||
1 72 FFFF | |
|
||||
. .. .... | Command B (64 kB) |
|
||||
1 72 0000 | |
|
||||
-----------------------------
|
||||
1 71 FFFF | |
|
||||
. .. .... | Response A (64 kB) |
|
||||
1 71 0000 | |
|
||||
-----------------------------
|
||||
1 70 FFFF | |
|
||||
. .. .... | Command A (64 kB) |
|
||||
1 70 0000 | |
|
||||
-----------------------------
|
||||
|
BIN
Documentation/Placement.pdf
Normal file
BIN
Documentation/Placement.pdf
Normal file
Binary file not shown.
BIN
Documentation/Schematic.pdf
Normal file
BIN
Documentation/Schematic.pdf
Normal file
Binary file not shown.
155
GR8RAM-cache.lib
155
GR8RAM-cache.lib
@ -246,28 +246,6 @@ X A 2 100 0 70 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_D_Small_ALT
|
||||
#
|
||||
DEF Device_D_Small_ALT D 0 10 N N 1 F N
|
||||
F0 "D" -50 80 50 H V L CNN
|
||||
F1 "Device_D_Small_ALT" -150 -80 50 H V L CNN
|
||||
F2 "" 0 0 50 V I C CNN
|
||||
F3 "" 0 0 50 V I C CNN
|
||||
$FPLIST
|
||||
TO-???*
|
||||
*_Diode_*
|
||||
*SingleDiode*
|
||||
D_*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
P 2 0 1 0 -30 -40 -30 40 N
|
||||
P 2 0 1 0 -30 0 30 0 N
|
||||
P 4 0 1 0 30 -40 -30 0 30 40 30 -40 F
|
||||
X K 1 -100 0 70 R 50 50 1 1 P
|
||||
X A 2 100 0 70 L 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Device_D_Zener_Small_ALT
|
||||
#
|
||||
DEF Device_D_Zener_Small_ALT D 0 10 N N 1 F N
|
||||
@ -384,42 +362,16 @@ X ~ 2 0 -100 30 U 50 50 1 1 P
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# GW_Logic_74125
|
||||
# GW_Logic_741G125GW
|
||||
#
|
||||
DEF GW_Logic_74125 U 0 40 Y Y 1 F N
|
||||
F0 "U" 0 450 50 H V C CNN
|
||||
F1 "GW_Logic_74125" 0 -450 50 H V C CNN
|
||||
F2 "stdpads:TSSOP-14_4.4x5mm_P0.65mm" 0 -500 50 H I C TNN
|
||||
F3 "" 0 -50 60 H I C CNN
|
||||
DRAW
|
||||
S -200 400 200 -400 0 1 10 f
|
||||
X 1~OE~ 1 -400 300 200 R 50 50 1 1 I
|
||||
X 3~OE~ 10 400 -100 200 L 50 50 1 1 I
|
||||
X 4Y 11 400 0 200 L 50 50 1 1 T
|
||||
X 4A 12 400 100 200 L 50 50 1 1 I
|
||||
X 4~OE~ 13 400 200 200 L 50 50 1 1 I
|
||||
X Vcc 14 400 300 200 L 50 50 1 1 W
|
||||
X 1A 2 -400 200 200 R 50 50 1 1 I
|
||||
X 1Y 3 -400 100 200 R 50 50 1 1 T
|
||||
X 2~OE~ 4 -400 0 200 R 50 50 1 1 I
|
||||
X 2A 5 -400 -100 200 R 50 50 1 1 I
|
||||
X 2Y 6 -400 -200 200 R 50 50 1 1 T
|
||||
X GND 7 -400 -300 200 R 50 50 1 1 W
|
||||
X 3Y 8 400 -300 200 L 50 50 1 1 T
|
||||
X 3A 9 400 -200 200 L 50 50 1 1 I
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# GW_Logic_741G04GW
|
||||
#
|
||||
DEF GW_Logic_741G04GW U 0 40 Y Y 1 F N
|
||||
DEF GW_Logic_741G125GW U 0 40 Y Y 1 F N
|
||||
F0 "U" 0 250 50 H V C CNN
|
||||
F1 "GW_Logic_741G04GW" 0 -250 50 H V C CNN
|
||||
F1 "GW_Logic_741G125GW" 0 -250 50 H V C CNN
|
||||
F2 "stdpads:SOT-353" 0 -300 50 H I C TNN
|
||||
F3 "" 0 -200 60 H I C CNN
|
||||
DRAW
|
||||
S 200 -200 -200 200 0 1 10 f
|
||||
X NC 1 -350 100 150 R 50 50 1 1 N
|
||||
X ~OE~ 1 -400 100 200 R 50 50 1 1 I
|
||||
X A 2 -400 0 200 R 50 50 1 1 I
|
||||
X GND 3 -400 -100 200 R 50 50 1 1 W
|
||||
X Y 4 400 -100 200 L 50 50 1 1 O
|
||||
@ -477,10 +429,10 @@ ENDDEF
|
||||
#
|
||||
# GW_PLD_EPM240T100
|
||||
#
|
||||
DEF GW_PLD_EPM240T100 U 0 40 Y Y 1 L N
|
||||
DEF GW_PLD_EPM240T100 U 0 40 Y Y 1 F N
|
||||
F0 "U" 0 50 50 H V C CNN
|
||||
F1 "GW_PLD_EPM240T100" 0 -50 50 H V C CNN
|
||||
F2 "Package_QFP:LQFP-100_14x14mm_P0.5mm" 0 -100 20 H I C CNN
|
||||
F2 "stdpads:TQFP-100_14x14mm_P0.5mm" 0 -100 20 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
*QFP*P0.5mm*
|
||||
@ -605,66 +557,6 @@ X Vin 3 -450 100 200 R 50 50 1 1 W
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# GW_RAM_Flash-4Mx16-TSOP1-48
|
||||
#
|
||||
DEF GW_RAM_Flash-4Mx16-TSOP1-48 U 0 20 Y Y 1 F N
|
||||
F0 "U" 0 1050 50 H V C CNN
|
||||
F1 "GW_RAM_Flash-4Mx16-TSOP1-48" 0 0 50 V V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
DRAW
|
||||
S -300 1000 300 -1700 0 1 10 f
|
||||
X GND 27 -500 -1600 200 R 50 50 0 0 W
|
||||
X VCC 37 -500 900 200 R 50 50 0 0 W
|
||||
X A15 1 -500 -800 200 R 50 50 1 1 I
|
||||
X A20 10 -500 -1300 200 R 50 50 1 1 I
|
||||
X ~WE~ 11 500 -1500 200 L 50 50 1 1 I L
|
||||
X ~RESET~ 12 500 -800 200 L 50 50 1 1 I L
|
||||
X A21 13 -500 -1400 200 R 50 50 1 1 I
|
||||
X ~WP~ 14 500 -1100 200 L 50 50 1 1 I L
|
||||
X ~BY~ 15 500 -1200 200 L 50 50 1 1 I L
|
||||
X A18 16 -500 -1100 200 R 50 50 1 1 I
|
||||
X A17 17 -500 -1000 200 R 50 50 1 1 I
|
||||
X A7 18 -500 0 200 R 50 50 1 1 I
|
||||
X A6 19 -500 100 200 R 50 50 1 1 I
|
||||
X A14 2 -500 -700 200 R 50 50 1 1 I
|
||||
X A5 20 -500 200 200 R 50 50 1 1 I
|
||||
X A4 21 -500 300 200 R 50 50 1 1 I
|
||||
X A3 22 -500 400 200 R 50 50 1 1 I
|
||||
X A2 23 -500 500 200 R 50 50 1 1 I
|
||||
X A1 24 -500 600 200 R 50 50 1 1 I
|
||||
X A0 25 -500 700 200 R 50 50 1 1 I
|
||||
X ~CS~ 26 500 -1400 200 L 50 50 1 1 I L
|
||||
X ~OE~ 28 500 -1600 200 L 50 50 1 1 I L
|
||||
X D0 29 500 900 200 L 50 50 1 1 B
|
||||
X A13 3 -500 -600 200 R 50 50 1 1 I
|
||||
X D8 30 500 100 200 L 50 50 1 1 B
|
||||
X D1 31 500 800 200 L 50 50 1 1 B
|
||||
X D9 32 500 0 200 L 50 50 1 1 B
|
||||
X D2 33 500 700 200 L 50 50 1 1 B
|
||||
X D10 34 500 -100 200 L 50 50 1 1 B
|
||||
X D3 35 500 600 200 L 50 50 1 1 B
|
||||
X D11 36 500 -200 200 L 50 50 1 1 B
|
||||
X D4 38 500 500 200 L 50 50 1 1 B
|
||||
X D12 39 500 -300 200 L 50 50 1 1 B
|
||||
X A12 4 -500 -500 200 R 50 50 1 1 I
|
||||
X D5 40 500 400 200 L 50 50 1 1 B
|
||||
X D13 41 500 -400 200 L 50 50 1 1 B
|
||||
X D6 42 500 300 200 L 50 50 1 1 B
|
||||
X D14 43 500 -500 200 L 50 50 1 1 B
|
||||
X D7 44 500 200 200 L 50 50 1 1 B
|
||||
X D15/A22 45 500 -600 200 L 50 50 1 1 B
|
||||
X GND 46 -500 -1600 200 R 50 50 1 1 W
|
||||
X ~BYTE~ 47 500 -900 200 L 50 50 1 1 I L
|
||||
X A16 48 -500 -900 200 R 50 50 1 1 I
|
||||
X A11 5 -500 -400 200 R 50 50 1 1 I
|
||||
X A10 6 -500 -300 200 R 50 50 1 1 I
|
||||
X A9 7 -500 -200 200 R 50 50 1 1 I
|
||||
X A8 8 -500 -100 200 R 50 50 1 1 I
|
||||
X A19 9 -500 -1200 200 R 50 50 1 1 I
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# GW_RAM_SDRAM-16Mx16-TSOP2-54
|
||||
#
|
||||
DEF GW_RAM_SDRAM-16Mx16-TSOP2-54 U 0 40 Y Y 1 F N
|
||||
@ -730,6 +622,26 @@ X VDDQ 9 -500 900 200 R 50 50 1 1 W N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# GW_RAM_SPIFlash-SO-8
|
||||
#
|
||||
DEF GW_RAM_SPIFlash-SO-8 U 0 40 Y Y 1 F N
|
||||
F0 "U" 0 350 50 H V C CNN
|
||||
F1 "GW_RAM_SPIFlash-SO-8" 0 -250 50 H V C CNN
|
||||
F2 "stdpads:Hybrid_SPIFlash_SOIC-8_SOIC-16" 0 -300 50 H I C TNN
|
||||
F3 "" 0 0 50 H I C TNN
|
||||
DRAW
|
||||
S -350 300 350 -200 0 1 10 f
|
||||
X ~CS~ 1 -550 200 200 R 50 50 1 1 I
|
||||
X DO/IO1 2 -550 100 200 R 50 50 1 1 B
|
||||
X ~WP~/IO2 3 -550 0 200 R 50 50 1 1 B
|
||||
X GND 4 -550 -100 200 R 50 50 1 1 W
|
||||
X DI/IO0 5 550 -100 200 L 50 50 1 1 B
|
||||
X CLK 6 550 0 200 L 50 50 1 1 I
|
||||
X ~HLD~/IO3 7 550 100 200 L 50 50 1 1 B
|
||||
X Vcc 8 550 200 200 L 50 50 1 1 W
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Mechanical_Fiducial
|
||||
#
|
||||
DEF Mechanical_Fiducial FID 0 20 Y Y 1 F N
|
||||
@ -745,6 +657,21 @@ C 0 0 50 0 1 20 f
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Mechanical_MountingHole
|
||||
#
|
||||
DEF Mechanical_MountingHole H 0 40 Y Y 1 F N
|
||||
F0 "H" 0 200 50 H V C CNN
|
||||
F1 "Mechanical_MountingHole" 0 125 50 H V C CNN
|
||||
F2 "" 0 0 50 H I C CNN
|
||||
F3 "" 0 0 50 H I C CNN
|
||||
$FPLIST
|
||||
MountingHole*
|
||||
$ENDFPLIST
|
||||
DRAW
|
||||
C 0 0 50 0 1 50 N
|
||||
ENDDRAW
|
||||
ENDDEF
|
||||
#
|
||||
# Mechanical_MountingHole_Pad
|
||||
#
|
||||
DEF Mechanical_MountingHole_Pad H 0 40 N N 1 F N
|
||||
|
Binary file not shown.
BIN
GR8RAM.4205A-gerberlite.zip
Normal file
BIN
GR8RAM.4205A-gerberlite.zip
Normal file
Binary file not shown.
31801
GR8RAM.kicad_pcb
31801
GR8RAM.kicad_pcb
File diff suppressed because it is too large
Load Diff
22
GR8RAM.pro
22
GR8RAM.pro
@ -1,4 +1,4 @@
|
||||
update=Tuesday, September 29, 2020 at 09:10:17 PM
|
||||
update=Wednesday, January 06, 2021 at 01:09:33 AM
|
||||
version=1
|
||||
last_client=kicad
|
||||
[general]
|
||||
@ -12,16 +12,6 @@ NetIExt=net
|
||||
version=1
|
||||
LibDir=
|
||||
[eeschema/libraries]
|
||||
[schematic_editor]
|
||||
version=1
|
||||
PageLayoutDescrFile=
|
||||
PlotDirectoryName=
|
||||
SubpartIdSeparator=0
|
||||
SubpartFirstId=65
|
||||
NetFmtName=Pcbnew
|
||||
SpiceAjustPassiveValues=0
|
||||
LabSize=50
|
||||
ERC_TestSimilarLabels=1
|
||||
[pcbnew]
|
||||
version=1
|
||||
PageLayoutDescrFile=
|
||||
@ -267,3 +257,13 @@ uViaDrill=0.1
|
||||
dPairWidth=0.2
|
||||
dPairGap=0.25
|
||||
dPairViaGap=0.25
|
||||
[schematic_editor]
|
||||
version=1
|
||||
PageLayoutDescrFile=
|
||||
PlotDirectoryName=
|
||||
SubpartIdSeparator=0
|
||||
SubpartFirstId=65
|
||||
NetFmtName=Pcbnew
|
||||
SpiceAjustPassiveValues=0
|
||||
LabSize=50
|
||||
ERC_TestSimilarLabels=1
|
||||
|
5485
GR8RAM.sch
5485
GR8RAM.sch
File diff suppressed because it is too large
Load Diff
885
cpld/GR8RAM.v
885
cpld/GR8RAM.v
@ -1,599 +1,374 @@
|
||||
module GR8RAM(C25M, PHI1, nIOSEL, nDEVSEL, nIOSTRB,
|
||||
RA, RB6, nRWE, nROE, nAOE, Adir, nRCS,
|
||||
RD, nDOE, Ddir,
|
||||
SBA, SA, nSCS, nRAS, nCAS, nSWE, DQML, DQMH, SCKE, SD,
|
||||
nRST, nPreBOD,
|
||||
module GR8RAM(C25M, PHI0, nPBOD, nBOD, nRES,
|
||||
nIOSEL, nDEVSEL, nIOSTRB,
|
||||
RA, nWEin, nWEout, Adir,
|
||||
RD, Ddir,
|
||||
DMAin, DMAout, INTin, INTout,
|
||||
nIRQout, nINHout, nDMAout, nNMIout);
|
||||
nDMA, nRDY, nNMI, nIRQ, nINH, nRESout
|
||||
SBA, SA, nRCS, nRAS, nCAS, nSWE, DQML, DQMH, RCKE, SD,
|
||||
nFCS, FCK, MISO, MOSI);
|
||||
|
||||
/* Clock inputs */
|
||||
input C25M, PHI1;
|
||||
wire PHI0 = ~PHI1;
|
||||
|
||||
/* Reset inputs */
|
||||
input nRST, nPreBOD;
|
||||
reg nRSTr0;
|
||||
/* Clock signals */
|
||||
input C25M, PHI0;
|
||||
reg PHI0r1, PHI0r2, PHI0r3;
|
||||
always @(negedge C25M) begin PHI0r1 <= PHI0; end
|
||||
always @(posedge C25M) begin
|
||||
nRSTr0 <= nRST;
|
||||
PHI0r2 <= PHI0r1; PHI0r3 <= PHI0r2;
|
||||
end
|
||||
|
||||
/* Select inputs */
|
||||
/* Reset/brown-out detect inputs */
|
||||
input nRES, nPBOD, nBOD;
|
||||
reg PBODr1, PBODr2, BODr1, BODr2, RESr1, RESr2;
|
||||
always @(negedge C25M) begin
|
||||
PBODr1 <= ~nPBOD; BODr1 <= ~nBOD; RESr1 <= ~nRES;
|
||||
end
|
||||
always @(posedge C25M) begin
|
||||
PBODr2 <= PBODr1; BODr2 <= BODr1; RESr2 <= RESr1;
|
||||
end
|
||||
|
||||
/* Apple IO area select signals */
|
||||
input nIOSEL, nDEVSEL, nIOSTRB;
|
||||
/* Synchronized select inputs */
|
||||
reg nDEVSELr0, nDEVSELr1;
|
||||
reg nIOSELr0;
|
||||
reg nIOSTRBr0;
|
||||
always @(posedge C25M) begin
|
||||
nDEVSELr0 <= nDEVSEL;
|
||||
nDEVSELr1 <= nDEVSELr0;
|
||||
nIOSELr0 <= nIOSEL;
|
||||
nIOSTRBr0 <= nIOSTRB;
|
||||
end
|
||||
/* DEVSEL-based state counter */
|
||||
wire [9:0] DEVSELe = {DEVSELer[9:1], nDEVSELr1 && ~nDEVSELr0 && nRSTr0}
|
||||
reg [9:1] DEVSELer;
|
||||
always @(posedge C25M) begin
|
||||
DEVSELer[9:1] <= DEVSELe[8:0];
|
||||
end
|
||||
reg DEVSELr1, DEVSELr2;
|
||||
always @(negedge C25M) begin DEVSELr1 <= ~nDEVSEL; end
|
||||
always @(posedge C25M) begin DEVSELr2 <= DEVSELr1; end
|
||||
|
||||
/* Flash Control */
|
||||
output nRCS = ~((~nIOSEL || (~nIOSTRB && IOROMEN)) && CSDBEN && nRST);
|
||||
output nROE = ~nRWE;
|
||||
|
||||
/* 6502/Flash Data Bus */
|
||||
inout RD = RDOE ? Rdout : 8'bZ;
|
||||
wire RDOE = ~nDEVSEL && nRST;
|
||||
wire RDout =
|
||||
AddrLSelA ? Addr[7:0] :
|
||||
AddrMSelA ? Addr[15:8] :
|
||||
AddrHSelA ? Addr[23:16] :
|
||||
DataSelA ? Addr==0 ? Data0[7:0] : Data[7:0] :
|
||||
8'h57;
|
||||
output nDOE = ~((~nDEVSEL || ~nIOSEL || (~nIOSTRB && IOROMEN)) && CSDBEN && nRST);
|
||||
output Ddir = ~nRWE;
|
||||
|
||||
/* Data bus / ROM chip select delay */
|
||||
reg CSDBEN = 0;
|
||||
always @(posedge C25M, negedge nRST) begin
|
||||
if (~nRST) CSDBEN <= 1'b0;
|
||||
else CSDBEN <= ~nDEVSELr0 || ~nIOSELr0 || ~nIOSTRBr0;
|
||||
end
|
||||
|
||||
/* IOROMEN control */
|
||||
wire IOROMEN = IOROMEN0 ^ IOROMEN1;
|
||||
reg IOROMEN0 = 0;
|
||||
reg IOROMEN1 = 0;
|
||||
always @(negedge nIOSEL, negedge nRST) begin
|
||||
if (~nRST) IOROMEN0 <= 1'b0; // On reset, set both to 0; 0 ^ 0 == 0
|
||||
else IOROMEN0 <= ~IOROMEN1; // Enable; X ^ ~X == 1
|
||||
end
|
||||
always @(negedge nIOSTRB, negedge nRST) begin
|
||||
if (~nRST) IOROMEN1 <= 1'b0; // On reset, set both to 0; 0 ^ 0 == 0
|
||||
else if (RA[10:0] == 11'h7FF) IOROMEN1 <= IOROMEN0; // Disable; X^X==0
|
||||
end
|
||||
|
||||
/* 6502/Flash Address Bus */
|
||||
input [15:0] RA;
|
||||
input nRWE;
|
||||
output nAOE = 0;
|
||||
output Adir = 1;
|
||||
reg [3:0] RAr;
|
||||
reg nRWEr;
|
||||
always @(posedge nDEVSEL) begin
|
||||
// Latch RA and nRWE at end of DEVSEL access
|
||||
RAr[3:0] <= RA[3:0];
|
||||
nRWEr <= nRWE;
|
||||
end
|
||||
|
||||
/* Register Select Signals */
|
||||
wire AddrLSelA = RA[3:0] == 4'h0;
|
||||
wire AddrMSelA = RA[3:0] == 4'h1;
|
||||
wire AddrHSelA = RA[3:0] == 4'h2;
|
||||
wire DataSelA = RA[3:0] == 4'h3;
|
||||
wire DMAAddrLSelA = RA[3:0] == 4'h4;
|
||||
wire DMAAddrHSelA = RA[3:0] == 4'h5;
|
||||
wire DMALenLSelA = RA[3:0] == 4'h6;
|
||||
wire DMALenHSelA = RA[3:0] == 4'h7;
|
||||
|
||||
wire MagicSelA = RA[3:0] == 4'h8;
|
||||
wire CfgSelA = RA[3:0] == 4'h9;
|
||||
wire RAMMaskSelA = RA[3:0] == 4'hB;
|
||||
wire BankHSelA = RA[3:0] == 4'hE;
|
||||
wire BankLSelA = RA[3:0] == 4'hF;
|
||||
|
||||
/* SDRAM Address / Flash Bank Bus */
|
||||
output [1:0] SBA = SAmux ? SBAreg[1:0] :
|
||||
~nIOSTRB ? {
|
||||
BankC8[4], // SBA0, Bank4
|
||||
BankC8[2] // SBA1, Bank2
|
||||
} : { // IOSEL
|
||||
1'b1, // SBA0, Bank4
|
||||
1'b1 // SBA1, Bank2
|
||||
};
|
||||
output [12:0] SA = SAmux ? SAreg[12:0] :
|
||||
~nIOSTRB ? {
|
||||
SAreg[0], // SA0
|
||||
BankC8[11], // SA1, Bank11
|
||||
BankC8[8], // SA2, Bank8
|
||||
SAreg[3], // SA3
|
||||
SAreg[4], // SA4
|
||||
BankC8[7], // SA5, Bank7
|
||||
SAreg[6], // SA6
|
||||
BankC8[10], // SA7, Bank10
|
||||
BankC8[9], // SA8, Bank9
|
||||
BankC8[1], // SA9, Bank1
|
||||
BankC8[0], // SA10, Bank0
|
||||
BankC8[3], // SA11, Bank3
|
||||
BankC8[5] ^ BankCX[5] // SA12, Bank5
|
||||
} : { // IOSEL
|
||||
SAreg[0], // SA0
|
||||
1'b0, // SA1, Bank11
|
||||
1'b0, // SA2, Bank8
|
||||
SAreg[3], // SA3
|
||||
SAreg[4], // SA4
|
||||
1'b1, // SA5, Bank7
|
||||
SAreg[6], // SA6
|
||||
1'b0, // SA7, Bank10
|
||||
1'b0, // SA8, Bank9
|
||||
1'b1, // SA9, Bank1
|
||||
1'b1, // SA10, Bank0
|
||||
1'b1, // SA11, Bank3
|
||||
BankCX[5] // SA12, Bank5
|
||||
};
|
||||
output RB6 = ~nIOSTRB ? BankC8[6] ^ BankCX[6] : BankCX[6];
|
||||
reg SAmux = 1'b0;
|
||||
reg [1:0] SBAreg;
|
||||
reg [12:0] SAreg;
|
||||
|
||||
/* SDRAM Data Bus */
|
||||
inout [7:0] SD = SDOE ? WRD : 8'bZ;
|
||||
reg SDOE = 0;
|
||||
reg [7:0] WRD = 0;
|
||||
always @(posedge nDEVSEL) begin
|
||||
WRD[7:0] <= RD[7:0];
|
||||
if (nRSTr0 && DataSelA && ~nRWE && Addr==0) Data0[7:0] <= RD[7:0];
|
||||
end
|
||||
|
||||
/* SDRAM Control Bus */
|
||||
output reg nSCS = 1;
|
||||
output reg nRAS = 1;
|
||||
output reg nCAS = 1;
|
||||
output reg nSWE = 1;
|
||||
output reg DQML = 1;
|
||||
output reg DQMH = 1;
|
||||
output reg SCKE = 1;
|
||||
|
||||
/* INT/DMA in/out */
|
||||
input DMAin;
|
||||
input INTin;
|
||||
/* DMA/IRQ daisy chain */
|
||||
input DMAin, INTin;
|
||||
output DMAout = DMAin;
|
||||
output INTout = INTin;
|
||||
|
||||
/* IRQ, NMI, DMA, INH outputs (open-drain is external) */
|
||||
output nIRQ = 1;
|
||||
output nNMI = 1;
|
||||
/* Apple open-drain outputs */
|
||||
output nDMA = 1;
|
||||
output nRDY = 1;
|
||||
output nNMI = 1;
|
||||
output nIRQ = 1;
|
||||
output nINH = 1;
|
||||
output nRESout = 0;
|
||||
|
||||
/* Refresh/Init Counter */
|
||||
reg [19:0] Tick;
|
||||
/* Apple address bus */
|
||||
input [15:0] RA;
|
||||
input nWEin;
|
||||
output RAdir = 1;
|
||||
output nWEout = 1;
|
||||
reg [15:0] RAr1; reg nWEr1;
|
||||
reg [15:0] RAr2; reg nWEr2;
|
||||
reg [15:0] RAcur; reg nWEcur;
|
||||
always @(negedge C25M) begin RAr1 <= RA; nWEr1 <= nWE; end
|
||||
always @(posedge C25M) begin RAr2 <= RAr1; nWEr2 <= nWEr1; end
|
||||
always @(posedge C25M) begin
|
||||
Tick <= Tick+1;
|
||||
if (S==0 && ~PHI0r2) begin
|
||||
RAcur <= RAr2;
|
||||
nWEcur <= nWER2;
|
||||
end
|
||||
end
|
||||
reg InitDone = 0;
|
||||
|
||||
/* Apple select signals */
|
||||
wire ROMSpecSEL = RAcur[15:12]==4'hC && RAcur[11:8]!=4'h0;
|
||||
wire ROMSpecRD = ROMSpecSEL && nWE;
|
||||
wire RAMSpecSEL = RAcur[15:12]==4'hC && RAcur[11:8]==4'h0 && RAcur[7] && RAcur[7:4]!=4'h8 && RAcur[3:0]==4'h3;
|
||||
wire RAMSpecRD = RAMSpecSEL && nWE;
|
||||
wire RAMSpecWR = RAMSpecSEL && ~nWE;
|
||||
wire SpecRD = ROMSpecRD || RAMSpecRD;
|
||||
reg RAMRD = 0, RAMWR = 0;
|
||||
always @(posedge C25M) begin
|
||||
if (Tick[19:0]==20'hFFFFF) InitDone <= 1'b1;
|
||||
if (S==5) begin
|
||||
RAMRD <= RAMSpecRD && DEVSELr2;
|
||||
RAMWR <= RAMSpecWR && DEVSELr2;
|
||||
end else if (S==0) begin
|
||||
RAMRD <= 0;
|
||||
RAMWR <= 0;
|
||||
end
|
||||
end
|
||||
|
||||
/* Apple data bus */
|
||||
inout [7:0] RD = RDdir ? 8'bZ : RDout[7:0];
|
||||
reg RDdir = 1;
|
||||
reg [7:0] RDout;
|
||||
|
||||
/* SDRAM data bus */
|
||||
inout [7:0] SD = SDOE ? RD[7:0] : 8'bZ;
|
||||
reg SDOE = 0;
|
||||
|
||||
/* SDRAM address/command */
|
||||
output reg [1:0] SBA;
|
||||
output reg [12:0] SA;
|
||||
output reg RCKE = 1;
|
||||
output reg nRCS = 1;
|
||||
output reg nRAS = 1;
|
||||
output reg nCAS = 1;
|
||||
output reg nSWE = 1;
|
||||
output reg DQMH = 1;
|
||||
output reg DQML = 1;
|
||||
|
||||
/* SPI flash */
|
||||
output reg nFCS = 1;
|
||||
output reg FCK = 0;
|
||||
output reg MOSI = MOSIOE ? MOSIout : 1'bZ;
|
||||
reg MOSIOE = 0;
|
||||
reg MOSIout;
|
||||
input MISO;
|
||||
|
||||
/* State counters */
|
||||
reg [24:0] FS = 0;
|
||||
always @(posedge C25M) begin FS <= FS+1; end
|
||||
reg [2:0] S = 0;
|
||||
always @(posedge C25M) begin
|
||||
if (S==0 && PHI0r2 && ~PHI0r3 && ~RESr2 && ~BODr2) S <= 1;
|
||||
else if (S==0) S <= 0;
|
||||
else S <= S+1;
|
||||
end
|
||||
reg RefWake = 0;
|
||||
|
||||
/* Refresh state */
|
||||
reg RefReady = 0;
|
||||
reg RefDone = 0;
|
||||
always @(posedge C25M) begin RefReady <= S==0; end
|
||||
always @(posedge C25M) begin
|
||||
if (FS[6:0]==7'h00) RefDone <= 0;
|
||||
else (S==0 && RefReady && RCKE && ~(PHI0r2 && ~PHI0r3)) RefDone <= 1;
|
||||
end
|
||||
|
||||
/* User-Accessible Registers */
|
||||
reg [23:0] Addr = 0;
|
||||
reg [7:0] Data = 0;
|
||||
reg [7:0] Data0 = 0;
|
||||
reg [11:0] BankC8 = 0; // Bits 9:8 are XORed with BankCX
|
||||
reg [6:5] BankCX = 0; // Bank CX is init value
|
||||
reg ExtBankEN = 0;
|
||||
/* Slinky registers */
|
||||
reg [24:0] Addr;
|
||||
wire AddrHSpecSEL = RAcur[3:0]==4'h2;
|
||||
wire AddrMSpecSEL = RAcur[3:0]==4'h1;
|
||||
wire AddrLSpecSEL = RAcur[3:0]==4'h0;
|
||||
always @(posedge C25M) begin
|
||||
if (S==7 && DEVSELr2) begin
|
||||
if (AddrHSpecSEL || AddrMSpecSEL || AddrLSpecSEL) begin
|
||||
Addr[24] <= 1'b0;
|
||||
end
|
||||
|
||||
/* Set/Increment Address Register */
|
||||
always @(posedge C25M, negedge nRST) begin
|
||||
if (~nRST) begin
|
||||
Addr <= 0;
|
||||
end else begin
|
||||
if (DEVSELe[0] && ~nRWEr) begin // Write address register
|
||||
if (RAr[3:0]==4'h0) begin // AddrL
|
||||
Addr[7:0] <= WRD[7:0];
|
||||
if (Addr[7] & ~WRD[7]) Addr[23:8] <= Addr[23:8]+1;
|
||||
end else if (RAr[3:0]==4'h1) begin // AddrM
|
||||
Addr[15:8] <= WRD[7:0];
|
||||
if (Addr[15] & ~WRD[7]) Addr[23:16] <= Addr[23:16]+1;
|
||||
end else if (RAr[3:0]==4'h2) begin // AddrH
|
||||
Addr[23:16] <= WRD[7:0];
|
||||
end
|
||||
end else if (DEVSELe[2] && RAr[3:0]==4'h3) begin // R/W data
|
||||
Addr[23:0] <= Addr[23:0]+1;
|
||||
if (AddrHSpecSEL) begin
|
||||
Addr[23:16] <= RD[7:0];
|
||||
end else if (RAMRD || RAMWR ||
|
||||
(AddrMSpecSEL && Addr[15] && ~RD[7]) ||
|
||||
(AddrLSpecSEL && Addr[7] && ~RD[7] && Addr[15:8]==8'hFF)) begin
|
||||
Addr[23:16] <= Addr[23:16]+1;
|
||||
end
|
||||
|
||||
if (AddrMSpecSEL) begin
|
||||
Addr[15:8] <= RD[7:0];
|
||||
end else if (RAMRD || RAMWR ||
|
||||
(AddrLSpecSEL && Addr[7] && ~RD[7])) begin
|
||||
Addr[15:8] <= Addr[15:8]+1;
|
||||
end
|
||||
|
||||
if (AddrLSpecSEL) begin
|
||||
Addr[7:0] <= RD[7:0];
|
||||
end else if (RAMRD || RAMWR) begin
|
||||
Addr[7:0] <= Addr[7:0]+1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
/* Set bank */
|
||||
always @(posedge nDEVSEL, negedge nRST) begin
|
||||
if (~nRST) begin
|
||||
BankC8 <= 0;
|
||||
end else begin
|
||||
if (~nRWE) begin
|
||||
if (RAr[3:0]==4'hE && ExtBankEN) begin
|
||||
BankC8[11:10] <= WRD[3:2];
|
||||
BankC8[9:8] <= WRD[1:0] ^ BankCX[9:8];
|
||||
end else if (RAr[3:0]==4'hF) begin
|
||||
BankC8[7] <= WRD[7] & ExtBankEN;
|
||||
BankC8[6:0] <= WRD[6:0];
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
/* Latch read data */
|
||||
always @(posedge C25M) begin
|
||||
if (DEVSELe[9]) Data[7:0] <= SDD[7:0];
|
||||
end
|
||||
|
||||
/* SDRAM Control */
|
||||
always @(posedge C25M) begin
|
||||
if (~InitDone) begin
|
||||
if (Tick[19:8]==12'hFFF) begin
|
||||
if (Tick[3:0]==4'h8) begin
|
||||
if (Tick[7:4]==4'h0) begin
|
||||
// PC all
|
||||
SCKE <= 1'b1;
|
||||
nSCS <= 1'b0;
|
||||
nRAS <= 1'b0;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b0;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
|
||||
SAreg[10] <= 1'b1; // "all"
|
||||
end else if (Tick[7:4]==4'h7) begin
|
||||
// Load mode register
|
||||
SCKE <= 1'b1;
|
||||
nSCS <= 1'b0;
|
||||
nRAS <= 1'b0;
|
||||
nCAS <= 1'b0;
|
||||
nSWE <= 1'b0;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
|
||||
SAreg[11] <= 1'b0; // Reserved in mode register
|
||||
end else begin
|
||||
// AREF
|
||||
SCKE <= 1'b1;
|
||||
nSCS <= 1'b0;
|
||||
nRAS <= 1'b0;
|
||||
nCAS <= 1'b0;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
end
|
||||
end else begin
|
||||
// NOP
|
||||
SCKE <= 1'b1;
|
||||
nSCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
end
|
||||
end else begin
|
||||
// NOP ckdis
|
||||
SCKE <= 1'b0;
|
||||
nSCS <= 1'b1;
|
||||
if (S==0) begin
|
||||
if ((PHI0r2 && ~PHI0r3 && ~RESr2 && ~BODr2 && SpecRD) ||
|
||||
(~RefReady && ~RefDone)) begin
|
||||
// NOP cken
|
||||
RCKE <= 1'b1;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
end
|
||||
|
||||
// Mode register contents
|
||||
SBAreg[1:0] <= 2'b00; // Reserved
|
||||
SAreg[11] <= 1'b0; // Reserved
|
||||
SAreg[9] <= 1'b1; // "1" for single write mode
|
||||
SAreg[8] <= 1'b0; // Reserved
|
||||
SAreg[7] <= 1'b0; // "0" for not test mode
|
||||
SAreg[6:4] <= 3'b010; // "2" for CAS latency 2
|
||||
SAreg[3] <= 1'b0; // "0" for sequential burst (not used)
|
||||
SAreg[2:0] <= 3'b000; // "0" for burst length 1 (no burst)
|
||||
|
||||
SAmux <= 1'b1;
|
||||
RefDone <= 1'b0;
|
||||
RefWake <= 1'b0;
|
||||
end else if (DEVSELe[0] && RAr[3:0]==4'h3) begin
|
||||
// NOP
|
||||
SCKE <= ~nRWEr;
|
||||
nSCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
|
||||
SAmux <= 1'b1;
|
||||
RefWake <= 1'b0;
|
||||
end else if (DEVSELe[1] && RAr[3:0]==4'h3) begin
|
||||
// ACT
|
||||
SCKE <= ~nRWEr;
|
||||
nSCS <= nRWEr;
|
||||
nRAS <= 1'b0;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
|
||||
// Row address
|
||||
SBAreg[1:0] <= Addr[23:22];
|
||||
SAreg[12] <= 1'b0;
|
||||
SAreg[11:0] <= Addr[21:10];
|
||||
|
||||
SAmux <= 1'b1;
|
||||
RefWake <= 1'b0;
|
||||
end else if (DEVSELe[2] && RAr[3:0]==4'h3) begin
|
||||
// WR/NOP
|
||||
SCKE <= ~nRWEr;
|
||||
nSCS <= nRWEr;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b0;
|
||||
nSWE <= 1'b0;
|
||||
DQML <= Addr[0];
|
||||
DQMH <= ~Addr[0];
|
||||
|
||||
// Column address
|
||||
SBAreg[1:0] <= Addr[23:22];
|
||||
SAreg[12:11] <= 2'b00;
|
||||
SAreg[9] <= 1'b0;
|
||||
SAreg[8:0] <= Addr[9:1];
|
||||
|
||||
// Auto-precharge only if row will increment
|
||||
SAreg[10] <= Addr[9:0]==10'h3FF;
|
||||
|
||||
SAmux <= 1'b1;
|
||||
RefWake <= 1'b0;
|
||||
end else if (DEVSELe[3] && RAr[3:0]==4'h3) begin
|
||||
// NOP
|
||||
SCKE <= ~nRWEr;
|
||||
nSCS <= nRWEr;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
|
||||
SAmux <= 1'b0;
|
||||
RefWake <= 1'b0;
|
||||
end else if (DEVSELe[4] && RAr[3:0]==4'h3) begin
|
||||
// NOP (auto-precharge from previous write)
|
||||
SCKE <= 1'b1;
|
||||
nSCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
|
||||
SAmux <= 1'b0;
|
||||
RefWake <= 1'b0;
|
||||
end else if (DEVSELe[5] && RAr[3:0]==4'h3) begin
|
||||
// ACT only if WR AP just occurred / NOP
|
||||
SCKE <= 1'b1;
|
||||
nSCS <= ~nRWEr && ~SAreg[10];
|
||||
nRAS <= 1'b0;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
|
||||
// Row address
|
||||
SBAreg[1:0] <= Addr[23:22];
|
||||
SAreg[12] <= 1'b0;
|
||||
SAreg[11:0] <= Addr[21:10];
|
||||
|
||||
SAmux <= 1'b1;
|
||||
RefWake <= 1'b0;
|
||||
end else if (DEVSELe[6] && RAr[3:0]==4'h3) begin
|
||||
// RD
|
||||
SCKE <= 1'b1;
|
||||
nSCS <= 1'b0;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b0;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= Addr[0];
|
||||
DQMH <= ~Addr[0];
|
||||
|
||||
// Column address
|
||||
SBAreg[1:0] <= Addr[23:22];
|
||||
SAreg[12:11] <= 2'b00;
|
||||
SAreg[10] <= 1'b1; // auto-precharge
|
||||
SAreg[9] <= 1'b0;
|
||||
SAreg[8:0] <= Addr[9:1];
|
||||
|
||||
SAmux <= 1'b1;
|
||||
RefWake <= 1'b0;
|
||||
end else if (DEVSELe[7] && RAr[3:0]==4'h3) begin
|
||||
// NOP
|
||||
SCKE <= 1'b1;
|
||||
nSCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
|
||||
SAmux <= 1'b0;
|
||||
RefWake <= 1'b0;
|
||||
end else begin
|
||||
if (Tick[5] && ~RefDone) begin
|
||||
if (~RefWake) begin
|
||||
// NOP
|
||||
SCKE <= 1'b1;
|
||||
nSCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
|
||||
RefWake <= 1'b1;
|
||||
end else begin
|
||||
// AREF
|
||||
SCKE <= 1'b1;
|
||||
nSCS <= 1'b0;
|
||||
nRAS <= 1'b0;
|
||||
nCAS <= 1'b0;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
|
||||
RefWake <= 1'b0;
|
||||
RefDone <= 1'b1;
|
||||
end
|
||||
DQML <= 1'b1;
|
||||
end else if (RefReady && ~RefDone && RCKE &&
|
||||
~(PHI0r2 && ~PHI0r3)) begin
|
||||
// AREF
|
||||
RCKE <= 1'b1;
|
||||
nRCS <= 1'b0;
|
||||
nRAS <= 1'b0;
|
||||
nCAS <= 1'b0;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end else begin
|
||||
// NOP ckdis
|
||||
SCKE <= 1'b0;
|
||||
nSCS <= 1'b1;
|
||||
RCKE <= 1'b0;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end
|
||||
end else if (S==4'h1) begin
|
||||
if (SpecRD) begin
|
||||
// ACT
|
||||
RCKE <= 1'b1;
|
||||
nRCS <= 1'b0;
|
||||
nRAS <= 1'b0;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
|
||||
RefWake <= 1'b0;
|
||||
if (Tick[5]) RefDone <= 1'b0;
|
||||
if (RAMSpecRD) begin
|
||||
RBA[1] <= Addr[24];
|
||||
RBA[0] <= Addr[23];
|
||||
RA[12:0] <= Addr[22:10];
|
||||
end else begin
|
||||
RBA[1] <= 1'b1;
|
||||
RBA[0] <= 1'b0;
|
||||
RA[12:10] <= 3'b000;
|
||||
RA[9:2] <= Bank[7:0];
|
||||
RA[1:0] <= RAcur[11:10];
|
||||
end
|
||||
end else begin
|
||||
// NOP ckdis
|
||||
RCKE <= 1'b0;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end
|
||||
end else if (S==4'h2) begin
|
||||
if (SpecRD) begin
|
||||
// RD auto-PC
|
||||
RCKE <= 1'b1;
|
||||
nRCS <= 1'b0;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b0;
|
||||
nSWE <= 1'b1;
|
||||
|
||||
SAmux <= 1'b0;
|
||||
end
|
||||
end
|
||||
|
||||
/* UFM Interface */
|
||||
reg ARCLK = 0; // UFM address register clock
|
||||
// UFM address register data input tied to 0
|
||||
reg ARShift = 0; // 1 to Shift UFM address in, 0 to increment
|
||||
reg DRCLK = 0; // UFM data register clock
|
||||
reg DRDIn = 0; // UFM data register input
|
||||
reg DRShift = 0; // 1 to shift UFM out, 0 to load from current address
|
||||
reg UFMErase = 0; // Rising edge starts erase. UFM+RTP must not be busy
|
||||
reg UFMProgram = 0; // Rising edge starts program. UFM+RTP must not be busy
|
||||
wire UFMBusy; // 1 if UFM is doing user operation. Asynchronous
|
||||
wire RTPBusy; // 1 if real-time programming in progress. Asynchronous
|
||||
wire DRDOut; // UFM data output
|
||||
// UFM oscillator always enabled
|
||||
wire UFMOsc; // UFM oscillator output (3.3-5.5 MHz)
|
||||
UFM UFM_inst ( // UFM IP block (for Altera MAX II and MAX V)
|
||||
.arclk (ARCLK),
|
||||
.ardin (1'b0),
|
||||
.arshft (ARShift),
|
||||
.drclk (DRCLK),
|
||||
.drdin (DRDIn),
|
||||
.drshft (DRShift),
|
||||
.erase (UFMErase),
|
||||
.oscena (1'b1),
|
||||
.program (UFMProgram),
|
||||
.busy (UFMBusy),
|
||||
.drdout (DRDOut),
|
||||
.osc (UFMOsc),
|
||||
.rtpbusy (RTPBusy));
|
||||
reg UFMBr = 0; // UFMBusy registered to sync with C14M
|
||||
reg RTPBr = 0; // RTPBusy registered to sync with C14M
|
||||
|
||||
reg [15:0] Cfg;
|
||||
reg CfgLoaded = 0;
|
||||
// Do nothing when Tick15:14==2'h0
|
||||
// Get ready when Tick15:14==2'h1
|
||||
// Zero AR
|
||||
// Load Cfg when Tick15:14==2'h2
|
||||
// Tick13:6 (256) - first half of UFM looked at
|
||||
// Tick5:2 (16) - 16 bits loaded from UFM
|
||||
// 0: set CfgLoaded if DRDout==1, otherwise shift DRDout into Cfg
|
||||
// 1-14: continue shifting DRDout into Cfg[15:0]
|
||||
// 15: shift last DRDout bit into Cfg[15:0] and increment AR
|
||||
// Tick1:0 (4) - 1 bit shifted
|
||||
// Do nothing when Tick15:14==2'h3
|
||||
// Set CfgLoaded too
|
||||
always @(posedge C25M) begin
|
||||
if (~CfgLoaded) begin
|
||||
if (Tick[15:14]==2'h0) begin
|
||||
// Do nothing
|
||||
ARShift <= 1;
|
||||
ARCLK <= 0;
|
||||
DRCLK <= 0;
|
||||
end else if (Tick[15:14]==2'h1) begin
|
||||
// Shift zeros into AR during first half
|
||||
if (~Tick[13]) begin
|
||||
ARShift <= 1;
|
||||
ARCLK <= Tick[1];
|
||||
end else begin
|
||||
ARShift <= 0;
|
||||
ARCLK <= 0;
|
||||
A[12:11] <= 1'b0; // don't care
|
||||
A[10] <= 1'b1; // auto-precharge
|
||||
A[9] <= 1'b0; // don't care
|
||||
if (RAMSpecRD) begin
|
||||
RBA[1] <= Addr[24];
|
||||
RBA[0] <= Addr[23];
|
||||
RA[8:0] <= Addr[9:1];
|
||||
DQMH <= ~Addr[0];
|
||||
DQML <= Addr[0];
|
||||
end else /* ROMSpecRD */ begin
|
||||
RBA[1] <= 1'b1;
|
||||
RBA[0] <= 1'b0;
|
||||
RA[8:0] <= RAcur[9:1];
|
||||
DQMH <= ~RAcur[0];
|
||||
DQML <= RAcur[0];
|
||||
end
|
||||
|
||||
// Load default config
|
||||
Cfg[15:0] <= 16'hFFFF;
|
||||
|
||||
// Load indirect into DR at end
|
||||
if (Tick[13:0]==14'h3FFC ||
|
||||
Tick[13:0]==14'h3FFD ||
|
||||
Tick[13:0]==14'h3FFE ||
|
||||
Tick[13:0]==14'h3FFF || ) begin
|
||||
DRCLK <= 1;
|
||||
end else DRCLK <= 0;
|
||||
end else if (Tick[15:14]==2'h2) begin
|
||||
// Load 16 bits into Cfg register
|
||||
if (Tick[5:2]==4'h0 && Tick[1:0]==0 && DRDout) begin
|
||||
CfgLoaded <= 1;
|
||||
end else if (Tick[1:0]==0) begin
|
||||
Cfg[15:0] <= {Cfg[14:1], DRDout};
|
||||
end
|
||||
|
||||
// Increment AR
|
||||
if (Tick[5:2]==4'hE) begin
|
||||
ARCLK <= 1;
|
||||
end else begin
|
||||
ARCLK <= 0;
|
||||
end
|
||||
|
||||
// Load indirect into DR
|
||||
if (Tick[5:2]==4'hF) begin
|
||||
DRCLK <= 1;
|
||||
end else begin
|
||||
DRCLK <= 0;
|
||||
end
|
||||
|
||||
ARShift <= 1'b0; // Only incrementing AR now
|
||||
end else if (Tick[15:14]==2'h3) begin
|
||||
// Do nothing
|
||||
ARShift <= 1;
|
||||
ARCLK <= 0;
|
||||
DRCLK <= 0;
|
||||
CfgLoaded <= 1; // in case setting at address 0xFF
|
||||
end else begin
|
||||
// NOP ckdis
|
||||
RCKE <= 1'b0;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end
|
||||
end else if (S==4'h3) begin
|
||||
if (SpecRD) begin
|
||||
// NOP cken
|
||||
RCKE <= 1'b1;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end else begin
|
||||
// NOP ckdis
|
||||
RCKE <= 1'b0;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end
|
||||
end else if (S==4'h4) begin
|
||||
if (RAMSpecWR) begin
|
||||
// NOP cken
|
||||
RCKE <= 1'b1;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end else begin
|
||||
// NOP ckdis
|
||||
RCKE <= 1'b0;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end
|
||||
end else if (S==4'h5) begin
|
||||
if (RAMSpecWR && DEVSELr2) begin
|
||||
// ACT
|
||||
RCKE <= 1'b1;
|
||||
nRCS <= 1'b0;
|
||||
nRAS <= 1'b0;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
|
||||
DRShift <= 0; // Only reading DR during init, not writing UFM
|
||||
DRDIn <= 0;
|
||||
end else if (DEVSELe[0] && RAr[3:0]==4'h8) begin
|
||||
|
||||
end else begin
|
||||
// Do nothing
|
||||
ARShift <= 1;
|
||||
ARCLK <= 0;
|
||||
DRCLK <= 0;
|
||||
DRShift <= 0;
|
||||
DRDIn <= 0;
|
||||
BA[1] <= Addr[24];
|
||||
BA[0] <= Addr[23];
|
||||
A[12:0] <= Addr[22:10];
|
||||
end else begin
|
||||
// NOP ckdis
|
||||
RCKE <= 1'b0;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end
|
||||
end else if (s==4'h6) begin
|
||||
if (RAMWR) begin
|
||||
// WR auto-PC
|
||||
RCKE <= 1'b1;
|
||||
nRCS <= 1'b0;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b0;
|
||||
nSWE <= 1'b0;
|
||||
|
||||
BA[1] <= Addr[24];
|
||||
BA[0] <= Addr[23];
|
||||
A[12:11] <= 1'b0; // don't care
|
||||
A[10] <= 1'b1; // auto-precharge
|
||||
A[9:0] <= Addr[9:0];
|
||||
DQMH <= ~Addr[10];
|
||||
DQML <= Addr[10];
|
||||
end else begin
|
||||
// NOP ckdis
|
||||
RCKE <= 1'b0;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end
|
||||
end else if (S==4'h7) begin
|
||||
if (RAMSpecWR) begin
|
||||
// NOP cken
|
||||
RCKE <= 1'b1;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end else begin
|
||||
// NOP ckdis
|
||||
RCKE <= 1'b0;
|
||||
nRCS <= 1'b1;
|
||||
nRAS <= 1'b1;
|
||||
nCAS <= 1'b1;
|
||||
nSWE <= 1'b1;
|
||||
DQMH <= 1'b1;
|
||||
DQML <= 1'b1;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
always @(posedge nDEVSEL, negedge nRST) begin
|
||||
if (~nRST)
|
||||
end
|
||||
endmodule
|
||||
|
@ -1,37 +1,38 @@
|
||||
Reference, Quantity, Value, Footprint, Datasheet, LCSC Part
|
||||
C38 C40 C39 C41 ,4,"10n","stdpads:C_0603","~","C57112"
|
||||
C8 C10 C11 C1 C7 C2 C3 C4 C36 C37 C5 C6 ,12,"10u","stdpads:C_0805","~","C15850"
|
||||
C9 C12 C13 C14 C15 C16 C17 C19 C20 C21 C22 C23 C18 C24 C25 C27 C28 C29 C30 C31 C26 C32 C33 C34 C35 ,25,"2u2","stdpads:C_0603","~","C23630"
|
||||
D1 ,1,"M7","stdpads:D_SMA","~","C95872"
|
||||
C38 C40 C41 ,3,"22n","stdpads:C_0603","~","C21122"
|
||||
C39 ,1,"1n","stdpads:C_0603","~","C1588"
|
||||
C8 C10 C11 C1 C7 C36 C37 C5 C6 C2 C3 C4 ,12,"10u","stdpads:C_0805","~","C15850"
|
||||
C9 C31 C30 C44 C43 C42 C35 C34 C33 C32 C26 C28 C27 C25 C24 C18 C23 C22 C21 C20 C19 C16 C15 C14 C13 C12 C29 ,27,"2u2","stdpads:C_0603","~","C23630"
|
||||
D2 ,1,"SMBJ5.0A","stdpads:D_SMB","~","C110528"
|
||||
D3 ,1,"SS14","stdpads:D_SMA","~","C2480"
|
||||
F1 ,1,"nSMD035-16V","stdpads:BelFuse_1206","~","C70072"
|
||||
FB1 ,1,"GZ2012D601TF","stdpads:Murata_BLM21","~","C1017"
|
||||
FID1 FID2 FID3 FID4 FID5 ,5,"Fiducial","stdpads:Fiducial","~"
|
||||
D3 D1 ,2,"SS34","stdpads:D_SMA","~","C8678"
|
||||
F1 ,1,"nSMD050-16V","stdpads:BelFuse_1206","~","C70075"
|
||||
FB1 ,1,"GZ2012D101TF","stdpads:Murata_BLM21","~","C1015"
|
||||
FID5 FID4 FID3 FID2 FID1 ,5,"Fiducial","stdpads:Fiducial","~"
|
||||
H1 ,1," ","stdpads:PasteHole_1.1mm_PTH","~"
|
||||
H5 H4 H3 H2 H6 ,5," ","stdpads:PasteHole_1.152mm_NPTH","~"
|
||||
H6 H2 H3 H4 H5 ,5," ","stdpads:PasteHole_1.152mm_NPTH","~"
|
||||
J1 ,1,"AppleIIBus","stdpads:AppleIIBus_Edge","~"
|
||||
J2 ,1,"JTAG","Connector:Tag-Connect_TC2050-IDC-FP_2x05_P1.27mm_Vertical","~"
|
||||
J2 J5 ,2,"JTAG","Connector:Tag-Connect_TC2050-IDC-FP_2x05_P1.27mm_Vertical","~"
|
||||
J3 ,1,"DC in","stdpads:BOOMELE_DC-005_DC_5.5-2.0MM","~"
|
||||
J4 ,1,"JTAG","Connector_IDC:IDC-Header_2x05_P2.54mm_Vertical","~"
|
||||
Q1 ,1,"AO3401A","stdpads:SOT-23","http://www.aosmd.com/pdfs/datasheet/AO3401A.pdf","C15127"
|
||||
R1 R2 ,2,"DNP","stdpads:R_0805","~"
|
||||
R10 R16 R2 R15 R4 ,5,"2k2","stdpads:R_0603","~","C4190"
|
||||
R11 ,1,"330","stdpads:R_0603","~","C23138"
|
||||
R12 ,1,"1k","stdpads:R_0805","~","C17513"
|
||||
R13 ,1,"100","stdpads:R_0805","~","C17408"
|
||||
R18 ,1,"22k","stdpads:R_0603","~","C31850"
|
||||
R3 ,1,"3k0","stdpads:R_0603","~","C4211"
|
||||
R4 R16 ,2,"2k2","stdpads:R_0603","~","C4190"
|
||||
R7 R6 R11 R10 R17 R14 R15 ,7,"1k","stdpads:R_0603","~","C21190"
|
||||
R8 R5 ,2,"1M","stdpads:R_0603","~","C22935"
|
||||
R9 ,1,"3k6","stdpads:R_0603","~","C22980"
|
||||
R13 ,1,"DNP","stdpads:R_0805","~"
|
||||
R18 R28 R29 ,3,"22k","stdpads:R_0603","~","C31850"
|
||||
R20 R21 R23 R24 R25 R26 R1 R22 R27 R31 ,10,"33","stdpads:R_0603","~","C23140"
|
||||
R3 ,1,"2k7","stdpads:R_0603","~","C13167"
|
||||
R6 R14 R19 R17 ,4,"1k","stdpads:R_0603","~","C21190"
|
||||
R7 ,1,"820","stdpads:R_0603","~","C23253"
|
||||
R8 R5 R30 ,3,"1M","stdpads:R_0603","~","C22935"
|
||||
R9 ,1,"1k2","stdpads:R_0603","~","C22765"
|
||||
RN2 RN3 RN1 ,3,"4x33","stdpads:R4_0402","~","C25501"
|
||||
RN4 ,1,"4x10k","stdpads:R4_0402","~","C25725"
|
||||
RN4 RN5 ,2,"4x10k","stdpads:R4_0402","~","C25725"
|
||||
U1 ,1,"EPM240T100C5N","stdpads:TQFP-100_14x14mm_P0.5mm","https://www.altera.com/content/dam/altera-www/global/en_US/pdfs/literature/hb/max2/max2_mii5v1.pdf","C10041"
|
||||
U13 ,1,"25M","stdpads:Crystal_SMD_3225-4Pin_3.2x2.5mm","","C32526"
|
||||
U14 U12 ,2,"74AHCT125","stdpads:TSSOP-14_4.4x5mm_P0.65mm","","C148198"
|
||||
U16 ,1,"74LVC1G04GW","stdpads:SOT-353","","C10237"
|
||||
U13 ,1,"25M","stdpads:Crystal_SMD_3225-4Pin_3.2x2.5mm","","C669088"
|
||||
U16 U11 U12 U15 U17 U18 U19 U20 U14 U22 ,10,"74LVC1G125GW","stdpads:SOT-353","","C12519"
|
||||
U2 ,1,"W9825","stdpads:TSOP-II-54_22.2x10.16mm_P0.8mm","","C62246"
|
||||
U3 ,1,"MX29LV640EB","stdpads:TSOP-I-48_18.4x12mm_P0.5mm","http://ww1.microchip.com/downloads/en/DeviceDoc/25022B.pdf","C34469"
|
||||
U5 U6 U9 U4 ,4,"74AHC245","stdpads:TSSOP-20_4.4x6.5mm_P0.65mm","","C5516"
|
||||
U7 U10 ,2,"LM393","stdpads:SOIC-8_3.9mm","http://www.ti.com/lit/ds/symlink/lm393-n.pdf","C7955"
|
||||
U8 ,1,"AP2125","stdpads:SOT-23","","C150715"
|
||||
U3 ,1,"W25Q128JVSIQ","stdpads:SOIC-8_5.3mm","","C97521"
|
||||
U5 U6 U9 U4 ,4,"74AHC245PW","stdpads:TSSOP-20_4.4x6.5mm_P0.65mm","","C5516"
|
||||
U7 U10 ,2,"LM393D","stdpads:SOIC-8_3.9mm","http://www.ti.com/lit/ds/symlink/lm393-n.pdf","C7955"
|
||||
U8 ,1,"XC6206P332MR","stdpads:SOT-23","","C5446"
|
Can't render this file because it has a wrong number of fields in line 10.
|
32555
gerber/GR8RAM-B_Cu.gbl
32555
gerber/GR8RAM-B_Cu.gbl
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,28 +1,35 @@
|
||||
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(5.1.5-0-10_14)*
|
||||
G04 #@! TF.CreationDate,2020-10-17T17:20:31-04:00*
|
||||
G04 #@! TF.ProjectId,GR8RAM,47523852-414d-42e6-9b69-6361645f7063,rev?*
|
||||
G04 #@! TF.CreationDate,2021-02-17T19:07:14-05:00*
|
||||
G04 #@! TF.ProjectId,GR8RAM,47523852-414d-42e6-9b69-6361645f7063,0.9*
|
||||
G04 #@! TF.SameCoordinates,Original*
|
||||
G04 #@! TF.FileFunction,Legend,Bot*
|
||||
G04 #@! TF.FilePolarity,Positive*
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW (5.1.5-0-10_14)) date 2020-10-17 17:20:31*
|
||||
G04 Created by KiCad (PCBNEW (5.1.5-0-10_14)) date 2021-02-17 19:07:14*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G04 APERTURE LIST*
|
||||
%ADD10C,0.100000*%
|
||||
%ADD11R,1.952400X4.552400*%
|
||||
%ADD12O,1.952400X4.552400*%
|
||||
%ADD13O,4.552400X1.952400*%
|
||||
%ADD14R,1.879600X1.879600*%
|
||||
%ADD15O,1.879600X1.879600*%
|
||||
%ADD16C,1.143000*%
|
||||
%ADD10C,0.120000*%
|
||||
%ADD11C,0.100000*%
|
||||
%ADD12R,1.879600X1.879600*%
|
||||
%ADD13O,1.879600X1.879600*%
|
||||
%ADD14R,1.952400X4.552400*%
|
||||
%ADD15O,1.952400X4.552400*%
|
||||
%ADD16O,4.552400X1.952400*%
|
||||
%ADD17C,2.527300*%
|
||||
%ADD18C,2.152400*%
|
||||
%ADD19C,1.448000*%
|
||||
%ADD18C,0.939800*%
|
||||
%ADD19C,1.143000*%
|
||||
%ADD20C,2.152400*%
|
||||
%ADD21C,1.448000*%
|
||||
G04 APERTURE END LIST*
|
||||
%LPC*%
|
||||
D10*
|
||||
X61341000Y-117983000D02*
|
||||
X60706000Y-117983000D01*
|
||||
X60706000Y-117983000D02*
|
||||
X60706000Y-118618000D01*
|
||||
%LPC*%
|
||||
D11*
|
||||
G36*
|
||||
X139700000Y-139446000D02*
|
||||
G01*
|
||||
@ -33,15 +40,9 @@ X73660000Y-132080000D01*
|
||||
X139700000Y-132080000D01*
|
||||
X139700000Y-139446000D01*
|
||||
G37*
|
||||
D11*
|
||||
X102800000Y-86500000D03*
|
||||
D12*
|
||||
X108800000Y-86500000D03*
|
||||
D13*
|
||||
X105300000Y-81700000D03*
|
||||
D14*
|
||||
X64135000Y-108204000D03*
|
||||
D15*
|
||||
D13*
|
||||
X61595000Y-108204000D03*
|
||||
X64135000Y-105664000D03*
|
||||
X61595000Y-105664000D03*
|
||||
@ -51,7 +52,32 @@ X64135000Y-100584000D03*
|
||||
X61595000Y-100584000D03*
|
||||
X64135000Y-98044000D03*
|
||||
X61595000Y-98044000D03*
|
||||
D14*
|
||||
X102800000Y-86500000D03*
|
||||
D15*
|
||||
X108800000Y-86500000D03*
|
||||
D16*
|
||||
X105300000Y-81700000D03*
|
||||
D17*
|
||||
X65786000Y-121793000D03*
|
||||
X65786000Y-116713000D03*
|
||||
X60071000Y-116713000D03*
|
||||
X60071000Y-121793000D03*
|
||||
D18*
|
||||
X61341000Y-119888000D03*
|
||||
X62611000Y-119888000D03*
|
||||
X63881000Y-119888000D03*
|
||||
X65151000Y-119888000D03*
|
||||
X66421000Y-119888000D03*
|
||||
X66421000Y-118618000D03*
|
||||
X65151000Y-118618000D03*
|
||||
X63881000Y-118618000D03*
|
||||
X62611000Y-118618000D03*
|
||||
X61341000Y-118618000D03*
|
||||
D19*
|
||||
X60071000Y-119253000D03*
|
||||
X67691000Y-118237000D03*
|
||||
X67691000Y-120269000D03*
|
||||
X67691000Y-118237000D03*
|
||||
X67691000Y-120269000D03*
|
||||
X60071000Y-119253000D03*
|
||||
@ -60,7 +86,7 @@ X60071000Y-116713000D03*
|
||||
X60071000Y-121793000D03*
|
||||
X65786000Y-121793000D03*
|
||||
X65786000Y-116713000D03*
|
||||
D10*
|
||||
D11*
|
||||
G36*
|
||||
X130000179Y-131537818D02*
|
||||
G01*
|
||||
@ -1861,11 +1887,11 @@ X136740900Y-131535800D01*
|
||||
X137579100Y-131535800D01*
|
||||
X137620179Y-131537818D01*
|
||||
G37*
|
||||
D18*
|
||||
D20*
|
||||
X140462000Y-129540000D03*
|
||||
D19*
|
||||
X48133000Y-98679000D03*
|
||||
X58293000Y-85979000D03*
|
||||
D21*
|
||||
X48133000Y-96139000D03*
|
||||
X57023000Y-84709000D03*
|
||||
X143002000Y-127000000D03*
|
||||
X48133000Y-127000000D03*
|
||||
X140462000Y-82423000D03*
|
||||
|
@ -1,35 +1,35 @@
|
||||
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(5.1.5-0-10_14)*
|
||||
G04 #@! TF.CreationDate,2020-10-17T17:20:31-04:00*
|
||||
G04 #@! TF.ProjectId,GR8RAM,47523852-414d-42e6-9b69-6361645f7063,rev?*
|
||||
G04 #@! TF.CreationDate,2021-02-17T19:07:14-05:00*
|
||||
G04 #@! TF.ProjectId,GR8RAM,47523852-414d-42e6-9b69-6361645f7063,0.9*
|
||||
G04 #@! TF.SameCoordinates,Original*
|
||||
G04 #@! TF.FileFunction,Profile,NP*
|
||||
%FSLAX46Y46*%
|
||||
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
|
||||
G04 Created by KiCad (PCBNEW (5.1.5-0-10_14)) date 2020-10-17 17:20:31*
|
||||
G04 Created by KiCad (PCBNEW (5.1.5-0-10_14)) date 2021-02-17 19:07:14*
|
||||
%MOMM*%
|
||||
%LPD*%
|
||||
G04 APERTURE LIST*
|
||||
%ADD10C,0.150000*%
|
||||
G04 APERTURE END LIST*
|
||||
D10*
|
||||
X57785000Y-80391000D02*
|
||||
X46101001Y-92074999D01*
|
||||
X57785000Y-80391000D02*
|
||||
G75*
|
||||
G02X59309000Y-79883000I1524000J-2032000D01*
|
||||
G01*
|
||||
X46101001Y-92074999D02*
|
||||