-- Fichier : median.vhd -- Societe : ENSERB -- Auteur : P.Nouel -- Date de creation : Octobre 99 -- Contenu : Filtre median -- Synthetisable ? : Non -------------------------------------------------------------------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE ieee.numeric_std.ALL; USE work.paq_tri.ALL; ARCHITECTURE median OF filtre IS SIGNAL p1, p2 ,p3, p4, p5, p6, p7, p8, p9 : natural RANGE 0 TO 255; SIGNAL autorise : std_ulogic;-- pour entree donnees SIGNAL p123, m123, g123, calcul : natural RANGE 0 TO 255; SIGNAL fin_calcul : std_ulogic; BEGIN memo : PROCESS (h, init) BEGIN -- PROCESS memo -- activities triggered by asynchronous reset (active low) IF init = '1' THEN p1 <= 0; p2 <= 0; p3 <= 0; p4 <= 0; p5 <= 0; p6 <= 0; p7 <= 0; p8 <= 0; p9 <= 0; ELSIF autorise = '1' THEN -- activities triggered by rising edge of clock IF h'event AND h = '1' AND h'last_value = '0'THEN p1 <= pixel; p2 <= p1; p3 <= p2; p4 <= p3; p5 <= p4; p6 <= p5; -- decalage p7 <= p6; p8 <= p7; p9 <= p8; END IF; END IF; END PROCESS memo; autorise <= NOT( fin_calcul) AND ready_IN AND NOT (ack_OUT ) ; entree : PROCESS (h, init) BEGIN -- PROCESS entree -- activities triggered by asynchronous reset (active low) IF init = '1' THEN ack_in <= '0'; -- activities triggered by rising edge of clock ELSIF h'event AND h = '1' AND h'last_value = '0' THEN ack_IN <= autorise; END IF; END PROCESS entree; cal : PROCESS ( h,init, ack_out) VARIABLE nombre : natural := 0; BEGIN -- PROCESS -- activities triggered by asynchronous reset (active low) IF init = '1' OR ack_OUT = '1' THEN fin_calcul <= '0'; -- activities triggered by rising edge of clock ELSIF h'event AND h = '1' AND h'last_value = '0' THEN IF autorise = '1' THEN nombre := nombre + 1; IF nombre = 3 THEN nombre := 0; fin_calcul <= '1'; END IF; END IF; END IF; END PROCESS; ready_out <= fin_calcul; algo:PROCESS(p1,p2,p3, p4, p5, p6, p7, p8, p9) VARIABLE pp1, pp2, pp3,pp4, pp5, pp6, pp7, pp8, pp9, l1, m1, g1, l2, m2, g2, l3, m3, g3, g4, l4, g5, m5, l5, m6 : natural; BEGIN pp9 := p9; pp8 := p8; pp7 := p7; pp6 := p6; pp5 := p5; pp4 := p4; pp3 := p3; pp2 := p2; pp1 := p1; tri_pmg( pp3, pp2, pp1 ,l1, m1, g1) ; tri_pmg( pp6, pp5, pp4 ,l2, m2, g2) ; tri_pmg( pp9, pp8, pp7 ,l3, m3, g3) ; tri_g(l2, l1, g4); tri_g(l3, g4, g5); tri_p(g3, g2, l4); tri_p(l4, g1, l5); tri_m(m3, m2, m1, m5); tri_m(l5, m5, g5, m6); calcul <= m6; END PROCESS; b1 : BLOCK (fin_calcul = '1') BEGIN -- BLOCK b1 pix_calcul <= GUARDED calcul; END BLOCK b1; END median ;