24 — Opravy netlistu GDG_core.vhd

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.

Oprava 1: CLK dekodér palet — prohozeni S0/S1

Popis problemu

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.

Analýza CLK dekodéru

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

Oprava v GDG_core.vhd

Řá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 );

Efekt

Před opravou: palety 0 a 3 OK, palety 1↔2 prohozeny. Po oprave: všechny 4 palety se zapisuji do spravnych registru.

Oprava 2: VramModel — podpora page-mode DRAM

Popis problemu

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.

Oprava v vram_model.py

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

Efekt

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.

Poznámka

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.

Signálový řetězec — správně chování

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.

VRAM architektura — upresneni

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:

Toto je konzistentni s 4164C-3 DRAM architekturou MZ-800.

Ověření simulací

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)

Testovací soubory