[Programmation] [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 31

[VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur



  1. #1
    Dark.flow

    [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur


    ------

    Bonjour,

    Débutant en VHDL, j'ai voulu tenter de faire fonctionner un compteur à N bits que j'ai trouvé sur le site d'une université. Pour cela, j'ai utilisé le logiciel Active HDL mais malheureusement je n'ai pas réussi à obtenir le résultat.

    Le code que j'ai utilisé est le suivant :

    Code:
    ----------------------------------------------------
    -- VHDL code for n-bit counter (ESD figure 2.6)
    -- by Weijun Zhang, 04/2001
    --
    -- this is the behavior description of n-bit counter
    -- another way can be used is FSM model. 
    ----------------------------------------------------
    	
    library ieee ;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;
    
    ----------------------------------------------------
    
    entity counter is
    
    generic(n: natural :=2);
    port(	clock:	in std_logic;
    	clear:	in std_logic;
    	count:	in std_logic;
    	Q:	out std_logic_vector(n-1 downto 0)
    );
    end counter;
    
    ----------------------------------------------------
    
    architecture behv of counter is		 	  
    	
        signal Pre_Q: std_logic_vector(n-1 downto 0);
    
    begin
    
        -- behavior describe the counter
    
        process(clock, count, clear)
        begin
    	if clear = '1' then
     	    Pre_Q <= Pre_Q - Pre_Q;
    	elsif (clock='1' and clock'event) then
    	    if count = '1' then
    		Pre_Q <= Pre_Q + 1;
    	    end if;
    	end if;
        end process;	
    	
        -- concurrent assignment statement
        Q <= Pre_Q;
    
    end behv;
    
    -----------------------------------------------------
    Je devais donc obtenir le résultat suivant :

    http://esd.cs.ucr.edu/labs/tutorial/counter.jpg

    Pour faire mes simulations, j'ai utilisé une horloge de 20 Mhz, j'ai initialisé clear et count à 1 pour tester. Normalement, je devais avoir pour la sortie Q 0 tout le temps (car clear à 1) mais j'obtiens un "X"

    J'ai beau chercher l'erreur, je ne trouve pas d'où elle vient

    Voici le résultat que j'obtiens :

    Nom : fs0.jpg
Affichages : 195
Taille : 38,1 Ko


    Savez-vous d'où peut provenir mon erreur ?

    Je vous remercie d'avance pour votre précieuse aide

    -----
    Dernière modification par Antoane ; 24/11/2015 à 16h19. Motif: Rapatriement des PJ sur le serveur

  2. #2
    jiherve

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonsoir,
    en fait l'assignation
    Pre_Q <= Pre_Q - Pre_Q;
    ne peut être résolue car au démarrage Pre_Q n'a pas de valeur connue donc x-x => x!!
    il faut écrire Pre_Q <= (others => '0');
    et la bobinette cherrera.
    Si le code a été trouvé sur un site universitaire j'en frémis d'horreur!
    JR
    Dernière modification par jiherve ; 23/11/2015 à 19h13.
    l'électronique c'est pas du vaudou!

  3. #3
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Citation Envoyé par jiherve Voir le message
    Bonsoir,
    en fait l'assignation ne peut être résolue car au démarrage Pre_Q n'a pas de valeur connue donc x-x => x!!
    il faut écrire Pre_Q <= (others => '0');
    et la bobinette cherrera.
    Si le code a été trouvé sur un site universitaire j'en frémis d'horreur!
    JR
    Bonsoir,

    Un grand merci à vous Monsieur, ça fonctionne parfaitement !

    Sur ce, je retourne coder mon projet

  4. #4
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonsoir,

    J'ai avancé dans mon code mais je suis resté bloqué sur quelques petits problèmes d'implémentation que je vous expose ici si une âme charitable pouvait passer par là pour me dépanner ^^

    1) Je dois faire un test sur un signal que je vais appeler sQ mais c'est en hexadécimal donc je code de la façon suivante mais ça ne fonctionne pas :
    if sQ= x"9" then
    ...
    end if;
    J'ai essayé en créant un signal de 4 bits que j'ai nommé "hex" et de faire "if sQ=hex" mais ça ne fonctionne pas non plus...

    2) Je dois faire la somme des caractères hexadécimaux hors j'ai un vecteur binaire donc savez-vous comment accéder à chaque valeur hexa ? Je dois découper par 4 bits ?

    3) Je dois remplacer un vecteur de bits par une série de nombre du style "01000100...0100", j'ai pensé à utiliser (others => '0100') mais malheureusement ça ne fonctionne pas non plus. Avez-vous une idée sur comment faire une répétition ?

    Je vous remercie d'avance pour votre aide
    Dernière modification par Dark.flow ; 24/11/2015 à 19h23.

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

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonsoir,
    pour la comparaison deux solutions :
    if (to_integer(sQ)= xxxx) then
    if (sQ = std_logic_vector(to_unsigned(x xxx, taille de sQ))) then
    pour l'initialisation il faut faire une boucle
    for i in 0 to yy loop
    sQ(i*4+3 downto i*4) <= (others => '0100');
    end loop;
    JR
    l'électronique c'est pas du vaudou!

  7. #6
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Citation Envoyé par jiherve Voir le message
    Bonsoir,
    pour la comparaison deux solutions :
    if (to_integer(sQ)= xxxx) then
    if (sQ = std_logic_vector(to_unsigned(x xxx, taille de sQ))) then
    pour l'initialisation il faut faire une boucle
    for i in 0 to yy loop
    sQ(i*4+3 downto i*4) <= (others => '0100');
    end loop;
    JR
    Bonsoir,

    Merci pour votre réponse rapide !

    J'ai réfléchi à propos du dernier point que je dois implémenter (somme des caractères hexadécimaux), je pense que je dois trouver un équivalent en hexa comme en binaire pour accéder aux différents caractères (Q(0) = LSB position, Q(1) = ... )

    Avez-vous une idée sur comment faire ? Je pense peut être à stocker le résultat de 4 bits dans chaque case d'un tableau pour créer les caractères hexadécimaux mais je ne suis pas certain que ça soit la manière la plus simple :/

  8. #7
    jiherve

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonjour,
    je n'ai rien compris.
    Somme = addition ?
    Somme = concaténation?
    JR
    l'électronique c'est pas du vaudou!

  9. #8
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Citation Envoyé par jiherve Voir le message
    Bonjour,
    je n'ai rien compris.
    Somme = addition ?
    Somme = concaténation?
    JR
    Bonjour,

    Je pense que ça doit être une addition donc le problème est d'accéder à chaque caractère hexadécimal, ce que je n'arrive pas à faire.

  10. #9
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    J'ai trouvé !

    Pour accéder à chaque caractère hexadécimal, je peux peux lire par 4 bits. Par exemple pour la LSB position, ça sera les bits de 0 à 3.

    Dans mon dernier point, on me demande de registrer la valeur de sortie pour limiter le chemin critique.

    Est-ce quelqu'un sait ce que cela veut dire ? Je pense à l'utilisation de registres mais lesquels et pourquoi ?

    Merci d'avance pour votre aide

  11. #10
    jiherve

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonsoir,
    en effet cela consiste à ajouter une barrière de registres ce qui fait que les retards accumulés en amont (par rapport à l'horloge) se trouvent éliminés.
    Dans un FPGA pour aller vite il faut utiliser des registres des que le temps de propagation introduit par la logique combinatoire (il y en a toujours) devient proche de la période d'horloge.
    On doit toujours satisfaire au minimum Tco+Tprop+Tsetup < Tclk.
    Tco = propagation clock to Q de la bascule amont
    Tprop = temps de propagation dans la logique combinatoire et le routage interne,celui ci peut être prohibitif si il y a un mauvais placement dans la puce par suite d'un choix des pin d'I/O inapproprié
    Tsetup = setup time de la bascule aval.
    JR
    l'électronique c'est pas du vaudou!

  12. #11
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Citation Envoyé par jiherve Voir le message
    Bonsoir,
    en effet cela consiste à ajouter une barrière de registres ce qui fait que les retards accumulés en amont (par rapport à l'horloge) se trouvent éliminés.
    Dans un FPGA pour aller vite il faut utiliser des registres des que le temps de propagation introduit par la logique combinatoire (il y en a toujours) devient proche de la période d'horloge.
    On doit toujours satisfaire au minimum Tco+Tprop+Tsetup < Tclk.
    Tco = propagation clock to Q de la bascule amont
    Tprop = temps de propagation dans la logique combinatoire et le routage interne,celui ci peut être prohibitif si il y a un mauvais placement dans la puce par suite d'un choix des pin d'I/O inapproprié
    Tsetup = setup time de la bascule aval.
    JR
    Bonsoir,

    Merci, je comprends un peu mieux. Je dois donc utiliser un registre à décalage pour éliminer les retards accumulés mais je n'arrive pas encore à saisir comment ce dernier y parvient. Je veux dire de ce que j'ai compris le registre à décalage décalage juste les bits un à un mais je n'arrive pas à voir la subtilité qui me permettra de comprendre le principe d'élimination des retards avec ce dernier.

    Merci d'avance pour votre aide

  13. #12
    indri

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Salut,
    un truc à rajouter sur la première question posée..
    Hormis la remarque de jiherve sur la soustraction, tu mets aussi le signal clear tout le temps à 1...donc le compteur ne s'incrémente jamais!!!
    Là où va le vent...

  14. #13
    stefjm

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Citation Envoyé par jiherve Voir le message
    Bonsoir,
    en fait l'assignation ne peut être résolue car au démarrage Pre_Q n'a pas de valeur connue donc x-x => x!!
    il faut écrire Pre_Q <= (others => '0');
    et la bobinette cherrera.
    Si le code a été trouvé sur un site universitaire j'en frémis d'horreur!
    JR
    Bonjour,
    Je profite de l'expertise pour une question :
    Pourquoi x-x donne x et pas 0 comme le donne une logique trop élémentaire?
    Cordialement.
    Moi ignare et moi pas comprendre langage avec «hasard», «réalité» et «existe».

  15. #14
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Citation Envoyé par indri Voir le message
    Salut,
    un truc à rajouter sur la première question posée..
    Hormis la remarque de jiherve sur la soustraction, tu mets aussi le signal clear tout le temps à 1...donc le compteur ne s'incrémente jamais!!!
    Salut,

    Oui, je sais, c'était juste pour les tests au début mais j'ai changé ça depuis

  16. #15
    jiherve

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonjour
    Il ne s'agit pas de registre à décalage stricto sensu mais d'un groupe de bascules qui mémoriseront l’état de la logique sur un front d'horloge.
    Pourquoi x-x ne donne pas zéro et bien parce que c'est l'un des principes des simulateurs VHDL si un signal ou une variable n'est pas initialisée alors tout ce qui en dépend est réputé inconnu , c'est souvent différent du comportement réel ou n'existe que '0' et '1' mais cela attire l'attention du concepteur.
    les équations x "et" '0' donnent x en simulation mais évidement '0' en vrai, de même pour x "ou" '1'.
    Ne jamais perdre de vue qu'en VHDL un bit possède 9 valeurs possibles ce qui explique que dans un case même si toutes les combinaisons physiquement réalisables ont été énumérées il faudra un when others => pour régler les autre cas .
    type std_ulogic is ( 'U', -- Uninitialized
    'X', -- Forcing Unknown
    '0', -- Forcing 0
    '1', -- Forcing 1
    'Z', -- High Impedance
    'W', -- Weak Unknown
    'L', -- Weak 0
    'H', -- Weak 1
    '-' -- Don't care
    );
    JR
    l'électronique c'est pas du vaudou!

  17. #16
    stefjm

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    C'est donc la philosophie du simulateur VHDL de ne pas interpréter une expression comprenant x, même si le résultat n'est pas x.
    Pour une utilisation in-situ, le code qui te fais frémir d'horreur me paraissait élégant car indépendant du type de la donnée à affecter à 0 (et pour un débutant qui ne connait pas encore tout le langage, une solution pas trop pourrie).
    (Un truc du genre (0=0) ou (1=0) quand un langage n'a pas les mots clef true et false, par exemple)

    Je me range sans soucis à ton avis, vu que le simulateur est bien pratique, mais j'aime aussi comprendre ce que je risque si j'écris la fameuse différence nulle.
    Cordialement.
    Moi ignare et moi pas comprendre langage avec «hasard», «réalité» et «existe».

  18. #17
    jiherve

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Re
    il y a eu, au moins chez Modelsim, une évolution sur le traitement du X à l'entrée D d'une bascule avec enable, les premières versions propageaient le X indépendamment de l'enable ce qui rendait toute simulation réaliste d'une mémoire externe impossible(les sorties de celle ci sont en effet inconnues tant que le temps d’accès n'est pas révolu) et c'est grâce à notre équipe de conception FPGA (siècle dernier) et sans doute d'autres que l’évolution à été réalisée.
    JR
    l'électronique c'est pas du vaudou!

  19. #18
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonsoir,

    Merci pour vos contributions !

    J'ai encore trouvé une anomalie, en voulant faire la somme des caractères hexadécimaux (donc par 4 bits), une fois que je dépasse x"7", le résultat devient négatif

    Pourtant, j'ai bien utilisé un signal "unsigned", j'ai implémenté ainsi :

    sum <= unsigned(sQ(7 downto 4)) + unsigned(sQ(3 downto 0));
    sQ est un signal std_vector de 8 bits.

    Quand il arrive à l'opération "0000" + "1000", il donne comme résultat x"-8". Je ne comprends vraiment pas pourquoi. Ce n'est pas ainsi qu'on fait la somme de deux vecteurs std_vector ?

  20. #19
    jiherve

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonsoir
    écris donc :
    sum <= unsigned("0000" & sQ(7 downto 4)) + unsigned("0000" & sQ(3 downto 0));
    JR
    l'électronique c'est pas du vaudou!

  21. #20
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Un grand merci pour votre aide très rapide !

  22. #21
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonjour,

    Je dois faire une division et une multiplication d'un std_vector 8 bits. Donc ce que j'ai pensé à faire pour m'épargner l'implémentation d'un composant "multiplier" et "division". C'est de tenter de passer par un integer. Mais en faisant des tests, je me rends compte que ça ne fonctionne pas !

    J'ai implémenté de la facon suivante :

    resultat = conv_integer(Q)/4*3.

    Est-ce que c'est pas bon comme manière d'implémenter ?

  23. #22
    stefjm

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    L'implémentation de la multiplication/division sera faite implicitement de toute façon.

    Vous allez avoir des soucis de troncature du genre 4/3=1 ou 1/2=0.

    Il y en aura moins en écrivant :

    resultat = (conv_integer(Q)*3)/4.
    Moi ignare et moi pas comprendre langage avec «hasard», «réalité» et «existe».

  24. #23
    jiherve

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonsoir,
    Le typage de la variable/signal n'y fera rien il y aura inférence d'une fonction de calcul mais ce que stefjm propose est une bonne piste on peut faire plus bas niveau en ecrivant:
    resultat = (conv_integer(Q)<<1 + conv_integer(Q))>>2.
    là il ne devrait y avoir que des fils et un additionneur.
    JR
    l'électronique c'est pas du vaudou!

  25. #24
    jiherve

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonsoir,
    la solution de stefjm est une bonne piste
    avec signal résultat,Q : std_logic_vector(7 downto 0) et variable v_resultat :unsigned(8 downto 0) il faut écrire :
    v_resultat :=unsigned (Q & '0) + unsigned(Q);
    résultat <= std_logic_vector (v_resultat(8 downto 1) + v_resultat(0)); il y a ici un arrondi
    Il y a des fois ou c'est bizarre ici,le message précédent ne devrait plus exister!
    JR
    Dernière modification par jiherve ; 27/11/2015 à 20h35.
    l'électronique c'est pas du vaudou!

  26. #25
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonsoir,

    Oui, je sais qu'il y aura une erreur de troncature. Je n'ai pas très bien saisi vos explications jiherve pour la multiplication par 3/4.

    Au fait,j'ai aussi un autre problème, je ne sais pas pourquoi mais je n'arrive pas à utiliser la fonction "conv_integer" ou "to_integer" quand c'est un signal std_vector. J'utilise pourtant les librairies std_logic_1164, std_logic_unsigned et numeric_std.all. J'obtiens l'erreur suivante : "Assignment target incompatible with right side. Cannot convert 'INTEGER' to 'STD_LOGIC_VECTOR'."

    Par contre, cela fonctionne avec une variable, c'est étrange.
    Dernière modification par Dark.flow ; 27/11/2015 à 21h34.

  27. #26
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Je viens d'avoir une idée, en fait, je pense que je me compliquais la tâche bêtement, je peux multiplier par 3 avec un signal temporaire de 10 bits et puis décaler de deux bits pour la division par 4 avec la fonction srl.

    par exemple tmp

    tmp <= std_logic_vector(unsigned(Q) * unsigned("11"));
    tmp <= tmp srl 2;
    result <= tmp(7 downto 0);

    Je pense que c'est une bonne manière de s'y prendre. Vous pensez quoi de cette manière d'implémenter ?

  28. #27
    jiherve

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonjour
    pour convertir en entier un std_logic_vector(toto) il faut écrire titi( integer) <= to_integer(unsigned/signed)(toto));
    l’implémentation proposée est non fonctionnelle car l'assignation d'un signal ne se fait qu'une fois et une seule par appel d'un process donc au mieux il faudrait que tmp soit une variable et l’écriture sera:
    tmp := std_logic_vector(unsigned(Q) * unsigned("11"));
    tmp := tmp srl 2;
    result <= tmp(7 downto 0);
    JR
    l'électronique c'est pas du vaudou!

  29. #28
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Bonjour,

    Merci pour vos explications, ça fonctionne bien maintenant

  30. #29
    stefjm

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Citation Envoyé par Dark.flow Voir le message
    Oui, je sais qu'il y aura une erreur de troncature. Je n'ai pas très bien saisi vos explications jiherve pour la multiplication par 3/4.
    En bas niveau, sans multiplication, j'écrirais 3/4=1-1/4
    Moi ignare et moi pas comprendre langage avec «hasard», «réalité» et «existe».

  31. #30
    Dark.flow

    Re : [VHDL - Active HDL] Débutant qui tente de faire fonctionner un compteur

    Citation Envoyé par stefjm Voir le message
    En bas niveau, sans multiplication, j'écrirais 3/4=1-1/4
    Merci !

    J'aurais une dernière question, est-ce quelqu'un sait comment générer un fichier testbench ? Je suis sous Active HDL mais je ne peux accéder au générateur de testbench

    Nom : Sans titre.png
Affichages : 210
Taille : 12,7 Ko

    Je ne comprends vraiment pas pourquoi. Je précise que j'utilise la version 9.3 (student edition)

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. description vhdl et compteur
    Par mathy11 dans le forum Électronique
    Réponses: 10
    Dernier message: 14/06/2012, 19h14
  2. compteur/decomteur en VHDL
    Par cherwam07 dans le forum Électronique
    Réponses: 20
    Dernier message: 28/01/2009, 09h24
  3. debutant perdu en VHDL
    Par invitebeff1d9a dans le forum Électronique
    Réponses: 11
    Dernier message: 14/04/2008, 14h08
  4. [VHDL] Compteur Modulo N
    Par invitef9e6be50 dans le forum Électronique
    Réponses: 3
    Dernier message: 26/01/2007, 20h53
  5. compteur vhdl
    Par inviteacb3e291 dans le forum Électronique
    Réponses: 1
    Dernier message: 15/11/2006, 11h31
Découvrez nos comparatifs produits sur l'informatique et les technologies.