[VHDL] problème de simulation avec Quartus II

problème de simulation avec Quartus II [VHDL] - Divers - Programmation

Marsh Posté le 22-04-2005 à 15:50:35    

bonjour, je suis en train d'essayer d'implémenter un EPLD (MAX7512AEFI256-10) en VHDL.
J'ai donc défini une machine à états et j'ai voulu simuler (pour commencer) les transistions entre ces états. Pour le moment, rien de bien compliqué sauf que... la simulation est mauvaise et je ne comprend pas pourquoi! Je vous met donc le code ainsi que le résultat de la simul, si quelqu'un pouvait me venir en aide, ca serait bien sympa car là, je ne vois vraiment pas.
J'utilise quartus II version 4.0 comme éditeur et simulateur.
 
--**********************************
       voici le code utilisé
--**********************************
 
library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_ARITH.all;
use IEEE.STD_LOGIC_UNSIGNED.all;
 
entity module is
 port(
   CLK  : in std_logic;
   DISCO : in std_logic;
   L_R  : in std_logic;
   RESET : in std_logic;
   ETAPE : out std_logic_vector (2 downto 0)
  );
end module;
 
architecture module_arch of module is
 type state_type is (s0, s1, s2, s3, s4);  
 signal etat  : state_type ;
 signal disco_l : std_logic;
 signal l_r_l : std_logic;
 signal reset_l : std_logic;
 signal etape_l : std_logic_vector (2 downto 0);
 signal test  : std_logic_vector (2 downto 0);
 
begin
--*********************************************************
latch_recopie : process (CLK)
begin
 if rising_edge (CLK) then
 -- latch
  l_r_l  <= L_R;
  reset_l  <= RESET;
  disco_l  <= DISCO;
 -- recopie
  ETAPE  <= etape_l;
 end if;
end process;
--*********************************************************
cycle: process (CLK, RESET, DISCO)
begin
 if DISCO = '1'
  then etat <= s2;
 elsif RESET = '0'
  then etat <= s0;
 elsif rising_edge (CLK) then
  case etat is
  when s0 => if test = "001"
       then etat <= s1;
       end if;
  when s1 => if l_r_l = '0'
       then etat <= s4;
       end if;
  when s2 => if test = "011"
       then etat <= s3;
       end if;
  when s3 => if test = "000"
       then etat <= s0;
       end if;
  when s4 => if test = "001"
       then etat <= s1;
       end if;
  end case;
 end if;
end process;
--*********************************************************
sorties : process (etat)
begin
 case etat is
  when s0 =>    -- RESET
   etape_l <= "000";
   test <= "001";
  when s1 =>
   etape_l <= "001";
  when s2 =>
   etape_l <= "010";
   test <= "011";
  when s3 =>
   etape_l <= "011";
  when s4 =>
   etape_l <= "100";
   test <= "001";
 end case;
end process;
end module_arch;
 
et le resultat de la simul se trouve ici
 
Quelques explications..
_ RESET est le reset (normal) actif à l'etat bas
 
_ DISCO est un signal informant sur la deconnexion du systeme à un autre systeme (je ne vais pas entrer dans els details... juste a savoir que DISCO est prioritaire par rapport au RESET) actif à l'etat haut
 
_ S0 est l'etat de reset (quand RESET passe à 0)
_ S1 est l'etat de marche normale
_ S2 est l'etat de deconnexion (quand DISCO passe à 1)
_ S3 est l'etat qui suit S2 (attente d'un reset pour redemarrer le cycle)
_ S4 est un etat dans lequel on rentre à partir de S1 grace au passage à 0 de la variable L_R.
 
_ test est un signal interne créé pour la simul qui sert à passer d'un etat a un autre.
_ etape_l est un signal interne qui joue le role de mouchard et permet de savoir dans quel etat on se trouve.
 
Les entrées sont latchées mais je ne me sers pas du RESET et DISCO latchés.
 
::: LE PROBLEME :::
Regardez l'image, à un moment, il y a un RESET et un DISCO pendant le RESET. A l'arrivée du RESET, ETAPE passe à "000", normal... Comme DISCO est prioritaire par rapport à RESET, quand il survient, le reset est squeezé et on passe en ETAPE "010" relative à l'etat S2 qui gère la deconnexion. normal.... Quand DISCO disparait, RESET est toujours à 0 donc on repasse en ETAPE "000" (etape de reset). normal...
MAIS, quand RESET repasse à '1', ETAPE ne change pas, le systeme reste en S0, POURQUOI ??? QU'y a t'il de faux dans le code?
 
j'espere que j'ai été assez clair dans mes explications, merci de bien vouloir m'eclairer!
 
christophe.

Reply

Marsh Posté le 22-04-2005 à 15:50:35   

Reply

Marsh Posté le 25-04-2005 à 09:27:09    

aïe aïe aïe... j'ai bien peur que le VHDL n'interesse personne...

Reply

Marsh Posté le 25-04-2005 à 12:49:44    

Citation :

aïe aïe aïe... j'ai bien peur que le VHDL n'interesse personne...


Si moi, mais malheureusement je débute donc je ne peux pas vraiment t'aider.
Par contre, je compte faire un forum sur les circuits logiques programmables d'Altera à cette adresse : http://jelectronique.free.fr/forums/
Si ça t'intéresses d'y participer ...
 
Désolé de ne pas pouvoir t'aider :(
 
a+
JP

Reply

Marsh Posté le 06-05-2005 à 00:25:32    

c'est normal,
je t'explique le stuut :
 
ton process
 
sorties : process (etat)  
begin  
 case etat is  
  when s0 =>    -- RESET  
   etape_l <= "000";  
   test <= "001";  
 
Ne sera utilisé que si l'ETAT change.
Avant de relâcher le reset,
l'état était déjà à S0.
 
Quand tu relâches le reset (il se met à 1),
l'état ne changera vers S1 que si
test = "001" .
Mais la simulation n'ira pas dans le process
sorties : process (etat)  
car etat n'a pas changé.
 
Enfin, en regardant bien test devrait bien être à = "001"
sans devoir rentrer dans le process sorties : process (etat)  
, donc je ne vois pas trop pourquoi cela ne fonctionne pas

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed