Netlist v hdl-whid/GDG_core.vhd je automaticky generovany nastrojem
gdg2vhdl (ver. 4.6) z reverzne inzenyrovanych dat čipu. Obsahoval
dve chyby, které se projevovaly v 4-barevném režimu (DMD=0x00).
Na realnem MZ-800 palety fungují správně — jde o chyby extrakce netlistu, ne o chování skutecneho čipu.
Při zápisu palety (port F0H) jsou bity S0 (DT(4)) a S1 (DT(5)) pouzity jako index palety (0-3). CLK dekodér určuje, který paletový registr (inPAL0-3) se aktivuje.
V puvodnim netlistu byl prohozeny S0 a S1 ve dvou ze čtyř CLK signálu, což zpusobilo prohozeni palet 1 a 2.
Každý CLK signál je generovany OR-NAND logikou:
CLK_x = NOT((common OR bit_A OR bit_B) AND enable)
Kde bit_A a bit_B jsou kombinace S0/~S0 a S1/~S1:
| CLK signál | Registr | Puvodni signály | Aktivace (puvodni) | Správná aktivace |
|---|---|---|---|---|
| net_F601_134_16_CLK | inPAL0 | S0, S1 | index 0 (S0=0,S1=0) | index 0 OK |
| net_F601_137_16_CLK | inPAL1 | S0, ~S1 | index 2 (S0=0,S1=1) | index 1 OPRAVENO |
| net_F601_131_15_CLK | inPAL2 | ~S0, S1 | index 1 (S0=1,S1=0) | index 2 OPRAVENO |
| net_F601_128_14_CLK | inPAL3 | ~S0, ~S1 | index 3 (S0=1,S1=1) | index 3 OK |
Řádek 3763 (inPAL2 CLK) — puvodni:
net_F601_131_15_CLK <= NOT ( ( net_F303_120_14_out
OR net_F433_137_21_in2 OR net_F433_137_20_in3 )
AND net_F433_137_20_in4 );
Opraveno na:
net_F601_131_15_CLK <= NOT ( ( net_F303_120_14_out
OR net_F433_137_20_in2 OR net_F433_135_20_in3 )
AND net_F433_137_20_in4 );
Řádek 4027 (inPAL1 CLK) — puvodni:
net_F601_137_16_CLK <= NOT ( ( net_F303_120_14_out
OR net_F433_137_20_in2 OR net_F433_135_20_in3 )
AND net_F433_137_20_in4 );
Opraveno na:
net_F601_137_16_CLK <= NOT ( ( net_F303_120_14_out
OR net_F433_137_21_in2 OR net_F433_137_20_in3 )
AND net_F433_137_20_in4 );
Před opravou: palety 0 a 3 OK, palety 1↔2 prohozeny. Po oprave: všechny 4 palety se zapisuji do spravnych registru.
GDG čte plane I a plane II v oddelench DRAM cyklech. Flip-flop
xF635_20_20 (řádek 4224) alternuje mezi dvěma stavy:
- O = 0, nO = 1 → net_cs_Plane_I aktivní (latch pro plane I)
- O = 1, nO = 0 → net_cs_Plane_II aktivní (latch pro plane II)
Oba plany používají stejně VA[7:0] piny — data se liší adresou, ne pozici na busu. Každý plane ma svuj ČAS cyklus.
Puvodni VramModel cekal po každém /VCAS cyklů na novy /VRAS,
takže propaskl druhý ČAS cyklus (plane II data).
Důsledek: bus_Plane_II zachytaval pull-up hodnotu 0xFF místo
skutecnych VRAM dat. bus_INK(1) (O výstup xF631_96_24) byl
trvale 0, což znemoznilo výběr palet s SEL_B=1.
Pridana vnitřní smycka pro vice ČAS cyklů v ramci jednoho RAS:
while True:
await FallingEdge(self.dut.nVRAS)
self.row_addr = ...
while True: # nova smycka
await FallingEdge(self.dut.nVCAS)
# ... cteni/zapis ...
await RisingEdge(self.dut.nVCAS)
await self._release_bus()
if int(self.dut.nVRAS.value) == 1:
break # konec RAS cyklu
Před opravou: bus_INK(1) stuck at 0, jen 2 z 4 palet dostupné.
Po oprave: oba plany se čtou správně, všechny 4 palety funkcni.
Toto nebyla chyba v VHDL netlistu — signálové cesty v GDG_core.vhd jsou pro plane II korektni. Chyba byla v simulacnim modelu VRAM. Puvodni analýza ("Bug 2: SEL_B stuck at 0") chybne identifikovala problem jako chybu extrakce netlistu.
Po obou opravach kompletní řetězec funguje:
Port F0H zapis (IGRB)
↓ bus_DT → bus_AB (invertovano)
↓ CLK dekoder (S0,S1 → inPAL0-3) ← Oprava 1
bus_inPAL0-3 (NOT(IGRB))
↓
NAND mux (outPAL, select: SEL_A=INK(3), SEL_B=INK(1))
↓ bit remap: BRGI(3)=inPAL(0), BRGI(2)=inPAL(2),
↓ BRGI(1)=inPAL(1), BRGI(0)=inPAL(3)
bus_BRGI
↓
INK_BKG MUX (MZ-800 grafika vs MZ-700 text)
↓ bit swap: INK_BKG(3)↔RBGI(0), INK_BKG(0)↔RBGI(3)
bus_RBGI
↓
F666 flip-flop (nO vystup = inverze)
↓
Piny: YITN=I, GREEN=G, RED=R, BLUE=B
Výsledek: výstupní piny nesou spravnou IGRB barvu vybrane palety.
Puvodni dokumentace predpokladala, ze plane I a plane II data jsou na VA busu současně (VA[3:0]=plane I, VA[7:4]=plane II). Simulace ukazala, ze GDG čte plany sekvencne:
net_cs_Plane_I)net_cs_Plane_II)Toto je konzistentni s 4164C-3 DRAM architekturou MZ-800.
Test test_palette_nand_diag overuje:
1. Všechny 4 paletové registry obsahuji správná data
2. Výstupní piny (YITN, GREEN, RED, BLUE) odpovídají zapsanym
IGRB hodnotam pro pixelove indexy 0 a 3
Test test_coldstart_vram generuje obraz:
- Před opravou: cerveno-bílé pruhy (spatna paleta)
- Po oprave: cerno-bílé pruhy (správně, jako reálný HW)
sim/test_palette_diag.py — diagnosticky test paletoveho systémusim/vram_model.py — VRAM model s page-mode podporousim/output/coldstart_canvas.png — vygenerovany obraz