[Programmation] VHDL FSM pourquoi on utilise next et reg
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

VHDL FSM pourquoi on utilise next et reg



  1. #1
    ryan88

    VHDL FSM pourquoi on utilise next et reg


    ------

    Bonjour,

    Je viens d'apprendre les machines à états mais je ne comprend pas pourquoi chaque fois on utilise 2 variable _next et _reg à la palce d'une signal par exemple dans le code suivant on aurai pas pu remplacé n_reg et n_next par un une signal de 3 bit qui fais le compteur et de meme pour s.

    when data =>
    tx_next <= b_reg (0) ;
    if (s_tick = '1’) then
    if s_reg=15 then
    s_next <= (others=>’0’);
    b_next <= ‘0’ & b_reg(7 downto 1) ;
    if n_reg= (DBIT -1) then
    state_next <= stop ;
    else
    n_next <= n_reg + 1;
    end if ;
    else
    s_next <= s_reg + 1;
    end if;
    end if ;

    Merci !

    -----

  2. #2
    ryan88

    Post Re : VHDL FSM pourquoi on utilise next et reg

    je suis desolé j'avais fais l'indentation par des espace mais ce n'a pas marché :
    when data =>
    tx_next <= b_reg (0) ;
    if (s_tick = '1’) then
    if s_reg=15 then
    s_next <= (others=>’0’);
    b_next <= ‘0’ & b_reg(7 downto 1) ;
    if n_reg= (DBIT -1) then
    state_next <= stop ;
    else
    n_next <= n_reg + 1;
    end if ;
    else
    s_next <= s_reg + 1;
    end if;
    end if ;

  3. #3
    jiherve

    Re : VHDL FSM pourquoi on utilise next et reg

    Bonjour,
    Il faut utiliser les balises "code" : dièse en mode avancé.
    Pour le fond ce que tu présentes est la méthode scolaire, dans la vraie vie l'utilisation d'un unique std_logic_vector est moins verbeux et tout aussi efficace. Ceci dit le résultat sera le même mais il y a amha une différence qui sera que l’implémentation directe attirera sans doute plus l'attention sur l'introduction de signaux asynchrones dans la machine, 99% des causes de dysfonctionnement .
    Donc toujours se souvenir de : point de signaux asynchrones tu n'entrera dans une machine à états ou tout autre logique séquentielle!
    JR
    l'électronique c'est pas du vaudou!

  4. #4
    ryan88

    Re : VHDL FSM pourquoi on utilise next et reg

    merci pour votre réponse,
    Pour quoi ca c'est la cause de "99% des causes de dysfonctionnement" ?
    J'ai bien compris "point de signaux asynchrones tu n'entrera dans une machine à états ou tout autre logique séquentielle!"

    Donc dans ce code j'ai changé n_reg et n_next par n ca marche ?
    Code:
    when data =>
        tx_next <= b_reg (0) ;
        if (s_tick = '1’) then
            if s_reg=15 then
                s_next <= (others=>’0’);
                b_next <= ‘0’ & b_reg(7 downto 1) ;
                if n= (DBIT -1) then
                    state_next <= stop ;
                else
                    n<= n+ 1;
                end if ;
            else
                 s_next <= s_reg + 1;
            end if;
        end if ;

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

    Re : VHDL FSM pourquoi on utilise next et reg

    Bonsoir,
    Je n'en sais rien car il manque tout un bout de code dans le #1!
    Publie tout le code d'origine avec balises code et indentation SVP!
    JR
    l'électronique c'est pas du vaudou!

  7. #6
    albanxiii
    Modérateur

    Re : VHDL FSM pourquoi on utilise next et reg

    Bonjour,

    Citation Envoyé par ryan88 Voir le message
    Donc dans ce code j'ai changé n_reg et n_next par n ca marche ?
    C'est une question ?

    Quand on a des signaux qui s'appellent _next et _reg quelque part dans une machine d'état, on a aussi quelque part dans le code des choses comme :

    Code:
    process(reset, clk)
    begin
      if rising_edge(clk) then
        ...
        ...
        ...
        n_reg <= n_next;
      end if;
    end process;
    C'est à dire qu'on calcule la valeur future de n_reg à partir de l'état et des entrées courantes. Et au cycle suivant on fait ce qui est prévu en fonction de la nouvelle valeur de n_reg, puis on calcule la suivante, etc.

    En ddire plus relèverait de la divination, donc :
    Citation Envoyé par jiherve Voir le message
    Je n'en sais rien car il manque tout un bout de code dans le #1!
    Publie tout le code d'origine avec balises code et indentation SVP!
    Not only is it not right, it's not even wrong!

  8. #7
    ryan88

    Re : VHDL FSM pourquoi on utilise next et reg

    Bonjour,
    en effet c'etait une question @albanxiii
    Voici le code, j'ai juste changé la nomenclature à la place de n_next c'est next_bitcpt et de même pour le n_reg

    Code:
    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    Use ieee.numeric_std.all;
    Use ieee.std_logic_unsigned.all;
    
    entity rs232 is
        Port ( empty : out  STD_LOGIC;
               TX 		 : out STD_LOGIC;
    			  clk_div : in  STD_LOGIC;
               data    : in  STD_LOGIC_VECTOR (7 downto 0);
               start   : in  STD_LOGIC;
               rst 	 : in  STD_LOGIC;
               clk 	 : in  STD_LOGIC);
    end rs232;
    
    architecture Behavioral of rs232 is
    	type T_etat is (idle,bitstart,bitsdata,bitstop);
    	signal next_etat, reg_etat : T_etat;
    	signal next_TX, reg_TX : STD_LOGIC;
    	signal next_empty, reg_empty : STD_LOGIC;
    	signal next_bitcpt, reg_bitcpt : STD_LOGIC_VECTOR (2 downto 0);
    	signal txdatas_next, txdatas_reg : STD_LOGIC_VECTOR (7 downto 0);
    begin
    
    	etat_suivant: process(data,start,clk_div,reg_etat,reg_TX,reg_empty,reg_bitcpt,txdatas_reg)
    		begin
    			next_etat <= reg_etat;
    			next_TX <= reg_TX;
    			next_empty <= reg_empty;
    			next_bitcpt <= reg_bitcpt;
    			txdatas_next <= txdatas_reg;
    
    			case reg_etat is
    
    				when idle =>
    					next_TX <= '1';
    					next_empty <= '1';
    					txdatas_next <= data;
    					if start ='1' then
    						next_etat <= bitstart;
    					end if;
    					
    				when bitstart =>
    					next_TX <= '0';
    					next_empty <= '0';
    					if clk_div ='1'then
    						next_etat <= bitsdata;
    					end if;
    					
    				when bitsdata =>
    					next_empty <= '0';
    					next_TX <= txdatas_reg(0) ;
    					if clk_div ='1' then    
    						txdatas_next <= '0' &txdatas_reg(7 downto 1) ;
    						if reg_bitcpt = "111" then
    							next_etat <= bitstop ;
    							next_bitcpt <= "000";
    						else
    							next_bitcpt <= reg_bitcpt + 1 ;
    						end if ;
    					end if ;
    					
    				when bitstop =>
    					next_TX <= '1';
    					next_empty <= '0';
    					next_etat <= idle;
    			end case;
    	end process etat_suivant;
    	
    	registre_etat: process(clk)
    	 begin
    		if rising_edge(clk) then
    			if rst = '1' then
    				reg_etat <= idle;
    			else
    				reg_etat <= next_etat;
    				reg_empty <= next_empty;
    				reg_TX <= next_TX;
    				reg_bitcpt <= next_bitcpt;
    				txdatas_reg <=txdatas_next ;
    
    
    			end if;
    		end if;
    	end process registre_etat;
    		
    	TX <= reg_TX;
    	empty <= reg_empty;
    
    end Behavioral;
    Et je veux changé les signaux reg_bitcpt et next_bitcpt par bitcpt qui est un vector de 3 bit qui sert à enregistrer le nombre de bit restante à envoyer.
    Donc il n'y aura pas de :
    Code:
     reg_bitcpt <= next_bitcpt;
    dans le machine à état et dans l'état suivant à la place de :
    Code:
     next_bitcpt <= reg_bitcpt + 1 ;
    je veux mettre :
    Code:
    bitcpt <= bitcpt + 1
    Parceque d'après ce que je comprend on besoin de mettre à jour dans la machine à état que
    Code:
    reg_etat <= next_etat;[
    Merci beaucoup pour vos réponses je suis désolé pour le retard.

  9. #8
    jiherve

    Re : VHDL FSM pourquoi on utilise next et reg

    Bonsoir,
    a première vue le code d'origine est correct et tu ne peux pas faire la modif envisagée!
    Par contre c'est très verbeux et cela peut s’écrire avec un seul process séquentiel ce qui améliorerait la lisibilité, je te fais çà demain si j'y pense!
    JR
    l'électronique c'est pas du vaudou!

  10. #9
    ryan88

    Re : VHDL FSM pourquoi on utilise next et reg

    Je vous remercie mais serait il possible pour demain si vous avez le temps de me dire pourquoi cela ne marche pas.
    bonne soirée.

  11. #10
    jiherve

    Re : VHDL FSM pourquoi on utilise next et reg

    Bonjour,
    ton compteur de bit doit être physiquement composé de bascules donc il devra apparaitre dans le process synchrone mais comme par ailleurs son évolution dépend de la machine à états il faudra aussi le faire apparaitre dans le process asynchrone donc retour à la case départ.

    Voila le code compacté,j'espère n'avoir pas fait d'erreur:
    Code:
    llibrary IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    Use ieee.numeric_std.all;
    Use ieee.std_logic_unsigned.all;
    
    entity rs232 is
        Port ( EMPTY   : out  STD_LOGIC;   -- une bonne pratique est de mettre les i/O en majuscules (si certification au bout)
               TX      : out STD_LOGIC;
               CLK_DIV : in  STD_LOGIC;
               DATA    : in  STD_LOGIC_VECTOR (7 downto 0);
               START   : in  STD_LOGIC;
               RST     : in  STD_LOGIC;
               CLK     : in  STD_LOGIC);
    end rs232;
    
    architecture Behavioral of rs232 is
      type T_etat is (idle,bitstart,bitsdata,bitstop);
      signal reg_etat     : T_etat;
      signal reg_tx       : STD_LOGIC;
      signal reg_empty    : STD_LOGIC;
      signal reg_bitcpt   : STD_LOGIC_VECTOR (2 downto 0);
      signal txdatas_reg  : STD_LOGIC_VECTOR (7 downto 0);
    begin
    
      Transmiter: process(CLK,RST)
      begin
        if rising_edge(CLK) then
          if RST = '1' then  -- reset synchrone pourquoi ? ce n'est pas toujours judicieux
            reg_etat    <= idle; -- il faut TOUJOURS(sauf cas tres particulier que tu ne verra pas souvent)  initialiser TOUTES les bascules
            reg_tx      <= '0';
            reg_empty   <= '0';
            reg_bitcpt  <= (others => '0');
            txdatas_reg <= (others => '0');
          else
            case reg_etat is
              when idle =>
                reg_tx      <= '1';
                reg_empty   <= '1';
                txdatas_reg <= DATA;
                if START ='1' then
                  reg_etat  <= bitstart;
                end if;
                
              when bitstart =>
                reg_tx      <= '0';
                reg_empty   <= '0';
                if CLK_DIV ='1'then
                  reg_etat  <= bitsdata;
                end if;
                
              when bitsdata =>
                reg_tx          <= txdatas_reg(0) ;
                reg_empty       <= '0';
                if CLK_DIV ='1' then    
                  txdatas_reg   <= '0' & txdatas_reg(7 downto 1) ;
                  if reg_bitcpt = "111" then
                    reg_etat    <= bitstop ;
                    reg_bitcpt  <= "000";
                  else
                    reg_bitcpt  <= reg_bitcpt + 1 ;
                  end if ;
                end if ;
                
              when bitstop =>
                reg_tx    <= '1';
                reg_empty <= '0';
                reg_etat  <= idle;
              when others => -- il faut TOUJOURS un "when others"  car ton "CASE" n’énumère pas forcement tous les  as possibles
                assert (false) report "Unsupported state"severity failure ;-- au cas ou il y aurait un bug qq part cela remonte en simulation
            end case;
          end if;
        end if;
      end process Transmiter;
        
       
      TX <= reg_tx;
      EMPTY <= reg_empty;
    
    end Behavioral;
    Le "assert" peut etre remplacé par "null" qui ne fait rien comme son nom l'indique.Ne pas oublier que chaque bit VHDL possède 9 états et que si j'ecris avec toto Std_logic_vector(1 dowto 0):
    case toto is
    when "00" =>
    ....
    when "01" =>
    ....
    when "10" =>
    ....
    when "11" =>
    ....
    end case;
    je n'ai énuméré que 4 cas sur 81 !! l' ajout d'un 'when others' trappe les 77 restants
    JR
    l'électronique c'est pas du vaudou!

  12. #11
    ryan88

    Re : VHDL FSM pourquoi on utilise next et reg

    Merci beaucoup pour votre explication, j'ai bien compris votre code. toutefois permettez moi de revenir à ce point
    ton compteur de bit doit être physiquement composé de bascules
    pourquoi ? parceque je le vois comme un registre de 3 bits qui s'incrémente chaque fois qu'on entre dans le
    Code:
    when bitsdata =>
    et que le compteur est inférieur à "111" et le CLK_div est égal à 1.

    Encore une fois merci pour le temps que vous m'avez consacré.

  13. #12
    jiherve

    Re : VHDL FSM pourquoi on utilise next et reg

    Bonsoir
    Ok mais un registre usuel c'est composé de bascules!
    On peut tout faire en théorie avec des portes, donc des lacth pour assurer la mémorisation, mais c'est très casse gueule, réservé aux très grands dont je ne fais pas partie même si je suis loin d’être manchot en numérique. Ainsi il est possible de concevoir un processeur totalement asynchrone qui serait alors très rapide mais c'est tellement difficile que l'on préfère le concevoir en synchrone et augmenter la fréquence d'horloge des bascules qui y sont employées.
    Si tu comptes perseverer en VHDL :
    1: procures toi le memo DOULOS il est tres bien fait
    2 : ecris de façon lisible et esthetique cela aide beaucoup
    3: respecte un formalisme rigoureux car un jour ou l'autre il faudra certifier et là c'est couillu!
    JR
    Dernière modification par jiherve ; 02/10/2017 à 20h57.
    l'électronique c'est pas du vaudou!

  14. #13
    ryan88

    Re : VHDL FSM pourquoi on utilise next et reg

    J'ai bien compris maintenant. Merci beaucoup !

Discussions similaires

  1. Pourquoi utilise t on des anti inflammatoires
    Par Metazoen dans le forum Santé et médecine générale
    Réponses: 1
    Dernier message: 31/07/2014, 20h21
  2. Pourquoi le turbopropulseur est-il si peu utilisé
    Par _Goel_ dans le forum Discussions scientifiques
    Réponses: 5
    Dernier message: 11/09/2011, 13h34
  3. Pourquoi utilise t'on l'acétylène au lieux du propane!
    Par invite2e45de2c dans le forum Chimie
    Réponses: 1
    Dernier message: 21/04/2011, 20h40
  4. Pourquoi utilise-t-on des semi-conducteurs ?
    Par invitea821f6eb dans le forum Physique
    Réponses: 11
    Dernier message: 16/10/2009, 18h52
  5. pourquoi on utilise les ondelettes en sismologie?
    Par celeste1 dans le forum Géologie et Catastrophes naturelles
    Réponses: 2
    Dernier message: 22/12/2008, 17h44
Découvrez nos comparatifs produits sur l'informatique et les technologies.