03 — Pin NTPL — přepínání PAL/NTSC

Základní informace

Pin NTPL (pin 83) určuje televizní systém: - NTPL = '0' → PAL (evropská verze MZ-800) - NTPL = '1' → NTSC (japonská verze MZ-800)

V evropské verzi je NTPL připojen na GND (konstantně '0').

Signál i_NTPL se v GDG_core.vhd vyskytuje na 8 místech a ovlivňuje 5 hlavních subsystému: COLUMN čítač, HSYNC, VSYNC/VBLN, CPU clock a ROW čítač.

1. COLUMN čítač — horizontální timing

NTPL přímo určuje předvolbu (preset) obou 4-bit čítačů COLUMN.

Čítač xF961_61_9 — COLUMN(7:4)

Řádky 6330–6352. Předvolby závislé na NTPL:

-- radek 6146:
net_F961_61_9_in2 <= NOT i_NTPL;          -- PAL=1, NTSC=0
-- radek 6147:
net_F961_61_9_in4 <= NOT ( NOT i_NTPL );  -- PAL=0, NTSC=1
Vstup Signál PAL (NTPL=0) NTSC (NTPL=1)
I1 net_F100_88_7_in 1 (*) závisí na CKSW
I2 NOT i_NTPL 1 0
I3 NOT i_NTPL 1 0
I4 i_NTPL 0 1

(*) Při CKSW=0: I1 = NTPL NAND CKSW = 0 NAND 0 = 1

Předvolba COLUMN(7:4): - PAL: I4 I3 I2 I1 = 0110 → preset 6 - NTSC: I4 I3 I2 I1 = 1001 → preset 9

Čítač xF961_61_7 — COLUMN(3:0)

Řádky 6596–6617. Předvolby při CKSW=0:

-- radek 6548:
net_F100_88_7_in <= i_NTPL NAND net_F961_61_7_in2;
-- radek 6545:
net_F431_89_8_out <= NOT ( ( i_NTPL OR net_F961_61_7_in2 )
    AND net_F100_88_7_in );
-- radek 6678:
net_F100_88_7_out <= NOT net_F100_88_7_in;
Vstup Signál PAL (NTPL=0, CKSW=0) NTSC (NTPL=1, CKSW=0)
I1 GND 0 0
I2 CKSW 0 0
I3 XNOR(NTPL,CKSW) 1 0
I4 NOT(NTPL NAND CKSW) 0 1

Předvolba COLUMN(3:0): - PAL: I4 I3 I2 I1 = 0100 → preset 4 - NTSC: I4 I3 I2 I1 = 1000 → preset 8

Kompletní předvolba COLUMN(7:0)

Systém COLUMN(7:4) COLUMN(3:0) Celkem H-perioda
PAL 0110 (6) 0100 (4) 0x64 = 100 1136 CLK0 (*)
NTSC 1001 (9) 1000 (8) 0x98 = 152 910 CLK0 (*)

(*) Čítač odpočítává od preset do přetečení (256). COLUMN je inkrementovan každou periodu CLK0 (po vydělení). Rozdíl v presetu přímo ovlivňuje délku řádku.

Pozn.: Přesná délka řádku závisí na dělicím poměru, který určuje jak často se COLUMN čítač inkrementuje. Hodnoty 1136 a 910 jsou orientační — skutečný timing je třeba ověřit simulací.

2. HSYNC — horizontální synchronizace

NTPL ovlivňuje HSYNC dvěma cestami:

a) Nepřímou — přes změnu COLUMN presetu

HSYNC je generovan 4 flip-flopy xF615_141_20 až xF615_141_23, které porovnávají bus_COLUMN s pevnými hodnotami. Změna presetu COLUMN čítače posouvá pozici HSYNC v řádku.

b) Primou — přes reset flip-flopu

Dva resety flip-flopu závisí na NTPL (řádky 2454–2461):

-- radek 2454:
net_F202_152_26_in1 <= NOT i_NTPL;
-- radek 2455:
net_F202_151_26_in1 <= NOT ( NOT i_NTPL );

-- radek 2458 (reset pro xF615_141_22 a xF615_141_21):
net_F100_76_20_in <= net_F202_152_26_in1 NOR net_F202_152_26_in2;

-- radek 2461 (reset pro xF615_141_23 a xF615_141_20):
net_F100_135_22_in <= net_F202_151_26_in1 NOR net_F202_152_26_in2;

Druhý vstup NOR brány (net_F202_152_26_in2) je buffer signálu net_F112_128_13_in (řádek 2948), který pochází z xF631_150_19 (TEST/MOD7/TEMP logika).

Efekt: Při PAL (NTPL=0) je NOT NTPL = 1, takže NOR brána na řádku 2458 dava výsledek 0 nezavisle na druhém vstupu → reset flip-flopu xF615_141_22/21 je trvale aktivní (nRES=0). Při NTSC (NTPL=1) se reset řídí signálem net_F202_152_26_in2.

Toto mění sadu flip-flopu, které se podílejí na generování HSYNC — fakticky se přepíná mezi dvěma různými HSYNC timingys.

HSYNC flip-flopy (řádky 3204–4024)

Flip-flop Reset signál PAL (NTPL=0) NTSC (NTPL=1)
xF615_141_23 (řádek 3204) net_F100_135_22_in aktivní závisí na F202
xF615_141_22 (řádek 3479) net_F100_76_20_in trvale reset závisí na F202
xF615_141_21 (řádek 3751) net_F100_76_20_in trvale reset závisí na F202
xF615_141_20 (řádek 4018) net_F100_135_22_in aktivní závisí na F202

D vstupy všech čtyř flip-flopu porovnávají bity bus_COLUMN s různými kombinacemi (AND-OR-NOT logika). Přesně pozice HSYNC pulsu jsou určený soucinem COLUMN bitu a stavu těchto flip-flopu.

Výstup HSYNC

-- radek 2451:
o_nHSYN <= net_F424_27_26_in4 NAND net_F424_37_26_in4;

HSYNC = NAND výstupu xF615_141_23 a xF615_141_22.

3. VSYNC a VBLN — vertikální timing

VSYNC

-- radek 3647:
o_nVSYN <= net_F424_56_19_in1 NAND net_F424_46_20_in1;

Zdroje: - net_F424_56_19_in1 — výstup xF612_58_19 (řádek 4406–4412) - D vstup: net_F424_56_19_out (zpětná vazba z bus_ROW bitu) - Reset: net_F612_73_19_rst = NOT net_F100_76_20_in (řádek 4140) - net_F424_46_20_in1 — výstup xF612_45_22 (řádek 3652–3658) - D vstup: net_F424_46_20_out (zpětná vazba z bus_ROW bitu) - Reset: net_F612_57_18_rst = NOT net_F100_135_22_in (řádek 3503)

VSYNC není přímo rizeno NTPL, ale neprime cesty existuji: 1. Resety flip-flopu závisí na net_F100_76_20_in / net_F100_135_22_in (které závisí na NTPL, viz výše) 2. D vstupy porovnávají bus_ROW, jehoz cyklovani je ovlivneno NTPL přes ROW čítač reset

VBLN (vertikální blanking)

-- radek 5798:
o_nVBLN <= NOT net_F100_111_13_in;

Flip-flop xF615_120_12 (řádek 5957–5962): - Reset: net_F114_17_19_in = NOT net_F105_139_19_in (řádek 4291) - net_F105_139_19_in pochází z xF631_150_19 (TEST/MOD7/TEMP logika)

VBLN není přímo ovlivneno NTPL. Změna poctu řádku (ROW čítač) vsak ovlivni, kdy se VBLN přepne.

4. ROW čítač — vertikální pozice

Dva 4-bit čítače generuji bus_ROW(7:0):

xF961_61_13 — ROW(7:4)

Řádky 5730–5746:

Vstup Signál Hodnota
I1 net_F961_61_9_in4 PAL=0, NTSC=1
I2 net_F961_61_9_in4 PAL=0, NTSC=1
I3 VDD 1
I4 VDD 1

xF961_61_11 — ROW(3:0)

Řádky 6046–6062:

Vstup Signál Hodnota
I1 GND 0
I2 net_F961_61_9_in4 PAL=0, NTSC=1
I3 GND 0
I4 VDD 1

Předvolba ROW

Systém ROW(7:4) ROW(3:0) Celkem Řádku/snímek
PAL 1100 (C) 1000 (8) 0xC8 = 200 312 (*)
NTSC 1111 (F) 1010 (A) 0xFA = 250 262 (*)

(*) Čítač odpočítává od preset (po přetečení) do dalšího přetečení: 256 - preset = počet viditelnych řádku... ne, správně: čítač cita od presetu do 255 a pak pretece → celkový počet = 256 - preset + 56 (zbytek). Přesný počet řádku je třeba ověřit simulací.

Standardní hodnoty: PAL = 312 řádku, NTSC = 262 řádku.

Reset ROW čítače

-- radek 5771:
xF114_137_13: F114_Buffer32 PORT MAP (
    I => net_F114_137_13_in, O => net_F961_61_11_rst);

-- radek 5786:
net_F114_137_13_in <= NOT net_F112_128_13_in;

Reset signál net_F961_61_11_rst je sdileny s COLUMN reset logikou.

5. CPU clock

NTPL přímo ovlivňuje generování CPU clocku (řádky 6356, 6497):

-- radek 6356:
net_F302_141_8_in1 <= net_F615_10_13_d NAND i_NTPL;

-- radek 6500:
net_F302_141_8_in2 <= net_F612_131_6_out NOR net_F424_138_4_in1;

-- radek 6497:
o_CPU <= net_F302_141_8_in1 NAND net_F302_141_8_in2;

Při PAL (NTPL=0): net_F302_141_8_in1 = X NAND 0 = 1 (konstanta). CPU clock je pak určen pouze signálem net_F302_141_8_in2:

o_CPU = 1 NAND net_F302_141_8_in2 = NOT net_F302_141_8_in2

Při NTSC (NTPL=1): net_F302_141_8_in1 = NOT net_F615_10_13_d. CPU clock závisí na obou vstupech NAND brány — pridava se další podminka z COLUMN čítače (přes xF642_131_11 flip-flop).

Efekt: NTPL přepíná generování CPU clocku mezi dvěma režimy. V PAL režimu je CPU clock jednodussi funkce COLUMN stavu. V NTSC režimu je modulovan dalším signálem.

6. COLUMN reset — společná cesta

NTPL se přímo podílí na resetu COLUMN-related flip-flopu:

-- radek 5789:
net_F102_127_11_in <= net_F112_128_13_in NOR i_NTPL;

-- radek 6102:
net_F612_131_3_rst <= NOT net_F102_127_11_in;

Při PAL (NTPL=0): NOR brána propousti net_F112_128_13_in. Reset flip-flopu = NOT(NOT signál) = signál.

Při NTSC (NTPL=1): NOR brána dava vždy 0 (protože NTPL=1). Reset = NOT 0 = 1 → flip-flopy xF612_131_3/4/6 nikdy nejsou resetovany touto cestou v NTSC režimu.

Ovlivnene flip-flopy: - xF612_131_3 (řádek 7422) — O: net_F612_131_3_out - xF612_131_4 (řádek 7176) — O: net_F424_138_4_in1 (→ CPU clock) - xF612_131_6 (řádek 6741) — O: net_F612_131_6_out (→ CPU clock)

Přesně namerene hodnoty (C model simulace)

Následující hodnoty byly ověřený simulací C modelu GDG (diag_ntsc_timing.c), který je 1:1 prepis VHDL netlisu. Měření probehlo po plnem resetu a ustálení (2 snímky).

Parametr PAL (NTPL=0) NTSC (NTPL=1)
CPU clock dělička CLK0/5 (3.547 MHz) CLK0/4 (4.434 MHz)
CPU duty cycle 2:3 CLK0 (LOW:HIGH) 2:2 CLK0 (symetricky)
CKMS dělička CLK0/16 (1.108 MHz) CLK0/16 (1.108 MHz)
CKMS duty cycle 8:8 CLK0 8:8 CLK0
line_ticks 1136 CLK0 912 CLK0
total_rows 312 262
frame_ticks 354432 CLK0 238944 CLK0
snimkova frekvence 50.04 Hz 74.27 Hz (*)
CPU cyklů na řádek 227.2 228.0

(*) NTSC snimkova frekvence 74.27 Hz neodpovida standardnimu NTSC (59.94 Hz). Je možné, ze japonská verze pouzivala jiný krystal, nebo ze CKSW modifikuje timing další cestou. Hodnota 912 CLK0/řádek je overena, ale skutečný NTSC vyrobek mohl mit odlišný CLK0.

Klic: CPU dělička se MĚNÍ s NTPL

V PAL režimu je jeden vstup NAND brány (net_F302_141_8_in1) konstantní 1, takže CPU clock = NOT(net_F302_141_8_in2) = čistá CLK0/5 dělička.

V NTSC režimu jsou oba vstupy NAND brány aktivní — pridava se modulace z COLUMN čítače (přes xF642_131_11 flip-flop), což mění delici poměr na CLK0/4. CPU clock je v NTSC symetricky (2:2 CLK0), zatímco v PAL ma duty cycle 2:3 CLK0 (ale stále perioda 5 CLK0).

Klic: CKMS se NEMĚNÍ s NTPL

CKMS je odvozena z bus_COLUMN(0) přes flip-flop. Přesto ze COLUMN preset se mění (0x64 vs 0x98), CKMS zůstává CLK0/16 v obou režimech. Je to proto, ze COLUMN counter je inkrementovan 3-bitovou delickou (perioda 8 CLK0), a COLUMN(0) se mění kazdych 8 CLK0 nezavisle na presetu.

Shrnutí

Subsystém Typ vlivu NTPL Efekt
COLUMN čítač přímý — preset I2,I3,I4 PAL: preset 0x64, NTSC: preset 0x98
HSYNC přímý — reset flip-flopu PAL: 2 FF trvale reset, NTSC: všechny 4 aktivní
ROW čítač přímý — preset I1,I2 PAL: preset 0xC8, NTSC: preset 0xFA
VSYNC neprimo — přes ROW a reset změna pozice VSYNC ve snímku
VBLN neprimo — přes ROW změna poctu řádku v canvas/border
CPU clock přímý — NAND brána PAL: CLK0/5 (3.547 MHz), NTSC: CLK0/4 (4.434 MHz)
COLUMN reset přímý — NOR brána PAL: reset aktivní, NTSC: reset blokovany
CKMS (pin 97) neprimo — přes COLUMN nemění se (CLK0/16 v obou režimech)

Změna NTPL propojky z '0' na '1' kompletne přepne video timing z PAL (312 řádku, 50 Hz, 1136 CLK0/řádek, CPU CLK0/5) na NTSC (262 řádku, ~74 Hz, 912 CLK0/řádek, CPU CLK0/4).