[Programmation] Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]



  1. #1
    Sotaz

    Question Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]


    ------

    Bonjour, je souhaite vous remercier d'avance pour le temps que vous prenez à lire ce post.

    Je suis en DUT par apprentissage et j'ai un projet à faire en entreprise. Je suis un peu en difficulté.
    Je vais vous expliquer ma situation, je dois réaliser a un projet pour tester des matériels industrielle, dans ce projet je dois avoir une fréquence de 8Khz pour cela j'ai pris un oscillateur à quartz 4Mhz qui a été divisé avec le CD4040 en j'ai donc mes 8 Khz, je devais encore autres choses mais ça n'est pas un soucis, mon problème est qu'avec cette fréquence je dois faire varier le rapport cyclique pour cela j'utilise le kit d'évaluation "ispMACH 4256ZE" que je dois programmer avec le logiciel de chez lattice soit "ispLever" le soucis c'est que je ne suis pas très compétent en VHDL et je dois le programmer en VHDL je ne sais pas comment m'y prendre et puis j'ai des difficultés à utiliser "ispLever" ma question c'est comment faire pour varier le rapport cyclique ? J'ai déjà fais des recherche et je suis tombé sur ça :
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    entity pwm is port (
          clk: in std_logic;
          SW : in std_logic_vector (3 downto 0); --rapport cyclique (de 0 à 10) 
          reset : in std_logic;
          GPIO_0 : out std_logic_vector(35 downto 0)); -- sortie
    end pwm;
    
    architecture behavior of pwm is
    
    signal cnt : std_logic_vector(3 downto 0) := "0000";
    signal s : std_logic;
    
    begin
    process (clk,rst) begin
      if reset ='1' then s<=(others=>'0');      // Ici il n'y a pas un problème ??quand je compile cela m'adresse une erreur :sos:
      elsif (clk'event and clk='1') then
        if (cnt < SW) then s <='1'; --met la sortie à 1 jusqu'a 
        else s <='0';               --la valeur du rapport cyclique
        end if;
        if (cnt >= "1001") then cnt<="0000"; --remet à 0 quand on a              // Si je met "0010" à la place de "1001" sa fera un rapport cyclique par pas de 1?
        else cnt <= cnt + 1;                 -- compté jusqu'a 10
        end if;
      end if;
    end process;
    GPIO_0(29) <= s;
    end behavior;
    Moi je veux que mon rapport cyclique soit varier de 0% a 100% par pas de 1 en utilisant la clock avec l'oscillateur et non la clock de l'ISP.
    Je ne comprends pas trop comment faire et je comprend pas trop le programme, si quelqu'un peut me détailler plus clairement le programme et m'orienter sur comment débuter, ce serait avec grand plaisir que je prendrais en compte ces informations.


    Au pire des cas je générerais ma PWM avec VHDL et le kit mais je ne vois pas du tout comment faire ça.

    Je vous remercie encore une fois pour le temps que vous m'accordez.

    -----
    Dernière modification par Antoane ; 04/07/2016 à 07h17. Motif: Ajout balises [code]

  2. #2
    jiherve

    Re : Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]

    Bonjour,
    voila un code qui compile et doit fonctionner,celui d'origine est un peu limite.
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.NUMERIC_STD.all;
    
    entity pwm is port (
          clk: in std_logic;-- là il suffit d'entrer ton horloge externe
          SW : in std_logic_vector (6 downto 0); --rapport cyclique (de 0 à 100) 
          reset : in std_logic;
          GPIO_0 : out std_logic_vector(35 downto 0)); -- sortie
    end pwm;
    
    architecture behavior of pwm is
    constant maxcount : integer := 100;-- tu peux changer la valeur
    signal cnt : unsigned(6 downto 0) ;
    signal s : std_logic;
    
    begin
    process (clk,reset) begin
      if reset ='1' then 
         s<='0';    
         cnt <= (others => '0');-- là on a le droit car c'est un vecteur
      elsif (clk'event and clk='1') then
        if (cnt < unsigned(SW)) then 
          s <='1'; --met la sortie à 1 jusqu'a 
        else 
          s <='0';               --la valeur du rapport cyclique
        end if;
        if (cnt >= maxcount) then 
           cnt <= (others => '0'); --remet à 0 quand on atteint 100 donc on a 101 pas la resolution est donc de 1/101
        else 
           cnt <= cnt+ 1;   
        end if;
      end if;
    end process;
    GPIO_0(29) <= s;
    end behavior;
    Comme il y a 4 horloges disponibles sur le composant alors tu dois pouvoir utiliser ton horloge extérieure, ATTENTION s'il y a besoin d'une autre horloge on ne peut pas passer d'un domaine d'horloge à l'autre sans effectuer une resynchronisation des signaux transitant entre les domaines; En particulier si l'horloge 4MHz est réutilisée on ne peut considérer que l'horloge 8Khz possède une phase connue par rapport à celle ci!!!
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    Sotaz

    Re : Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]

    Tout d'abord merci pour ta réponse, cependant j'ai encore quelques questions, on doit faire un design(est ce que c'est obligatoire d'en faire un) pour pouvoir compiler le programme dans le kit ou alors pouvons nous compiler le programme rien qu'avec le code VHDL?

    Ensuite, pour attribuer les pins du kit si j'utilise la fonction "attribute" est ce correct? comme ceci :

    Code:
    attribute chenillard : string;
       	 attribute chenillard of clk: signal is "54";
       	 attribute chenillard of led0 : signal is "71";
    	 attribute chenillard of led1 : signal is "70";
    	 attribute chenillard of led2 : signal is "63";
    	 attribute chenillard of led3 : signal is "62";
    J'avais essayé de faire un chenillard mais sans succès ( je suis vraiment débutant en VHDL ).


    Au départ pour changer le rapport cyclique (sans utilisation de programmation) j'avais donc les 8Khz en sortie du cd4040 que je mettais dans une bascule RS (donc les 8Khz étaient au "set") ensuite la sortie de la bascule était dans l'entrée d'une porte NAND qui a son tour allait dans le CD4059 (vieux composant) ou je re divisais la fréquence, puis cette sortie allait dans le "reset" de ma bascule. Etant donné que je voulais que le rapport cyclique soit variable plusieurs fois sa aurait été une usine à gaz de souder tout ça !

    Merci d'y consacrer du temps dans t'es réponses.

  4. #4
    Sotaz

    Re : Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]

    J'ajoute également un petit problème, même lorsque mes programmes sont justes, que j'ai réussi à ne pas avoir de faute design et VHDL, lorsque je veux compiler dans le kit d'évaluation grâce a ispVM, j'obtiens ceci une fois cliqué sur "Go" (download) :

    Nom : failedcompil.JPG
Affichages : 128
Taille : 42,3 Ko

    Si quelqu'un aurait une solution a ça je suis preneur, merci !

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

    Re : Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]

    bonsoir,
    j'ai trop peu utilisé isplever et il y a trop longtemps pour pouvoir t'aider efficacement dans ce domaine.
    Mais au moins un truc dont je suis sur c'est qu'l faut faire un design et affecter les pattes, si ma mémoire est bonne il y avait un outil graphique pour faire çà dans l'IDE
    désolé.
    JR
    l'électronique c'est pas du vaudou!

  7. #6
    Sotaz

    Re : Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]

    Merci de ta réponse.

    J'ai trouvé il fallait juste cocher deux petites cases. Mon tuteur viens de me dire qu'en fin de compte je devais utiliser la clock du kit pour générer plusieurs fréquences avec toujours un rapport cyclique variable de 0% à 100% par pas de 1, est ce possible ?

    J’aurais également cette question : comment utiliser également le timer sous VHDL, pour faire le chenillard par exemple?

    Le code de mon chenillard est :
    Code:
    LIBRARY ieee;
    USE ieee.std_logic_1164.all;
    
    ENTITY chenillard IS
    
    	PORT (	
    		clk: IN std_logic;
    		led0,led1,led2,led3: OUT std_logic);
    
    		attribute chenillard : string;
       	 	attribute chenillard of clk: signal is "54";
       	 	attribute chenillard of led0 : signal is "71";
    	 	attribute chenillard of led1 : signal is "70";
    	 	attribute chenillard of led2 : signal is "63";
    	 	attribute chenillard of led3 : signal is "62";
    
    END chenillard;
    
    ARCHITECTURE behavior OF chenillard IS
    CONSTANT st0 : std_logic_vector(0 TO 1) := "00";
    CONSTANT st1 : std_logic_vector(0 TO 1) := "01";
    CONSTANT st2 : std_logic_vector(0 TO 1) := "10";
    CONSTANT st3 : std_logic_vector(0 TO 1) := "11";
    SIGNAL state : std_logic_vector(0 TO 1) := "00";
    
    BEGIN
    
    	ledchenillard: PROCESS
    BEGIN
    
    	WAIT UNTIL clk = '1';    -- attend un front montant de clk
    	CASE state IS    -- state est la variable des conditions
    
    WHEN st0 => -- si state = st0 soit '00'
    
    	state <= st1; -- on incrémente la machine d'état
    	led0<='1';
    	led1<='0';
    	led2<='0';
    	led3<='0';
    
    
    
    WHEN st1 => -- si state = st1
    
    	state <= st2; -- la machine d'état passe à st2
    	led0<='0';
    	led1<='1';
    	led2<='0';
    	led3<='0';
    
    WHEN st2 => -- si state = st2
    
    	state <= st3; --machine etat = st3
    	led0<='0';
    	led1<='0';
    	led2<='1';
    	led3<='0';
    
    WHEN st3 =>
    
    	state <= st0; -- la machine d'état est bouclée vers st0
    	led0<='0';
    	led1<='0';
    	led2<='0';
    	led3<='1';
    
    WHEN OTHERS => NULL;
    
    END CASE;
    END PROCESS led chenillard;

    Cependant toutes les leds (les 4) sont allumées et ne clignote pas, je pense que c'est du a la fréquence trop élevée? Comment je gère cela?

    Merci d'avance pour ta réponse.

  8. #7
    jiherve

    Re : Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]

    Re
    Pour utiliser l'horloge du kit il suffit de diviser cette horloge pour générer un top de validation à la fréquence idoine.
    le code de la PWM devient alors.
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.NUMERIC_STD.all;
    
    entity pwm is port (
          clk: in std_logic;-- horloge du kit
          en_clk: std_logic;-- enable issu d'un diviseur
          SW : in std_logic_vector (6 downto 0); --rapport cyclique (de 0 à 100) 
          reset : in std_logic;
          GPIO_0 : out std_logic_vector(35 downto 0)); -- sortie
    end pwm;
    
    architecture behavior of pwm is
    constant maxcount : integer := 100;-- tu peux changer la valeur
    signal cnt : unsigned(6 downto 0) ;
    signal s : std_logic;
    
    begin
    process (clk,reset) begin
      if reset ='1' then 
         s<='0';    
         cnt <= (others => '0');-- là on a le droit car c'est un vecteur
      elsif (clk'event and clk='1') then
        if en_clk = '1' then
          if (cnt < unsigned(SW)) then 
            s <='1'; --met la sortie à 1 jusqu'a 
          else 
            s <='0';               --la valeur du rapport cyclique
          end if;
          if (cnt >= maxcount) then 
             cnt <= (others => '0'); --remet à 0 quand on atteint 100 donc on a 101 pas la resolution est donc de 1/101
          else 
             cnt <= cnt+ 1;   
          end if;
        end if;
      end if;
    end process;
    GPIO_0(29) <= s;
    end behavior;
    Pour ton autre code il n'est pas synthétisable car tu utilises "wait until",ensuite il faudra aussi faire en sorte que la machine à etats fonctionne en TBF (de l'ordre du hertz),donc encore besoin d'un diviseur en amont de tout çà.
    JR
    l'électronique c'est pas du vaudou!

  9. #8
    Sotaz

    Re : Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]

    Re,

    Merci pour ta réponse. Mais dans ce cas je dois utiliser quoi à la place du "wait until" pour qu'il soit synthétisable?

  10. #9
    jiherve

    Re : Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]

    Bonjour
    ben "elsif (clk'event and clk='1') then" cela devrait le faire!
    JR
    l'électronique c'est pas du vaudou!

  11. #10
    Sotaz

    Re : Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]

    Re,

    J'ai fais avec ce que tu viens de me donner mais c'est comme avec le "wait until", les leds s'allument et rien. Si j'ai bien compris, je dois utiliser un diviseur en amont pour voir quelque chose ( obtenir quelque hertz) ?

    Si m'as mémoire est bonne l'oscillateur nominal est de 5Mhz.

  12. #11
    jiherve

    Re : Géneration PWM avec kit d'éval. ispMACH 4256ZE, sous ispLever[VHDL]

    Re
    oui il faudra diviser et générer une impulsion dont la durée sera d'un cycle d'horloge pour valider l'avancement de la machine à état.
    Pour faire simple à partir de 5MHz il faudra diviser par 2^22 cela demandera donc 22 bascules + 1 pour avoir un signal propre.

    Le meme compteur peut être utiliser pour générer l'enable pour la pwm , une bascule de plus
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.NUMERIC_STD.all;
    
    entity divider is port (
          clk: in std_logic;-- horloge du kit
          reset : in std_logic;
          en_clk_chenillard: out std_logic;-- enable issu du diviseur
          en_clk_pwm: out std_logic;-- enable issu du diviseur
    end divider ;
    
    architecture rtl of divider  is
    signal cnt : unsigned(21 downto 0) ;-- on déclare un compteur ayant 21 bits 
    begin
    process (clk,reset) begin
      if reset ='1' then 
          cnt <= (others => '0');-- le compteur est initialisé à un
       elsif (clk'event and clk='1') then
            cnt <= cnt+ 1;
         if cnt(8 downto 0) = 511 
           en_clk_pwm <= '1';-- fréquence environ 9765 Hz
        else
          en_clk_pwm <= '0';
        end if;
        if cnt= 4194303 then
           en_clk_chenillard <= '1';-- frequence environ 1,2Hz
        else
          en_clk_chenillard <= '0';
        end if;
      end if;
    end process;
    end rtl;
    note : il faut toujours(presque) utiliser une bascule derrière un comparateur cela limite le nombre de signaux à router vers la logique aval et garanti un fonctionnement propre sans possibilité de glitch
    JR
    l'électronique c'est pas du vaudou!

Discussions similaires

  1. [Programmation] Problème en VHDL avec les multi fichiers vhdl
    Par drbug dans le forum Électronique
    Réponses: 2
    Dernier message: 02/02/2016, 11h32
  2. [Programmation] VHDL design génération de flip-flop
    Par funzy2009 dans le forum Électronique
    Réponses: 10
    Dernier message: 24/11/2015, 21h06
  3. Génération aléatoire d'une séquence binaire en VHDL
    Par ioro dans le forum Électronique
    Réponses: 3
    Dernier message: 10/04/2015, 10h45
  4. commande d'ascenseur avec VHDL la carte vhdl
    Par chakib123 dans le forum Électronique
    Réponses: 6
    Dernier message: 02/06/2014, 02h41
  5. Réponses: 9
    Dernier message: 08/11/2011, 02h05
Découvrez nos comparatifs produits sur l'informatique et les technologies.