[Programmation] Description d'un compteur à N chiffres eb vhdl
Répondre à la discussion
Affichage des résultats 1 à 15 sur 15

Description d'un compteur à N chiffres eb vhdl



  1. #1
    inviteed5e4bec

    Description d'un compteur à N chiffres eb vhdl


    ------

    Bonjour à tous,
    Alors voilà ça fait quelque jours que je bloque sur un exercice en vhdl. En réalité j'essaie de me remettre à niveau pour la rentrée prochaine, alors votre aide serait la bienvenue
    Comme je ne trouve pas de forum spécialisé en vhdl je le poste ici. Bref, voici l'intitulé:

    L'objectif est de créer un compteur de N chiffres. A l'initialisation le compteur vaut 0...0. Quand l'entrée incr=1, il compte en BCD (chaque chiffre est codé sur 4 bits). Quand incr =0, le compteur garde sa valeur. Sinon, le chiffre des unités bcd(3:0) s'incrémente jusqu'à 9. Quand il vaut 9 (et que incr=1), il repasse à 0 et c'est le chiffre des dizaines qui s'incrémente. Quand les chiffres des dizaines et des unités sont à 99 (et que incr=1), c'est le chiffre des centaines qui s'incrémente ...

    paramètre générique :
    N : nombre de chiffres

    entrées : clk, resetn, et incr (1 bit)
    sorties : bcd (4*N bits) et time_out (1 bit)

    Sur le schéma figure la structure du compteur pour le chiffre n°i
    en(0) = incr
    time_out = en(N)

    Simulation avec n =3
    Synthèse avec n =8
    Le schémas est en PJ.
    Alors j'ai tout programmé comme on le voit sur le schémas mais il y a forcément quelque chose qui m'échappe encore dans l'énoncé.
    Voici mon code:
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    
    entity compteur is
    	generic (
    		N	: integer := 8
    		);
    		port(
    			clk		: in std_logic;
    			resetn	: in std_logic;
    			incr 	: in std_logic;
    			bcd		: out std_logic_vector(4*N-1 downto 0);
    			time_out: out std_logic
    		);
    end entity;
    
    architecture rtl of compteur is
    	signal en 		: std_logic_vector(N downto 0);
    	signal signal1 	: std_logic_vector (3 downto 0);
    	signal signal2 	: std_logic_vector (3 downto 0);
    	signal s 		: std_logic;
    	signal i		: natural range 0 to N;
    	signal bcd1		: std_logic_vector (4*i+3 downto 4*i);
    	
    	
    begin	
    	en(0) <= incr;
    	en(i+1) <= en(i) AND S;
    	time_out <= en(N);
    	
    	process (clk, resetn) is
    	begin
    		if resetn ='0' then
    			bcd1 <= "0000";
    		elsif rising_edge(clk) then
    			bcd1 <= signal2;
    		end if;
    	end process;
    	
    	process (signal2, bcd1, en, signal1) is
    	begin
    		if en(i) = '0' then	
    			signal2 <= bcd1;
    		else
    			signal2 <= signal1;
    		end if;
    	end process;
    	
    	S <= '1' when unsigned(bcd1) = 9
    			else '0';
    			
    	process(S, bcd1, signal1) is
    	begin
    		if S = '1' then
    			signal1 <= "0000";
    		else
    			signal1 <= std_logic_vector(unsigned(bcd1)+1);
    			end if;
    		end process;
    	
    end architecture;
    Au moment de simuler, il ne se passe rien au niveaux des signaux.
    Je vous remercie d'avance pour votre aide.

    -----
    Images attachées Images attachées  
    Dernière modification par Antoane ; 12/07/2019 à 09h30. Motif: remplacement des balises quote par code

  2. #2
    jiherve

    Re : Description d'un compteur à N chiffres eb vhdl

    bonsoir
    il y a des déclarations incohérentes :
    signal en : std_logic_vector(N downto 0); donc N+1 std_logic
    signal bcd1 : std_logic_vector (4*i+3 downto 4*i); qu'est ce censé faire ?

    ensuite il doit manquer une boucle pour instancier les 4 compteurs.
    c'est mal indenté et j'ai la flemme de le faire.
    Cela compile t il ?
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    inviteed5e4bec

    Re : Description d'un compteur à N chiffres eb vhdl

    Bonsoir, merci pour votre réponse.
    L'indentation s'est enlevé tout seul sur le forum.

    Sinon pour répondre,

    le signal en (de N+1 bits) est un signal interne.
    Le chiffre des unités correspond à bcd(3:0) en(0) = incr et génère en(1)
    Le chiffre des dizaines correspond à bcd(7:4) il récupère en(1) généré par les unités et crée en(2)

    Et pour le signal bcd1, un chiffre étant sur 4 bits, quand on travaille sur le chiffre n°i (le n°0 étant le chiffre des unités) ce correspond aux bits 4*i+3 à 4*i

    Mon programme compile bien mais en simulant, je n'obtient pas ce que je veux.

  4. #4
    jiherve

    Re : Description d'un compteur à N chiffres eb vhdl

    Re
    Et comment i évolue t il ?
    Par miracle ?
    il faudrait un generate quelque part.
    JR
    l'électronique c'est pas du vaudou!

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

    Re : Description d'un compteur à N chiffres eb vhdl

    Pour moi i s'incrémente quand en(i) AND S est vrai

    en(i+1) <= en(i) AND S;
    J'essaie de me remettre à niveau donc j'ai pas encore beaucoup de notions en vhdl

  7. #6
    jiherve

    Re : Description d'un compteur à N chiffres eb vhdl

    Re
    en(i+1)<= en(i) and S ne fait que copier le résultat de l’équation dans en(i+1)
    Ben non il faut écrire:
    for i in 0 to N-1 generate
    process
    begin
    là le code d'un compteur.
    end process;
    end generate;
    Pour garder l'indentation : notepad ++ et convert tab to space
    JR
    Dernière modification par jiherve ; 09/07/2019 à 23h30.
    l'électronique c'est pas du vaudou!

  8. #7
    jiherve

    Re : Description d'un compteur à N chiffres eb vhdl

    ajout
    pour un bon bouquin VHDL : VHDL GOLDEN REFERENCE GUIDE DOULOS.
    JR
    l'électronique c'est pas du vaudou!

  9. #8
    inviteed5e4bec

    Re : Description d'un compteur à N chiffres eb vhdl

    Merci beaucoup pour votre aide
    Alors j'ai fais comme vous m'avez dit et ca fonctionne bien. Sauf que le compteur dépasse la valeur 99...999 et ça me crée une erreur. Je ne sais pas comment faire pour faire reprendre mon comptage à 00...00 une fois qu'on arrive au bout.
    Voici mon code actuellement:

    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.numeric_std.all;
    
    entity compteur is
    	generic (
    		N	: integer := 3
    		);
    		port(
    			clk		: in std_logic;
    			resetn	: in std_logic;
    			incr 	: in std_logic;
    			bcd		: out std_logic_vector(4*N-1 downto 0);
    			time_out: out std_logic
    		);
    end entity;
    
    architecture rtl of compteur is
    	signal en 		: std_logic_vector(N downto 0);
    	signal s 		: std_logic_vector(N downto 0);
    	signal i		: natural range 0 to N;
    	signal bcd1		: std_logic_vector (4*N-1 downto 0);
    	
    	
    begin	
    	en(0) <= incr;
    	time_out <= en(N);
    	bcd <= bcd1;
    	
    	
    	process (clk, resetn) is
    	begin
    		if resetn ='0' then
    			bcd1 <= (others => '0');
    		elsif rising_edge(clk) then
    		
    		for i in 0 to N loop
    		
    			if en(i) = '1' then 
                  if S(i) = '1' then 
                     bcd1(4*i+3 downto 4*i) <= (others => '0');
                  else
                     bcd1(4*i+3 downto 4*i) <= std_logic_vector(unsigned(bcd1(4*i+3 downto 4*i))+1);
                  end if;
                end if;  
    		end loop;
            end if;
    	end process;
    	
    	
    	boucle	: for i in 0 to N-1 generate
    	
    		S(i) <= '1' when (unsigned(bcd1(4*i+3 downto 4*i))=9)
    		else '0';
    	
    		en(i+1) <= en(i) AND S(i);
    	
    	end generate;
    	
    end architecture;

  10. #9
    jiherve

    Re : Description d'un compteur à N chiffres eb vhdl

    bonjour,
    ben tu rajoutes un étage bidon dont tu utilises seulement l'enable qui déclenchera un reset synchrone des compteurs précédents.
    Code:
    process (clk, resetn) is
    	begin
    		if (resetn ='0')  or  en ( N+1) = '1' then
    			bcd1 <= (others => '0');
    Le compilateur fera le ménage des signaux inutiles.
    JR
    l'électronique c'est pas du vaudou!

  11. #10
    inviteed5e4bec

    Re : Description d'un compteur à N chiffres eb vhdl

    Quand je fais ça il me met une erreur au niveau de la boucle for loop du process. Comment ça se fait?

  12. #11
    jiherve

    Re : Description d'un compteur à N chiffres eb vhdl

    bonjour
    tu devais déjà avoir l'erreur avant car :
    signal bcd1 : std_logic_vector (4*N-1 downto 0);
    for i in 0 to N loop
    ....
    bcd1(4*i+3 downto 4*i) <= std_logic_vector(unsigned(bcd1 (4*i+3 downto 4*i))+1);


    le seul signal supplementaire necessaire c'est :en(N+1).
    JR
    l'électronique c'est pas du vaudou!

  13. #12
    inviteed5e4bec

    Re : Description d'un compteur à N chiffres eb vhdl

    Je n'ai pas compris l'erreur que vous avez essayé de me montrer? dans "bcd1(4*i+3 downto 4*i) " je ne cherche qu'à sélectionner 4 bits dans bcd1

  14. #13
    jiherve

    Re : Description d'un compteur à N chiffres eb vhdl

    re
    ben :
    signal bcd1 : std_logic_vector (4*N-1 downto 0);
    si N vaut 4 alors signal bcd1:std_logic_vector (12 downto 0)
    et
    for i in 0 to N loop
    bcd1(4*i+3 downto 4*i) <= std_logic_vector(unsigned(bcd1 (4*i+3 downto 4*i))+1)

    balaye bcd1(15 downto 0)
    il y a comme un hiatus!
    JR
    l'électronique c'est pas du vaudou!

  15. #14
    inviteed5e4bec

    Re : Description d'un compteur à N chiffres eb vhdl

    Ah oui il faut mettre N-1, une inattention de ma part.
    Le simulateur m'indique toujours un soucis sur la boucle.. Je vais continuer de chercher.

  16. #15
    inviteed5e4bec

    Re : Description d'un compteur à N chiffres eb vhdl

    Je viens de trouver le problème du reset.
    en écrivant ce que vous m'avez dit, c'est à dire :
    Code:
    process (clk, resetn) is
    	begin
    		if (resetn ='0')  or  en ( N+1) = '1' then
    			bcd1 <= (others => '0');
    On place un reset asynchrone ce qui n'est pas bon.
    En réalité mon soucis venait juste de mon code de testbench où j'affectai à incr trop tôt.

    En tout cas je vous remercie pour votre aide.

Discussions similaires

  1. [Programmation] VHDL compteur
    Par invite9d36d5aa dans le forum Électronique
    Réponses: 1
    Dernier message: 28/08/2016, 20h57
  2. Compteur qui affiche les chiffres de 0 à 3 pic16F84
    Par invite64895f95 dans le forum Électronique
    Réponses: 4
    Dernier message: 28/11/2013, 10h03
  3. description vhdl et compteur
    Par invite1a96c59b dans le forum Électronique
    Réponses: 10
    Dernier message: 14/06/2012, 19h14
  4. VHDL-Basys2 extraire l'unité et la dizaine d'un nombre à 2 chiffres
    Par invite2903772b dans le forum Électronique
    Réponses: 4
    Dernier message: 17/04/2012, 18h10
  5. compteur vhdl
    Par inviteacb3e291 dans le forum Électronique
    Réponses: 1
    Dernier message: 15/11/2006, 11h31
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...