problème de simulation avec Quartus II [VHDL] - Divers - Programmation
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...
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
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
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.