[Programmation] code machine à états vhdl
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

code machine à états vhdl



  1. #1
    Leond95

    code machine à états vhdl


    ------

    Bonjour,

    j'essaye d'implementer une machine à états en VHDL : voici ça description ainsi qu'un diagramme en pièce jointe:

    --raz_n: rest actif à 0 => initialise le circuit
    --continu : si=0 mode monocoup, si=1 mode continu
    -- en mode continu la donnée est rafraîchie toute les secondes
    --start_stop: en monocoup si=1 démarre une acquisition, si =0
    -- remet à 0 le signal data_valid
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    use ieee.std_logic_arith.all;
    use ieee.numeric_std.all;
    entity state_machine is
          port(
               continu, start_stop, raz_n: in std_logic;
               data_valid : out std_logic;
               nbr_front : in std_logic_vector(7 downto 0);
               Data_anemometre : out std_logic_vector(7 downto 0)         
               );
    end state_machine;
    architecture arch of state_machine is
        TYPE State_type IS (init, cont, mono,acq);
        SIGNAL State : State_Type;
        signal temp1: std_logic;
        signal temp2 : std_logic_vector(7 downto 0);
        begin
            process(raz_n, continu, start_stop)
            begin
                if (raz_n='0') then
                    temp1 <='0';
                    temp2 <=(others=> '0');
                    state <=init;
                else
                    case state is
                        when init =>
                            if (continu='1') then
                                state <= cont;
                            else
                                state <= mono;
                            end if;
                        when cont =>
                            if (continu='0') then
                                state <= mono;
                            end if;
                            temp1 <= '1';
                            temp2 <= nbr_front;
                        when mono =>
                            if (continu='1') then
                                state <= cont;
                            elsif(start_stop= '1')then
                               state <= acq;
                            end if;
                                temp2 <=(others=> '0');
                                temp1 <= '0';
                          
                          when acq =>
                            if (start_stop= '0')then
                               state <= mono;
                            end if;
                            temp1 <= '1'; 
                            temp2 <= nbr_front;
                       -- when others =>
                        --    state <= init;
                    end case;
                end if;
            end process;
        Data_anemometre <= temp2;
        data_valid <= temp1;
    end arch;
    ce qui ce passe quand je met le code sur la carte est:
    la donnée ne se rafraishit pas toute les secondes
    en passant de mode continu vers monocoup, l'appuye sur le boutton start_stop ne fait rien, il faut chaque fois changer l'état de l'interrupteur raz_n.

    qu'est ce que je peux modifier pour que mon code fonctionne.

    merci

    -----
    Images attachées Images attachées  

  2. #2
    jiherve

    Re : code machine à états vhdl

    Bonjour,
    Ce qui me surprend c'est que cette machine à état est asynchrone, il n'y a aucune horloge!
    et le "when others" n'est pas facultatif!
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    Leond95

    Re : code machine à états vhdl

    Bonjour jiherve,

    je suis débutant en VHDL, où dois-je ajouter l'horloge pour synchroniser mon mae.

    merci

  4. #4
    jiherve

    Re : code machine à états vhdl

    bonsoir,
    voila où:
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    use ieee.std_logic_arith.all;
    use ieee.numeric_std.all;
    entity state_machine is
          port(
               continu, start_stop, raz_n: in std_logic;
               data_valid : out std_logic;
               nbr_front : in std_logic_vector(7 downto 0);
               Data_anemometre : out std_logic_vector(7 downto 0)         
               );
    end state_machine;
    architecture arch of state_machine is
        TYPE State_type IS (init, cont, mono,acq);
        SIGNAL State : State_Type;
        signal temp1: std_logic;
        signal temp2 : std_logic_vector(7 downto 0);
        begin
            process(raz_n, clk)
            begin
                if (raz_n='0') then
                    temp1 <='0';
                    temp2 <=(others=> '0');
                    state <=init;
                elsif rising_edge(clk)then
                    case state is
                        when init =>
                            if (continu='1') then
                                state <= cont;
                            else
                                state <= mono;
                            end if;
                        when cont =>
                            if (continu='0') then
                                state <= mono;
                            end if;
                            temp1 <= '1';
                            temp2 <= nbr_front;
                        when mono =>
                            if (continu='1') then
                                state <= cont;
                            elsif(start_stop= '1')then
                               state <= acq;
                            end if;
                                temp2 <=(others=> '0');
                                temp1 <= '0';
                          
                        when acq =>
                            if (start_stop= '0')then
                               state <= mono;
                            end if;
                            temp1 <= '1'; 
                            temp2 <= nbr_front;
                       -- when others =>
                        --    state <= init;
                    end case;
                end if;
            end process;
        Data_anemometre <= temp2;
        data_valid <= temp1;
    end arch;
    Mais si les entrées sont asynchrones il faudra les resynchroniser au moyen d'une bascule par signal externe.
    utilises tu un simulateur , si non va voir là :https://fpgasoftware.intel.com/15.1/...lsim_ae#tabs-2
    JR
    l'électronique c'est pas du vaudou!

  5. A voir en vidéo sur Futura
  6. #5
    Leond95

    Re : code machine à états vhdl

    Bonsoir,

    Tout d'abord merci d'avoir corrigé mon code, je n'ai pas de simulateur j'implément le code directement sur la carte, est ce que mon code marchera comme décrit dans la description?

    merci

  7. #6
    jiherve

    Re : code machine à états vhdl

    RE
    il faut absolument disposer d'un simulateur sinon le code sera une boite noire et tu perdras beaucoup de temps à le debugger.
    Le lien donné donne accès à des versions gratuites , illimitées en complexité mais limitées en vitesse de simulation.
    Bien sur il te faudra apprendre à écrire des test bench ce qui est tout de même facile.
    JR
    l'électronique c'est pas du vaudou!

  8. #7
    Leond95

    Re : code machine à états vhdl

    Bonsoir jiherve,

    j'ai ajouter un process diviseur de fréquence (50 Mhz vers 1 hz) pour rafraichir l'acquisition de donnée toute les secondes mais ça ne fonctionne pas, quand j'appuye sur le bouton start_stop ça éteit tous les led, est ce que t'as une idée pour régler ce problème.

    merci

  9. #8
    jiherve

    Re : code machine à états vhdl

    bonsoir,
    quelles leds?
    JR
    l'électronique c'est pas du vaudou!

  10. #9
    Leond95

    Re : code machine à états vhdl

    bonsoir,

    data_valid et data_anemometre, ça se passe comme si j'ai appuyé sur reset

  11. #10
    Leond95

    Re : code machine à états vhdl

    bonjour jiherve,

    Je voudrai te remercier pour ton aide la machine à états a bien fonctionnée, le prof l'a validé

  12. #11
    jiherve

    Re : code machine à états vhdl

    Bonjour
    merci pour le retour car ce n'est malheureusement pas trop l'habitude ici .
    JR
    l'électronique c'est pas du vaudou!

Discussions similaires

  1. [Programmation] Code VHDL
    Par invite4b345cee dans le forum Électronique
    Réponses: 7
    Dernier message: 15/12/2015, 11h08
  2. code vhdl de l'ALU
    Par invite6ebbaf13 dans le forum Électronique
    Réponses: 2
    Dernier message: 31/10/2012, 12h27
  3. code vhdl
    Par deyni dans le forum Électronique
    Réponses: 6
    Dernier message: 17/02/2012, 14h53
  4. machine d'états VHDL
    Par invitefb0f71f3 dans le forum Électronique
    Réponses: 13
    Dernier message: 13/01/2009, 21h38
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...