------------------------------------------------------------------------------- -- Title : Filtre gaussien optimise -- Project : ------------------------------------------------------------------------------- -- File : gaussien.vhd -- Author : -- Created : 1999/10/04 -- Last modified : 1999/10/04 ------------------------------------------------------------------------------- -- Description : moyenne de 9 pixels pris individuelement avec frequence de -- sorie divisee par trois -- Version synthetisable pipelinee -- On calcule une somme ponderre 1-2-1 sur 3 pixels -- Puis on calcule la meme somme ponderee sur trois sommes ---- 1 2 1 = 1 S1 -- 2 4 2 = 2 S2 --- 1 2 1 = 1 S3 ------------------------------------------------------------------------------- -- Modification history : -- 1999/10/04 : created ------------------------------------------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE work.utils.ALL; ENTITY filtre IS PORT (h : IN std_ulogic; -- horloge init : IN std_ulogic; -- reset pixel : IN natural RANGE 0 TO 255; pix_calcul : OUT natural RANGE 0 TO 255 ; ready_in : IN std_ulogic; -- protocole d'entree ack_in : OUT std_ulogic; ready_out : OUT std_ulogic; ack_out : IN std_ulogic); END filtre; -- la sortie pix_out est divisee par 16 donc il y a une virgule fixe implicite ARCHITECTURE gaussien OF filtre IS SIGNAL somme1, somme2, somme3 : natural RANGE 0 TO 4*255; SIGNAL autorise : std_ulogic;-- pour entree donnees SIGNAL fin_calcul : std_ulogic; BEGIN autorise <= NOT( fin_calcul) AND ready_in AND NOT (ack_OUT ); ready_OUT <= fin_calcul; un_seul: PROCESS (init, h, ack_out) -- init asynchrone VARIABLE comptage : natural RANGE 0 TO 2; VARIABLE accum1: natural RANGE 0 TO 4*255; VARIABLE accum2 : natural RANGE 0 TO 16*255; BEGIN IF init = '1' OR ack_out = '1'THEN fin_calcul <= '0'; fin_calcul <= '0'; ELSIF init = '1' THEN comptage := 0; accum1 := 0; accum2 := 0; somme1 <= 0; somme2 <= 0; somme3 <= 0; pix_calcul <= 0; ELSIF front_montant(h) THEN IF autorise = '1' THEN CASE comptage IS WHEN 0 => comptage := 1 ; accum1 := pixel; accum2 := somme1; WHEN 1 => comptage := 2; accum1 := accum1 + 2*pixel; accum2 := accum2 + 2*somme2; WHEN 2 => comptage := 0; accum1 := accum1 + pixel; accum2 := accum2 + somme3; somme3 <= accum1; somme2 <= somme3; somme1 <= somme2; pix_calcul <= accum2/16; fin_calcul <= '1'; END CASE; END IF; END IF; END PROCESS; protoc_in : PROCESS (h, init) BEGIN -- PROCESS entree IF init = '1' THEN ack_in <= '0'; ELSIF front_montant(h) THEN ack_IN <= autorise; END IF; END PROCESS protoc_in; END gaussien ;