IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VHDL Discussion :

FIFO circulaire en VHDL


Sujet :

VHDL

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur/Chercheur
    Inscrit en
    Novembre 2007
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur/Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 122
    Points : 46
    Points
    46
    Par défaut FIFO circulaire en VHDL
    Bonjour,
    j'aimerais créer une FIFO circulaire pour réutiliser la mémoire libre. Mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    library	ieee;
    use		ieee.std_logic_1164.all;
    use		ieee.numeric_std.all;
     
    entity ring_fifo is
    	generic(
    		fifo_length	: integer:=8;
    		data_width	: integer:=4);
     
    	port(
    		clk			: in std_logic;
    		rst			: in std_logic;
    		ren			: in std_logic;
    		wen			: in std_logic;
    		dataout		: out std_logic_vector(data_width-1 downto 0);
    		datain		: in  std_logic_vector(data_width-1 downto 0);
    		empty		: out std_logic;
    		err			: out std_logic;
    		full		: out std_logic);
    	end ring_fifo;
     
    architecture arc of ring_fifo is
     
    	type memory_type is array (0 to fifo_length-1) of std_logic_vector(data_width-1 downto 0);
     
    	signal memory	: memory_type := (others => (others => '0'));
    	signal readptr,writeptr	: integer range 0 to fifo_length-1 := 1;
    	signal rcycle,wcycle : std_logic := '0';
    	signal full0	: std_logic := '0';
    	signal empty0	: std_logic := '1';
     
    begin
    	full <= full0;
    	empty <= empty0;
     
    	fifo0: process(clk,rst)
    	begin
    		if rst='1' then
    			readptr <= 0;
    			writeptr <= 0;
    			rcycle <= '0';
    			wcycle <= '0';
    			full0 <= '0';
    			empty0 <= '1';
    			err <= '0';
    		elsif rising_edge(clk) then
    			if (wen='1' and full0='0') then 
    				memory(writeptr) <= datain ;
    				if (writeptr=fifo_length-1) then
    					wcycle <= not wcycle;
    					writeptr <= 0;
    				else
    					writeptr <= writeptr+1;
    				end if;
    			end if;
     
    			if (ren='1' and empty0='0') then 
    				dataout <= memory(readptr);
    				if (readptr=fifo_length-1) then
    					rcycle <= not rcycle;
    					readptr <= 0;
    				else
    					readptr <= readptr+1;
    				end if;
    			end if ;
     
    				if ((writeptr + 1 = readptr)) or ((writeptr=fifo_length-1) and (readptr=0)) then
    					full0 <= '1';
    				else
    					full0 <= '0';
    				end if;
     
    				if (readptr = writeptr) then
    					empty0 <= '1';
    				else
    					empty0 <= '0';
    				end if;
     
    				if (empty0='1' and ren='1') or (full0='1' and wen='1') then
    					err <= '1';
    				else
    					err <= '0';
    				end if;
    		end if; 
    	end process;
    end arc;
    mais ça foire, les signaux full et err ne sont à 1 que pendant un cycle (quand j'essaie juste de la remplir sans la vider) et err arrive un cycle trop tard. Et si je mets les lignes 67 à 83 hors du process, j'ai d'autres problèmes.
    Vous savez ce que je dois faire ?
    Merci.

    --------------------------------------

    J'ai corrigé plein de trucs. Je reviens içi si besoin...

  2. #2
    Nouveau membre du Club
    Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Avril 2008
    Messages : 28
    Points : 32
    Points
    32
    Par défaut ip
    Salut,

    J'ai déjà codé une fifo, et aussi, j'etais arrivé au même constat du coup de retard sur le full et le empty, il me semble...

    Tu pourrais peut être passer par une IP, ou une primitive, Xilinx ou Altera en font

  3. #3
    Futur Membre du Club
    Homme Profil pro
    rêveur
    Inscrit en
    Mars 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : rêveur

    Informations forums :
    Inscription : Mars 2015
    Messages : 6
    Points : 7
    Points
    7
    Par défaut
    Tu n’as pas l’air d’avoir bien compris que toutes les instructions d’un process synchrone sont exécuté en même temps (c’est à dire pendant la même période d’horloge). Donc le passage du flag `full0` à 1 n’empêchera pas l’incrémentation `writeptr` dans le même cycle d’horloge, seulement au suivant (et alors la condition de remplissage ne sera plus vérifié et `full0` repassera à 0).

    Pour s’en sortir, if suffit de prendre un coup d’horloge d’avance dans tes conditions. Une autre solution est d’utiliser des variables, mais on préfère généralement éviter car cela revient à introduire de la combinatoire dans le process et donc baisser les performances.




    Tu pourrais peut être passer par une IP, ou une primitive, Xilinx ou Altera en font
    C’est du bidouillage ça, il y a ici une incompréhension du design synchrone et il est important d’y remédier.

Discussions similaires

  1. problème de fifo bloquant sous linux
    Par Fonzy007 dans le forum POSIX
    Réponses: 6
    Dernier message: 20/05/2009, 09h44
  2. FIFO circulaire en C
    Par rachy dans le forum C
    Réponses: 28
    Dernier message: 31/03/2007, 11h55
  3. Réponses: 1
    Dernier message: 17/11/2004, 17h44
  4. garder un FIFO ouvert en lecture
    Par OuiOui dans le forum Réseau
    Réponses: 4
    Dernier message: 05/01/2003, 19h24
  5. Recherche code d'un fifo,ou explication
    Par don-diego dans le forum C
    Réponses: 8
    Dernier message: 25/07/2002, 10h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo