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 :

Problème code vhdl condition "when"


Sujet :

VHDL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Problème code vhdl condition "when"
    Bonjour, je débute en vhdl et je dois voulais utiliser la fonction case. Cependant j'aimerais que la condition sur mon when x => soit un condition <= ou >= et non sur une simple valeur. Cela est-il possible ? Ou existe-il des alternatives ?
    Merci d'avance,
    Renaud

    PS : je peux éventuellement afficher mon code et décrire sa fonction pour une solution au problème.

  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
    Salut,

    J'ai juste un contournement comme solution en passant par une variable.

    Éventuellement, si ca a du mal a tenir les contraintes de timing, tu places le test et l'affectation de la variable apres le case, en gardant à l'esprit que le case se fera un coup d'horloge plus tard.

    Code ci dessous

    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
     
     
    process(clk)
    variable v_test : std_logic_vector(1 downto 0):="00";
    begin
          if rising_edge(clk) then
     
               if BLABLA>XXXX then
                     v_test :="10";
              else
                     v_test :="01";
              end if;
     
             case v_test is
                  when "01=>
                  when "10" =>
                  when others =>
             end case;
     
          end if;
    end process;

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Salut sgievounet,
    a première vue ton code est intéressant. Cependant j'ai aussi fait part de cette question sur le forum altera (anglais seulement donc plus compliqué) et j'ai obtenu diverses réponses.
    Malheureusement le but de ma question était pour un exercice pour l'unif où je devais a la fin avoir moins de 22 éléments logiques et si j'en ai plus de 25 j'avais un minus. J'ai essayé avec des if imbriqués et avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    case XXX is
    <div style="margin-left:40px">when A to B =></div>...
    ...
    end case
    Mais j'ai trop d'EL. En ce qui concerne ton exemple je crois que c'est pas la meilleure solution a mon problème car je dois respecter énormément d'intervalle de valeur, et donc création d'autant de variable_test. Notre code doit est un test d'électrocardiogramme qui allume certaines leds(8 en tout) en fonction du rythme cardiaque. Si tu as le temps de regarder, voici le code mère que nous avions pour un premier électrocardiogramme composé de 2 leds(led_slow et led_fast). Comment l'améliorer pour qu'il corresponde a un celui pour 8 leds ? Voici aussi 2 autres codes tests que j'ai écrit sur base du code mère. Je débute en vhdl donc si tu as des conseils je suis tout ouïe
    Merci,
    Renaud

    PS : on peut pas joindre de fichier vhdl donc voici la page où j'ai posté les miens sur l'autre forum http://www.alteraforum.com/forum/showthread.php?t=51915

  4. #4
    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
    Salut,

    Ce que j'ai écris c'est qu'une bidouille de contournement qui n'a pas de sens en fait...

    22 elements logiques ca fait vraiment pas beaucoup...

    Les intervalles de valeurs c'est toi qui les fixes?

    Par ce que si c'est toi, et bien tu pourrais bien prendre 0,32,64,96,128,160,192,224 comme intervales..

    En binaire ca vaut ca:

    0 => 00000000
    32 => 00100000
    64 => 01000000
    96 => 01100000
    128 => 10000000
    160 => 10100000
    192 => 11000000
    224 => 11100000

    Donc en te servant des 3 premiers bits, tu peux piloter tes leds.

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Malheureusement je dois respecter certaines valeurs d'intervalle oui.. Mais j'ai demandé à des amis et ils ont pas trouvé le moyen de faire moins de 22 non plus

  6. #6
    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
    J'ai fais une passe dans ton code posté sur le forum d'altera.

    L'histoire des 22 elements logiques m'a bien défié.

    J'ai un peu modifié ton code et je crois avoir perdu une intervalle en route, à toi de la remettre.

    Je n'ai pas installé les composants MAX d'Altera sous Quartus, donc j'ai compilé sous un Cyclone III.

    J'arrive à 24 elements logiques, contre 35 avant modification. Peut être que sous le MAX on arriverait à 22 avec l'intervalle manquante.

    Faudrait que tu re simules sous modelsim pour verifier les resultats sont ceux que tu dois obtenir. Pas sur de ma modif.

    Je suis preneur de la correction de ton prof.

    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
     
     
    library ieee;
    use ieee.std_logic_1164.all;
     
    entity cardio_8 is
    	port
    	(
    		-- Input ports
    		clk	: in  std_logic;
    		heart	: in  std_logic;
     
    		-- Output ports
    		leds_s	: buffer std_logic_vector (0 to 1) ;
    		leds_g 	: buffer std_logic_vector (0 to 3) ;
    		leds_f	: buffer std_logic_vector (0 to 1) 	
    	);
    end entity cardio_8;
     
    architecture cardio_arch of cardio_8 is
    	signal cnt			: integer range 0 to 127 := 0;
    	signal heart_old	: std_logic := '0';
    begin
    	counter : process(clk)
    	begin
    		if( rising_edge(clk)) then
    			if( heart_old = '1' and heart = '0') then
     
                    case cnt is
                        when 80 =>
                            leds_s <= "01";
                            leds_g <= "0000";
                            leds_f <= "00";
                        when 42 =>
                            leds_s <= "00";
                            leds_g <= "0001";
                            leds_f <= "00";
                        when 29 =>
                            leds_s <= "00";
                            leds_g <= "0011";
                            leds_f <= "00";
                        when 22 =>
                            leds_s <= "00";
                            leds_g <= "0111";
                            leds_f <= "00";
                        when 16 =>
                            leds_s <= "00";
                            leds_g <= "0000";
                            leds_f <= "01";
                        when 0 =>
                            leds_s <= "00";
                            leds_g <= "0000";
                            leds_f <= "11";
                        when others =>
                            --leds_s <= "11";
                            --leds_g <= "1111";
                            --leds_f <= "00";
                    end case;
     
                    cnt <= 0;
     
    			else
    				if(cnt /= 127) then
    					cnt <= cnt + 1;
    				end if;
    			end if;
    			heart_old <= heart;
    		end if;
    	end process counter;
    end architecture cardio_arch;

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Je crois qu'au final on a la même idée mais tu ne prends pas en compte toutes les valeurs. Parce que moi je dois gérer toutes les valeurs possibles du nombre de battement tandis que toi tu prends certaines valeurs particulière. Donc si par exemple cnt valait 80 les leds de ton code s'allumeraient mais pour cnt = 81 on serait dans le when other ce qui n'est pas logique en soit. Mais je te remercie du temps et des conseils que tu m'as donné et je te ferai part d'un correctif

  8. #8
    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
    En cnt = 81, on passe en when others, et dans le when others il n'y a rien.

    Donc les leds restent en l'etat du when 80.

    EDIT: Effectivement, ca ne marcherait pas

    Bon courage

  9. #9
    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
    29 LE's

    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
     
     
     
    library ieee;
    use ieee.std_logic_1164.all;
     
    entity cardio_8 is
    	port
    	(
    		-- Input ports
    		clk	: in  std_logic;
    		heart	: in  std_logic;
     
    		-- Output ports
    		leds_s	: out std_logic_vector (0 to 1) ;
    		leds_g 	: out std_logic_vector (0 to 3) ;
    		leds_f	: out std_logic_vector (0 to 1) 	
    	);
    end entity cardio_8;
     
    architecture cardio_arch of cardio_8 is
    	signal cnt			: integer range 0 to 127 := 0;
    	signal heart_old	: std_logic := '0';
     
    	signal leds_s_tmp	: std_logic_vector (0 to 1);
    	signal leds_g_tmp 	: std_logic_vector (0 to 3);
    	signal leds_f_tmp	: std_logic_vector (0 to 1);	
     
    begin
    	counter : process(clk)
    	begin
    		if( rising_edge(clk)) then
    			if( heart_old = '1' and heart = '0') then
     
                    cnt <= 0;
     
                    leds_s <= leds_s_tmp;
                    leds_g <= leds_g_tmp;                
                    leds_f <= leds_f_tmp;                
     
     
    			else
     
                    case cnt is
                        when 80 =>
                            leds_s_tmp <= "01";
                            leds_g_tmp <= "0000";
                            leds_f_tmp <= "00";
                        when 42 =>
                            leds_s_tmp <= "00";
                            leds_g_tmp <= "0001";
                            leds_f_tmp <= "00";
                        when 29 =>
                            leds_s_tmp <= "00";
                            leds_g_tmp <= "0011";
                            leds_f_tmp <= "00";
                        when 22 =>
                            leds_s_tmp <= "00";
                            leds_g_tmp <= "0111";
                            leds_f_tmp <= "00";
                        when 16 =>
                            leds_s_tmp <= "00";
                            leds_g_tmp <= "0000";
                            leds_f_tmp <= "01";
                        when 0 =>
                            leds_s_tmp <= "00";
                            leds_g_tmp <= "0000";
                            leds_f_tmp <= "11";
                        when others =>
                    end case;
     
     
    				if(cnt /= 127) then
    					cnt <= cnt + 1;
    				end if;
    			end if;
    			heart_old <= heart;
    		end if;
    	end process counter;
    end architecture cardio_arch;

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2016
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    26
    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
     
    library ieee;
    use ieee.std_logic_1164.all;
     
    entity cardio_8 is
    	port
    	(
    		-- Input ports
    		clk	: in  std_logic;
    		heart	: in  std_logic;
     
    		-- Output ports
    		leds_s	: buffer std_logic_vector (0 to 1) := "00";
    		leds_g 	: buffer std_logic_vector (0 to 3) := "0000";
    		leds_f	: buffer std_logic_vector (0 to 1) := "00"	
    	);
    end entity cardio_8;
     
    architecture cardio_arch of cardio_8 is
    	signal cnt			: integer range 0 to 127 := 0;
    	signal heart_old	: std_logic := '0';
    begin
    	counter : process(clk)
    	begin
    		if( rising_edge(clk)) then
    			if( heart_old = '1' and heart = '0') then
     
     
    				-- 16 /18 /22 29/29 42/42 80/80 90/90
    				if (cnt < 18) then
    					leds_f <= "01";
    					leds_g <= "0000";
    					leds_s <= "00";
    						if(cnt < 16) then
    							leds_f <= "01";
    						end if;
    				elsif(cnt > 80) then
    					leds_f <= "00";
    					leds_g <= "0000";
    					leds_s <= "01";
    						if(cnt > 90) then
    							leds_s <= "11";
    						end if;
    				else
    					leds_s <= "00";
    					leds_f <= "00";
    						if(cnt < 22) then
    							leds_g <= "1111";
    						elsif(cnt < 29) then
    							leds_g <= "0111";
    						elsif(cnt < 41) then
    							leds_g <= "0011";
    						else
    							leds_g <= "0001";
    						end if;
    				end if;
     
     
    				cnt <= 0;
     
    			else
    				if(cnt /= 127) then
    					cnt <= cnt + 1;
    				end if;
    			end if;
    			heart_old <= heart;
    		end if;
    	end process counter;
    end architecture cardio_arch;

+ Répondre à la discussion
Cette discussion est résolue.

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