Go Down

Topic: [Résolu pour les séquences ] aide pour programme VHDL (Read 2337 times) previous topic - next topic

AlienArea51

May 09, 2014, 01:00 pm Last Edit: May 11, 2014, 06:04 pm by AlienArea51 Reason: 1
Bonjour
Malgré que se soit hors sujet " Arduino " , je tente de poser ce Post .
Donc , le programme ci-dessous exécute 16 séquences pour faire un effet de Type " K2000 voire Cylon " , je souhaiterai à l'aide de 1 Switch supplémentaire exécuter une 2eme séquence de 16 , mais indépendante , c'est à dire si SW0 => séquence  0- 15 ,si SW1 => séquence 16 -31  , l'intégration de SW1 ainsi que la déclaration de 5 bits pour ' state  ' c'est bon .
Par contre je coince comment incrémenter ' state ' à partir de 16  !  
Donc merci à vous ,si vous avez une idée de comment faire .

Le Prog :

Code: [Select]

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity visor is
generic(N:integer :=8);

   Port ( CLK : in   STD_LOGIC;
          SW0 : in   STD_LOGIC;
LED : out STD_LOGIC_VECTOR(N-1 downto 0)
        );
end visor;

architecture visor_impl of visor is
 signal clk_counter : std_logic_vector(22 downto 0);
 signal state : std_logic_vector(3 downto 0);  //  ( 4 downto 0 ) pour 5 Bits  

 
begin

 process(CLK, clk_counter)
 begin
   if (CLK'event and CLK='1') then
     if (clk_counter=2000000) then  
       clk_counter <= (others => '0');
      else
       clk_counter <= clk_counter + 1;
     end if;
   end if;
 end process;
 
 process(CLK, SW0, state,clk_counter)
 begin
   if (CLK'event and CLK='1') then
     if (clk_counter=0) then
       if (SW0='0' or state = 15 ) then
         state <= (others => '0');
else
        state <= state + 1 ;
       end if ;
end if;
end if;
 end process;
 
 process(state)
 begin
   if (state=0) then
     LED <= "00000001";
   elsif (state=1) then
     LED<= "00000011";
   elsif (state=2) then
     LED<= "00000110";
   elsif (state=3) then
     LED <= "00001100";
   elsif (state=4) then
     LED<= "00011000";
   elsif (state=5) then
     LED <= "00110000";
   elsif (state=6) then
    LED <= "01100000";
   elsif (state=7) then
     LED<= "11000000";
   elsif (state=8) then
    LED <= "10000000";
   elsif (state=9) then
     LED <= "01100000";
   elsif (state=10) then
    LED <= "00110000";
   elsif (state=11) then
     LED <= "00011000";
   elsif (state=12) then
    LED <= "00001100";
   elsif (state=13) then
     LED <= "00000110";
elsif (state=14) then
     LED <= "00000011";
elsif (state=15) then
     LED <= "00000001";
else
    LED <= "00000000";
  end if;
 end process;
 
end visor_impl;

@+
Will

P.S: En attendant de te voir ' F '   ;) ;)
The truth is elsewhere !!

fdufnews

Plutôt que de créer des états supplémentaires, il vaut mieux faire une machine de décodage des états distincte et faire une sélection a posteriori.

Code: [Select]
  process(state)
  begin
    if (state=0) then
      LED1 <= "00000001";
    elsif (state=1) then
      LED1<= "00000011";
    elsif (state=2) then
      LED1<= "00000110";
    elsif (state=3) then
      LED1 <= "00001100";
    elsif (state=4) then
      LED1<= "00011000";
    elsif (state=5) then
      LED1 <= "00110000";
    elsif (state=6) then
     LED1 <= "01100000";
    elsif (state=7) then
      LED<= "11000000";
    elsif (state=8) then
     LED <= "10000000";
    elsif (state=9) then
      LED1 <= "01100000";
    elsif (state=10) then
     LED1 <= "00110000";
    elsif (state=11) then
      LED1 <= "00011000";
    elsif (state=12) then
     LED1 <= "00001100";
    elsif (state=13) then
      LED1 <= "00000110";
elsif (state=14) then
      LED1 <= "00000011";
elsif (state=15) then
      LED 1<= "00000001";
else
     LED1 <= "00000000";
   end if;
  end process;


-- adapter les valeurs pour cette seconde séquence
  process(state)
  begin
    if (state=0) then
      LED2 <= "00000001";
    elsif (state=1) then
      LED2<= "00000011";
    elsif (state=2) then
      LED2<= "00000110";
    elsif (state=3) then
      LED2 <= "00001100";
    elsif (state=4) then
      LED2<= "00011000";
    elsif (state=5) then
      LED2 <= "00110000";
    elsif (state=6) then
     LED2 <= "01100000";
    elsif (state=7) then
      LED2<= "11000000";
    elsif (state=8) then
     LED2<= "10000000";
    elsif (state=9) then
      LED2 <= "01100000";
    elsif (state=10) then
     LED2 <= "00110000";
    elsif (state=11) then
      LED2 <= "00011000";
    elsif (state=12) then
     LED2 <= "00001100";
    elsif (state=13) then
      LED2 <= "00000110";
elsif (state=14) then
      LED2 <= "00000011";
elsif (state=15) then
      LED2 <= "00000001";
else
     LED2 <= "00000000";
   end if;
  end process;

if(SW0=1) then
       LED => LED1;
elsif (SW1=1) then
      LED => LED2;
endif;

AlienArea51

#2
May 09, 2014, 04:33 pm Last Edit: May 09, 2014, 04:52 pm by AlienArea51 Reason: 1
Merci fdufnews
Je pense ,car pas eu le temps d'essayer ' je viens de voir ta réponse ' , le fait de doubler  " process (state)  " , ne fonctionnera pas ,car déjà tenté l'expérience  ;) de même pour la déclaration des sorties " LED " .
j'avais fait 2 process(state)
- process(state)
- process(state2)
accepté par le compilateur , mais par contre ,blocage au niveau des sorties ..

Par contre ,il est vrai que ce programme est un peu (vas y  :smiley-mr-green: ) ,mais pour le moment ,c'est la façon la plus simple pour moi de créer des séquences  ;)

Si tu as eu un peu de temps pour analyser , tu as vu certainement qu'il y avait 2 compteurs
- 1 pour diviser la fréquence
- 1 pour le comptage séquence qui est incrémenté par le 1er .
Plus facile de faire :
signal state : std_logic_vector(3 downto 0);  
Modifier le nombre de bits ,afin d'augmenter le nombre de séquence  , EX : signal state : std_logic_vector(4 downto 0);
5 Bits ce qui me ferai 32 séquences pour commencer ,et de jouer avec les switchs pour lui dire ,tu incrémente de 0 à 15  ou  de 16 à 31
Mais pas trouvé ?? tous ce situe ici :
process(CLK, SW0, state,clk_counter)
 begin
   if (CLK'event and CLK='1') then
     if (clk_counter=0) then
       if (SW0='0'   or state = 15 ) then
         state <= (others => '0');
          else
       state <= state + 1 ;
                      end if ;
                  end if;
               end if;
 end process;

Mais ton idée était loin d'être idiote " crois moi "  ;) , le soucis est que FPGA n'est pas Arduino  :D :D :D ,ça fonctionne différemment  ;)
Amic
Will
La vidéo du truc  :D  :
https://www.youtube.com/watch?v=As5Sw12oKEo
The truth is elsewhere !!

fdufnews


j'avais fait 2 process(state)
- process(state)
- process(state2)
accepté par le compilateur , mais par contre ,blocage au niveau des sorties ..


Si tu déclares process(state2) il faut définir state2 par ailleurs

Il n'y a aucune raison pour que le principe que je t'ai exposé ne fonctionne pas.
Tu peux parfaitement déclarer 2 process différents avec la même variable de déclenchement state dans notre cas. Par contre à l'intérieur des process il faut affecter des signaux différents (LED1 et LED2 dans l'exemple que j'ai donné)

Ensuite l'affectation aux sorties se fait soit avec un if ... then ... else ... à l'intérieur d'un nouveau process, soit dans une équation combinatoire avec un  <= ... when ... else ...


Mais ton idée était loin d'être idiote " crois moi "  ;) , le soucis est que FPGA n'est pas Arduino  :D :D :D ,ça fonctionne différemment  ;)

J'ai 20 ans de développement FPGA en traitement d'image derrière moi alors je sais un peu....

AlienArea51

#4
May 09, 2014, 07:10 pm Last Edit: May 09, 2014, 07:50 pm by AlienArea51 Reason: 1
Je persiste et signe que ton explication , du moins " exemple " , ayant que quelques jours " mois " donc loin de tes connaissances   ;) , ça ne fonctionne pas …
car déjà essayé , mon ami ..  ;)
Quote
Si tu déclares process(state2) il faut définir state2 par ailleurs

ça a été fait  ;) , idiot , novice , mais pas con non plus  ;)
Quote
J'ai 20 ans de développement FPGA en traitement d'image derrière moi alors je sais un peu....

je n'en doute absolument pas  ;)
Car tu as répondu , donc je suppose que quelque part !!!!
Une autre personne est Formateur sur FPGA " VHDL " entre autre , que j'ai eu 2h00 au téléphone Hier soir , ne m'a pas donné la solution ..
Pourtant , c'est un exemple simple , d'après les dire  :smiley-mr-green: , mais en fait !!  

La seul chose que je peux dire , est ,que j'ai 19 ans d'expérience en productique , et j'en apprend encore maintenant , 35 ans de boulot ( 6 entreprises ) dans divers secteurs (Mécanique  - Automobile -Maintenance - Alimentaire - Peinture etc ..) et j'en apprend encore et encore ..
Mon cursus se situe niveau C.A.P - B.E.P MECA - ELECTRO , pas ingé ou BTS , pour moi , ça c'est de l'amusement , histoire de ne pas mourir con , je m'intéresse , et comme dirai quelqu'un que je connais sur ce Forum !! BREF ..

Pour ça :
Quote
J'ai 20 ans de développement FPGA en traitement d'image derrière moi alors je sais un peu....

Pas besoin de te justifier ..
Je te crois sur parole , par contre , j'ai déjà essayé , figure toi , et ça ne fonctionne pas …. et ça , c'est pas 20 ans d'expérience , c'est tout simplement Xilinx ( UNE GROSSE CROIX ROUGE AVEC PLEIN DE MESSAGES ° , ça c'est du concret  ;)
Sans rancune j'espère  ;)
Amic
Will
Je préfère en rester là , car beaucoup de lecture en attente de clash , j'ai passé l'âge pour ces conneries ..
je ferai comme DAB , me demmerder tout seul ,et trouver la solution par mes propres moyens de nul à chier de connard de P….de sa .. M de Alien de M…  ,il pose des questions à la con  :smiley-mr-green: ..


The truth is elsewhere !!

fdufnews


Je persiste et signe que ton explication , du moins " exemple " , ayant que quelques jours " mois " donc loin de tes connaissances   smiley-wink , ça ne fonctionne pas …
car déjà essayé , mon ami ..  

Je préfère en rester là , car beaucoup de lecture en attente de clash , j'ai passé l'âge pour ces conneries ..
je ferai comme DAB , me demmerder tout seul ,et trouver la solution par mes propres moyens de nul à chier de connard de P….de sa .. M de Alien de M…  ,il pose des questions à la con  :smiley-mr-green: ..

Tes gentil mais tu as un coté Calimero qui pourrait être un peu fatigant des fois.
Ce code est synthétisé sans aucune erreur. Je te laisse le soin de changer l'état des LED du second séquenceur
Code: [Select]
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity visor is
generic(N:integer :=8);

   Port ( CLK : in   STD_LOGIC;
          SW0 : in   STD_LOGIC;
          SW1 : in   STD_LOGIC;
LED : out STD_LOGIC_VECTOR(N-1 downto 0)
        );
end visor;

architecture visor_impl of visor is
 signal clk_counter : std_logic_vector(22 downto 0);
 signal state : std_logic_vector(3 downto 0);
 signal LED1 : STD_LOGIC_VECTOR(N-1 downto 0);
 signal LED2 : STD_LOGIC_VECTOR(N-1 downto 0);

 
begin

 process(CLK, clk_counter)
 begin
   if (CLK'event and CLK='1') then
     if (clk_counter=2000000) then  
       clk_counter <= (others => '0');
      else
       clk_counter <= clk_counter + 1;
     end if;
   end if;
 end process;
 
 process(CLK, SW0, state,clk_counter)
 begin
   if (CLK'event and CLK='1') then
     if (clk_counter=0) then
       if (SW0='0' or state = 15 ) then
         state <= (others => '0');
else
        state <= state + 1 ;
       end if ;
end if;
end if;
 end process;
 
-- Sequence 1
 process(state)
 begin
   if (state=0) then
     LED1 <= "00000001";
   elsif (state=1) then
     LED1<= "00000011";
   elsif (state=2) then
     LED1<= "00000110";
   elsif (state=3) then
     LED1 <= "00001100";
   elsif (state=4) then
     LED1<= "00011000";
   elsif (state=5) then
     LED1 <= "00110000";
   elsif (state=6) then
    LED1 <= "01100000";
   elsif (state=7) then
     LED1<= "11000000";
   elsif (state=8) then
    LED1 <= "10000000";
   elsif (state=9) then
     LED1 <= "01100000";
   elsif (state=10) then
    LED1 <= "00110000";
   elsif (state=11) then
     LED1 <= "00011000";
   elsif (state=12) then
    LED1 <= "00001100";
   elsif (state=13) then
     LED1 <= "00000110";
elsif (state=14) then
     LED1 <= "00000011";
elsif (state=15) then
     LED1 <= "00000001";
else
    LED1 <= "00000000";
  end if;
 end process;

-- Sequence 2  
 process(state)
 begin
   if (state=0) then
     LED2 <= "00000001";
   elsif (state=1) then
     LED2<= "00000011";
   elsif (state=2) then
     LED2<= "00000110";
   elsif (state=3) then
     LED2 <= "00001100";
   elsif (state=4) then
     LED2<= "00011000";
   elsif (state=5) then
     LED2 <= "00110000";
   elsif (state=6) then
    LED2 <= "01100000";
   elsif (state=7) then
     LED2<= "11000000";
   elsif (state=8) then
    LED2 <= "10000000";
   elsif (state=9) then
     LED2 <= "01100000";
   elsif (state=10) then
    LED2 <= "00110000";
   elsif (state=11) then
     LED2 <= "00011000";
   elsif (state=12) then
    LED2 <= "00001100";
   elsif (state=13) then
     LED2 <= "00000110";
elsif (state=14) then
     LED2 <= "00000011";
elsif (state=15) then
     LED2 <= "00000001";
else
    LED2 <= "00000000";
  end if;
 end process;
 
-- Sequence 1 lorsque SW0 est à 1
-- Sequence 2 lorsque SW1 est à 1
-- SW0 prioritaire sur SW1
  LED <= LED1 when (SW0='1') else
         LED2 when (SW1='1') else (others =>'0');

end visor_impl;

AlienArea51

#6
May 09, 2014, 09:10 pm Last Edit: May 10, 2014, 09:03 am by AlienArea51 Reason: 1
AH OUAI !!!
Quote
Tes gentil mais tu as un coté Calimero qui pourrait être un peu fatigant des fois.

Ne te sent pas obligé de répondre l'ami  ;)
C'est bien que tu le fasse , mais je ne fais pas l'aumone non plus , je pose une question , on me répond ou pas .

@+
Calimero   :smiley-mr-green: :smiley-mr-green:

The truth is elsewhere !!

AlienArea51

#7
May 11, 2014, 06:04 pm Last Edit: May 11, 2014, 06:09 pm by AlienArea51 Reason: 1
Voici la vidéo des 3 séquences
Regarder la fin de la vidéo  ;)

https://www.youtube.com/watch?v=klBwZBn0etg&feature=youtu.be

@+
Will
The truth is elsewhere !!

Go Up