-- Subdesign C-One 1K100 -- C-One reconfigurable computer -- (c) Tobix Gubener 2004 -- All rights reserved. -- only for use in the C-One-Projekt! --VGA Demultiplexer & Switch --mögliche Clocks 5x 6x 6,25x (8x) --Part of 1K100 SUBDESIGN gbmux ( C135MHz :INPUT; --sysclk vid[15..0] :INPUT; --vga-daten vsync :INPUT; hsync :INPUT; ilr_clk :INPUT=GND; --LR_CLK Audio, nicht beschalten wenn nicht gebraucht iauda :INPUT=GND; --Audiodaten, nicht beschalten wenn nicht gebraucht pixclkena :OUTPUT; --Takt für VGA-Controller --Entweder mit fallende Flanke takten oder als enable(H-aktiv) für Takt des Videocontrollers nutzen gb[5..0] :OUTPUT; --Senddaten gbi[7..6] :INPUT; --Empfangsdaten(gbi[7]=2MHZ,sync,streamB,streamA; gbi[6] noch frei) 2MHz :OUTPUT; --Für Audioshifter adr[19..0] :OUTPUT; --Gespiegelter Adressbus data[7..0] :OUTPUT; --Gespiegelter Datenbus iowr :OUTPUT; --IOWR =>L-aktiv memwr :OUTPUT; --MEMWR =>L-aktiv, Impulslänge siehe unten wrshift[14..0] :OUTPUT; --bei Schreibzugriff wird eine 1 von [0] nach [14] --durchgeschoben, gut für Ablaufsteuerung, jede Stufe ca 40ns, --z.B. [1] Bus übernehmen, [2] Daten schreiben, [3] Bus freigeben ) VARIABLE ring[2..0] :DFF; gshift[15..0] :DFF; ldekt[3..0] :DFF; adekt[3..0] :DFF; inshift[3..0] :DFF; dshifta[14..0] :DFFE; dshiftb[14..0] :DFFE; wrshift[14..0] :DFFE; dataA[15..0] :DFFE; dataB[15..0] :DFFE; 2MHz :DFFE; dummy[1..0] :NODE; BEGIN ring[].clk=C135MHz; pixclkena=ring[0]; ring[2..1]=ring[1..0]; ring[0]=NOT (ring[0] OR ring[1] OR ring[2]); --Sender -- (gshift[], ldekt[], adekt[]).clk=NOT C135MHz; --mit sysclk versorgen (gshift[], ldekt[], adekt[]).clk=C135MHz; --mit sysclk versorgen IF ring[0] THEN -- gshift[]=(vid[7..3],vid[7..2],vid[7..3]); --testpattern -- gshift[]=(vid[13..9],vid[12..2]); --testpattern gshift[]=vid[]; --final ldekt[]=(ilr_clk, vsync, hsync, vcc); adekt[]=(iauda, GND, GND, vcc); ELSE gshift[15..4]=gshift[11..0]; ldekt[3..1]=ldekt[2..0]; adekt[3..1]=adekt[2..0]; END IF; gb[5..0]=(adekt[3],ldekt[3],gshift[15..12]); ----------------------------------------------------- --Empfaenger(deshifter) (inshift[], dshifta[], dshiftb[], wrshift[], dataA[], dataB[], 2MHz).clk=C135MHZ; (dshifta[], dshiftb[], wrshift[], 2MHz).ena=ring[1]; (dataA[], dataB[]).ena=ring[1] AND inshift[2]; (adr[], data[], iowr, memwr, dummy[1], dummy[0])=(dataA[], dataB[]); (dataB[3]).prn=NOT wrshift[1]; --IOWR=H, index in Klammern bestimmt die Länge des IOSchreibimpulses =>Impulslänge =index/25MHz (dataB[2]).prn=NOT wrshift[3]; --MEMWR=H, index in Klammern bestimmt die Länge des MEMSchreibimpulses =>Impulslänge =index/25MHz dshifta[]=(dshifta[13..0], inshift[0]); dshiftb[]=(dshiftb[13..0], inshift[1]); wrshift[]=(wrshift[13..0], inshift[2]); 2MHz=inshift[3]; dataA[]=(dshifta[], inshift[0]); dataB[]=(dshiftb[], inshift[1]); inshift[]=(inshift[2..0],gbi[7]); END;