-- *********************************************** -- * * -- Extraction du préambule et démultiplexage * -- * CCIR601 * -- * J. WEISS, septembre 2001 * -- * * -- * Entrée : Bus CCIR (8 bits, 27 MHz) * -- * Traitement : * -- * Détection de l'En-Tête : FF 00 00 XY) * -- * Démultiplexage du bus en Y, Cr, Cb * -- * Sorties : * -- * 3 bus 8 bits : Y, Cr, Cb * -- * Signaux de synchro : F, V, H * -- * Signaux de validation Luma/Chroma * -- *********************************************** LIBRARY ieee; USE ieee.std_logic_1164.all; USE ieee.std_logic_arith.all; ENTITY CCIR_ENCODER IS PORT ( Bus_Out : OUT UNSIGNED (7 DOWNTO 0); -- Bus CCIR Y : IN UNSIGNED (7 DOWNTO 0); -- Bus Luminance Cr : IN UNSIGNED (7 DOWNTO 0); -- Bus Chrominance Rouge Cb : IN UNSIGNED (7 DOWNTO 0); -- Bus Chrominance Bleu CK27M : IN STD_LOGIC; -- Horloge 27 MHz F : IN STD_LOGIC; -- Synchronisation (Frame) V : IN STD_LOGIC; -- Synchronisation (Vertical) H : IN STD_LOGIC -- Synchronisation (Horizontal) ); END CCIR_ENCODER; ARCHITECTURE a OF CCIR_ENCODER IS SIGNAL q : INTEGER RANGE 0 to 3; SIGNAL Code_FF : STD_LOGIC; SIGNAL Cmd : UNSIGNED (2 DOWNTO 0); SIGNAL CCIR_Int : STD_LOGIC; SIGNAL HQ : STD_LOGIC; SIGNAL Rouge : STD_LOGIC; SIGNAL LUMA : STD_LOGIC; SIGNAL Commande : INTEGER RANGE 0 to 7; SIGNAL Bus_Int :UNSIGNED (7 DOWNTO 0); SIGNAL Cb_Int :UNSIGNED (7 DOWNTO 0); BEGIN Code_FF <= H XOR HQ; -- Génération de LUMA/ROUGE : LUMA (13,5 MHz) et Rouge (6,75 MHz) PROCESS (CK27M) BEGIN IF (CK27M'EVENT AND CK27M = '1') THEN HQ <= H; Cmd(0) <= Code_FF; Cmd(1) <= Cmd(0); Cmd(2) <= Cmd(1); IF Cmd(2) = '1' THEN LUMA <= '0'; Rouge <= '0'; ELSE LUMA <= not(LUMA); Rouge <= LUMA XOR Rouge; END IF; END IF; END PROCESS; CCIR_Int <= Code_FF OR Cmd(0) OR Cmd(1) OR Cmd(2); Commande <= CONV_INTEGER(Cmd); PROCESS (CK27M) BEGIN IF (CK27M'EVENT AND CK27M = '1') THEN CASE Commande IS WHEN 0 => -- Fonctionnement normal IF Code_FF = '1' THEN Bus_Int <= "11111111"; ELSE IF HQ = '0' THEN IF LUMA = '1' THEN Bus_Int <= Y; ELSE IF ROUGE = '1' THEN Bus_Int <= Cr; ELSE Bus_Int <= Cb; END IF; END IF; ELSE Bus_Int <= "10000000"; END IF; END IF; WHEN 4 => -- Envoi de XY Bus_Int(7) <= '1'; Bus_Int(6) <= F; Bus_Int(5) <= V; Bus_Int(4) <= H; Bus_Int(3) <= V XOR H; Bus_Int(2) <= F XOR H; Bus_Int(1) <= F XOR V; Bus_Int(0) <= F XOR V XOR H; WHEN others => Bus_Int <= "00000000"; END CASE; END IF; END PROCESS; Bus_Out <= Bus_Int; END a;