-- indi16 vhdl -- PAL I clock generator -- (C)2007 K Ring Technologies Semiconductor -- 200/3 MHz PCI crystal -- designed for 66.66666666666 MHz operation LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_unsigned.all; ENTITY clkpal IS PORT ( CLK_I : IN STD_LOGIC; -- displayable colours and phase angles -- 0 0 Red -- 1 30 Orange -- 2 60 Yellow -- 3 90 Lime -- 4 120 Green -- 5 150 Tropic -- 6 180 Cyan -- 7 210 Arctic -- 8 240 Blue -- 9 270 Purple -- a 300 Magenta -- b 330 Pink -- c Black -- d SyncN -- e SyncP -- f White Colour, WColour : IN STD_LOGIC_VECTOR(3 DOWNTO 0); Video, HLT_O : OUT STD_LOGIC ); END clkpal; ARCHITECTURE a OF clkpal IS SIGNAL SyncP : STD_LOGIC; SIGNAL Loc : STD_LOGIC_VECTOR(4 DOWNTO 0); SIGNAL DColour : STD_LOGIC_VECTOR(3 DOWNTO 0); SIGNAL Phase, Phase2 : STD_LOGIC_VECTOR(15 DOWNTO 0); SIGNAL Last, Pal, Last2 : STD_LOGIC; SIGNAL Pos : STD_LOGIC_VECTOR(3 DOWNTO 0); -- phase increment to get 53.15655MHz from 66.6666666MHz -- this is for 12 * 4.4297125 (PAL I colour subcarrier) CONSTANT Increment : STD_LOGIC_VECTOR(15 DOWNTO 0) := "1100110000011111"; -- pix clock increment to get 64MHz CONSTANT PixInc : STD_LOGIC_VECTOR(15 DOWNTO 0) := "1111010111000010"; BEGIN PROCESS(Pos, DColour) BEGIN Loc <= ('0' & Pos) + ('0' & DColour); END PROCESS; PROCESS(Colour, WColour) BEGIN IF Colour = "1111" THEN -- change to the White replacement Colour DColour <= WColour; ELSE DColour <= Colour; END IF; END PROCESS; PROCESS(CLK_I) BEGIN IF rising_edge(CLK_I) THEN IF DColour = "1101" THEN Pal <= '0'; END IF; IF DColour = "1110" And SyncP = '0' THEN Pal <= NOT Pal; END IF; Last <= Phase(15); Phase <= Phase + Increment; IF Phase(15) /= Last THEN IF Pos = "1101" THEN Pos <= "0000"; ELSE Pos <= Pos + 1; END IF; END IF; -- a HLT_O control to sync main fetch to 64MHz for 8MHz video Last2 <= Phase2(15); Phase2 <= Phase2 + PixInc; IF Phase2(15) /= Last2 THEN HLT_O <= '0'; ELSE HLT_O <= '1'; END IF; CASE DColour IS WHEN "1100" => -- Black (low logic) IF Pos = "0000" THEN Video <= '1'; ELSE Video <= '0' ; -- 1/12th END IF; SyncP <= '0'; WHEN "1111" => -- White using Last as approx. 50% Vcc Luma Video <= Last; SyncP <= '0'; WHEN "1110" => -- Phasing Sync Video <= '0'; SyncP <= '1'; WHEN "1101" => -- Optional Sync Video <= '0'; SyncP <= '0'; WHEN OTHERS => IF (Loc < 6) OR (Loc > 11 AND Loc < 18) THEN Video <= Pal; ELSE Video <= NOT Pal; END IF; SyncP <= '0'; END CASE; END IF; END PROCESS; END a;