Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 3 sur 3
  1. #1
    Invité de passage
    Homme Profil pro Vincent
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2012
    Messages : 3
    Points : 1
    Points
    1

    Par défaut Problème code VHDL

    Bonjour,

    Je suis étudiant en première année d'école d'ingénieur et j'ai un projet à réaliser en VHDL. Cependant un de mes programmes compile avec 2 erreurs dont je ne trouve pas la solution...

    Les erreurs sont les suivantes :

    Code :
    1
    2
    # ** Error: C:/Users/Vincent/Desktop/vhdl/work/Affichage/Affichage.vhd(111): near "process": expecting IF
    # ** Error: C:/Users/Vincent/Desktop/vhdl/work/Affichage/Affichage.vhd(115): near "Behavioral": expecting IF
    Et voici mon programme :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    entity Affichage is
    		port( clk_divise, raz : in std_logic;
    		    Sens : in std_logic_vector(1 downto 0);
    				Svecteur_affichage : out std_logic_vector(10 downto 0));
    end Affichage;
    
    architecture Behavioral of Affichage is
    	signal compteur_affichage : std_logic_vector(14 downto 0);
    	signal compteur_rafraichissement : std_logic_vector(4 downto 0);
    	signal S_rafraichissement : std_logic;
      signal S_affichage : std_logic;
    	signal vecteur_affichage : std_logic_vector(10 downto 0);
    	signal compteur_etage : std_logic_vector(3 downto 0);
    
    	
    begin -- on veut que l'affichage soit rafraichit à 1kHz, on divise la clk de 50kHz par 64
          -- On veut que les étages s'affichent à 1Hz, donc on divise la clk de 50kHz par 32768
    	
    	Division : process(clk_divise, compteur_affichage, compteur_rafraichissement, S_rafraichissement, S_affichage) -- 1kHz pour le rafraichissement
    	begin
    		
    		if raz = '1' then
    		compteur_affichage <= "000000000000000";
    		compteur_rafraichissement <= "00000";
    		end if;
    		
    		if clk_divise'event and clk_divise = '1' then
    			compteur_affichage <= compteur_affichage + 1;
    			compteur_rafraichissement <= compteur_rafraichissement + 1;
    				
    			if compteur_affichage = "000000000000000" then    --Division par 32768
    				S_affichage <= '1';				                 				            		 
    			elsif compteur_affichage = "100000000000000" then
    				S_affichage <= '0';
    			end if;	
    			
    			if compteur_rafraichissement = "00000" then		-- Division par 64
    				S_rafraichissement  <= '1';
    			elsif compteur_rafraichissement = "10000" then
    				S_rafraichissement <= '0';
    			end if;
    			
    		end if;
    	end process;
    			
    	Affichage : process(S_affichage, vecteur_affichage, S_rafraichissement, compteur_etage, Sens)
    	begin
    	
    		if Sens = "00" then
    					if S_affichage'event and S_affichage = '1' then
    						compteur_etage <= compteur_etage;
    					end if;
    		else if Sens = "01" then
    					if S_affichage'event and S_affichage = '1' then
    						compteur_etage <= compteur_etage + 1;
    					end if;
    		else if Sens = "10" then
    					if S_affichage'event and S_affichage = '1' then
    						compteur_etage <= compteur_etage - 1;
    					end if;
    		end if;
    		
    		CASE compteur_etage IS			      --  abcdefg
    			when "0000" => vecteur_affichage <= "00000010001"; -- 0, AN4
    			when "0001" => vecteur_affichage <= "10011110001"; -- 1 et 0001 = afficheur AN4
    			when "0010" => vecteur_affichage <= "00100100001"; -- 2, AN4
    			when "0011" => vecteur_affichage <= "00001100001"; -- 3, AN4 
    			when "0100" => vecteur_affichage <= "10011000001"; -- 4, AN4 
    			when "0101" => vecteur_affichage <= "01001000001"; -- 5, AN4 
    			when "0110" => vecteur_affichage <= "01000000001"; -- 6, AN4
    			when "0111" => vecteur_affichage <= "00011110001"; -- 7, AN4
    			when "1000" => vecteur_affichage <= "00000000001"; -- 8, AN4
    			when "1001" => vecteur_affichage <= "00001000001"; -- 9, AN4
    			when "1010" => if S_rafraichissement = '1' then
    									       vecteur_affichage <= "10011110010"; -- 1, AN3
    								     elsif S_rafraichissement = '0' then
    									       vecteur_affichage <= "00000010001"; -- 0, AN4
    								     end if;
    			when "1011" => if S_rafraichissement = '1' then
    									       vecteur_affichage <= "10011110010"; -- 1, AN3
    								     elsif S_rafraichissement = '0' then
    									       vecteur_affichage <= "10011110001"; -- 1, AN4
    								     end if;
    			when "1100" => if S_rafraichissement = '1' then
    									       vecteur_affichage <= "10011110010"; -- 1, AN3
    								     elsif S_rafraichissement = '0' then
    									       vecteur_affichage <= "00100100001"; -- 2, AN4
    								     end if;
    			when "1101" => if S_rafraichissement = '1' then
    									       vecteur_affichage <= "10011110010"; -- 1, AN3
    								     elsif S_rafraichissement = '0' then
    									       vecteur_affichage <= "00001100001"; -- 3, AN4
    								     end if;
    			when "1110" => if S_rafraichissement = '1' then
    									       vecteur_affichage <= "10011110010"; -- 1, AN3
    								     elsif S_rafraichissement = '0' then
    									       vecteur_affichage <= "10011000001"; -- 4, AN4
    								     end if;
    			when "1111" => if S_rafraichissement = '1' then
    									       vecteur_affichage <= "10011110010"; -- 1, AN3
    								     elsif S_rafraichissement = '0' then
    									       vecteur_affichage <= "01001000001"; -- 5, AN4
    								     end if;
    			when OTHERS => NULL;
    		end case;
    	end process;
    	
    	Svecteur_affichage <= vecteur_affichage;
    	
    end Behavioral;
    Si vous avez la moindre idée d'où provient cette erreur, je veux bien que vous m'en fassiez part !

    Merci.

  2. #2
    Membre éprouvé

    Ingénieur développement matériel électronique
    Inscrit en
    juillet 2010
    Messages
    295
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2010
    Messages : 295
    Points : 499
    Points
    499

    Par défaut

    Salut,

    Voici une première trame, je n'ai pas touche au process affichage (trop long a corriger)

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    entity Affichage is
        port(   clk_divise, raz     : in std_logic;
                Sens                : in std_logic_vector(1 downto 0);
                Svecteur_affichage  : out std_logic_vector(10 downto 0)
            );
    end Affichage;
    
    architecture Behavioral of Affichage is
        signal compteur_affichage           : std_logic_vector(14 downto 0);
        signal compteur_rafraichissement    : std_logic_vector(4 downto 0);
        signal S_rafraichissement           : std_logic;
        signal S_affichage                  : std_logic;
        signal vecteur_affichage            : std_logic_vector(10 downto 0);
        signal compteur_etage               : std_logic_vector(3 downto 0);
    
    
        begin -- on veut que l'affichage soit rafraichit à 1kHz, on divise la clk de 50kHz par 64
          -- On veut que les étages s'affichent à 1Hz, donc on divise la clk de 50kHz par 32768
    
        Division : process(raz,clk_divise) -- 1kHz pour le rafraichissement
        begin
            
            if raz = '1' then
                compteur_affichage          <= (others => '0');
                compteur_rafraichissement   <= (others => '0');
            elsif clk_divise'event and clk_divise = '1' then
                compteur_affichage          <= compteur_affichage + 1;
                compteur_rafraichissement   <= compteur_rafraichissement + 1;
                    
                if (unsigned(compteur_affichage) = to_unsigned(0,compteur_affichage'length))then    --Division par 32768
                    S_affichage <= '1';
                elsif(compteur_affichage(compteur_affichage'high) = '1')then
                    S_affichage <= '0';
                end if;	
                
                if(unsigned(compteur_rafraichissement) = to_unsigned(0,compteur_rafraichissement'length))then   -- Division par 64
                    S_rafraichissement  <= '1';
                elsif(compteur_rafraichissement(compteur_rafraichissement'high) = '1' then
                    S_rafraichissement <= '0';
                end if;
            end if;
        end process Division;
    
        Svecteur_affichage <= vecteur_affichage;
    
    end architecture Behavioral;
    Les process a reset a synchrones s’écrivent comme ca:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        my_process : process(RST,CLK)
        begin
            if(RST = '1')then--ou '0'
                mon_registre    <= (others => '0');--ou tout autre valeur
            elsif(rising_edge(CLK))then
                if(mon_entree = un_truc)then
                    mon_registre    <= une_valeur;
                else
                    mon_registre    <= une_autre_valeur;
                end if;
            end if;
        end process my_process;
    C'est risqué de faire autrement

  3. #3
    Invité de passage
    Homme Profil pro Vincent
    Étudiant
    Inscrit en
    décembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Nom : Homme Vincent
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2012
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Merci pour la correction, mon programme est tout de suite plus propre.
    Par contre pour mon erreur de compilation, j'ai finalement trouvé la solution. Dans mon process affichage il me manquait 2 end if... Tout simplement

    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •