------------------------------------------------------------------------------- -- Titre : camera ppm -- Projet : ------------------------------------------------------------------------------- -- Fichier : camerappm.vhd -- Auteur : NOUEL Patrice -- Compagnie : -- Mise a jour : 2000/10/24 -- Platform : ------------------------------------------------------------------------------- -- Description : -- ------------------------------------------------------------------------------- -- Modification history : -- 2000/10/24 : creation ------------------------------------------------------------------------------- LIBRARY ieee; USE ieee.std_logic_1164.ALL; USE ieee.numeric_std.ALL; LIBRARY std; USE std.textio.ALL; ENTITY camerappm IS GENERIC (nom_fichier : string := "logoenserb.ppm"; en_tete : IN string := "P3"; largeur : IN natural := 736; hauteur : IN natural := 566 ; couleur_max : IN natural := 255); PORT ( rouge : OUT unsigned( 7 DOWNTO 0 ) ; -- pixels vert : OUT unsigned( 7 DOWNTO 0 ) ; bleu : OUT unsigned( 7 DOWNTO 0 ) ; h : IN std_logic); -- horloge pour appeller la sortie END camerappm ; ARCHITECTURE sans_tableau OF camerappm IS BEGIN -- sans_tableau lecture : PROCESS FILE fichier : text IS IN nom_fichier; VARIABLE index : natural := 0; VARIABLE ligne : line; VARIABLE donnee : natural; VARIABLE entete : string (1 TO 2); -- on attend P3 ou P2 VARIABLE nx : natural := 15; -- nombre de caracteres par ligne VARIABLE ny : natural; -- nombre de lignes; VARIABLE max : natural; -- intensite max VARIABLE bon : boolean; -- CONSTANT motsligne: natural := 15; -- nombre d'octets par ligne du fichier CONSTANT nbr_pixels : natural := largeur * hauteur * 3; -- 736 * 566 * 3 = 1249728 VARIABLE couleur : natural RANGE 0 TO 2 := 0; -- 0 rouge 1 vert 2 bleu BEGIN -- PROCESS charger ASSERT false REPORT "debut de lecture du fichier " SEVERITY note; readline(fichier, ligne); -- ouverture du fichier image read(ligne,entete,bon); ASSERT bon REPORT "l'en-tete n'est pas trouvee" SEVERITY error; ASSERT entete = en_tete REPORT "en-tete incorrecte" SEVERITY error ; readline(fichier, ligne); -- 1 ligne de commentaire readline(fichier, ligne); read(ligne,nx,bon); ASSERT bon REPORT "erreur de format sur nx" SEVERITY error; ASSERT nx = largeur REPORT "Dimension de ligne incorrect" SEVERITY error; read(ligne,ny,bon); ASSERT bon REPORT "erreur de format sur ny" SEVERITY error; ASSERT ny = hauteur REPORT "Nombre de lignes incorrect" SEVERITY error; readline(fichier, ligne); read(ligne,max,bon); ASSERT bon REPORT "erreur de format sur max" SEVERITY error; ASSERT max = couleur_max REPORT "niveau max de couleur incorrect" SEVERITY error; index := 0; couleur := 0; -- rouge l1: WHILE NOT ENDFILE(fichier) LOOP readline(fichier, ligne); read(ligne,donnee, bon); WHILE bon LOOP WAIT UNTIL rising_edge(h); -- pour synchroniser index := index + 1; CASE couleur IS WHEN 0 => rouge <= to_unsigned(donnee,8); WHEN 1 => vert <= to_unsigned(donnee,8); WHEN 2 => bleu <= to_unsigned(donnee,8); END CASE; IF couleur < 2 THEN couleur := couleur + 1; ELSE couleur := 0; END IF; IF index = nbr_pixels /4 THEN ASSERT false REPORT "Patience ... plus que 75%" SEVERITY note; END IF; IF index = nbr_pixels /2 THEN ASSERT false REPORT "Patience ... plus que 50%" SEVERITY note; END IF; IF index = nbr_pixels *3 /4 THEN ASSERT false REPORT "Patience ... plus que 25%" SEVERITY note; END IF; read(ligne,donnee, bon); END LOOP; END LOOP; ASSERT false REPORT "Ouf !!, c'est fini" SEVERITY note; ASSERT index = nbr_pixels REPORT "Nombre de pixels incorrect" SEVERITY error; WAIT; END PROCESS; END sans_tableau;