Répondre à la discussion
Affichage des résultats 1 à 2 sur 2

Réaliser une PWM en VHDL



  1. #1
    ThiuT

    Réaliser une PWM en VHDL

    Salut à tous !

    Toujours dans le cadre de mon écran à LED, j'ai besoin de réaliser un générateur de PWM dans un CPLD. Le module reçoit un entier codé 4bits et doit générer un signal dont le rapport cyclique dépend de l'entier. Sachant que 0 doit coder une sortie à 0 et 15 doit coder une sortie à 1.

    Voila ce que ca donne :

    library ieee;
    use ieee.std_logic_1164.all;

    entity Calculateur is
    port(Entree : in integer range 0 to 15;
    H : in std_logic;
    Sortie : out std_logic);
    end Calculateur;

    architecture Rapport_cyclique of Calculateur is
    begin
    process(H,Entree)
    variable count : integer;
    begin
    if count>=16 then count := 0;
    end if;
    case Entree is
    when 0 => Sortie <= '0';
    when 15 => Sortie <= '1';
    when others =>
    if count > Entree then Sortie <= '0';
    else Sortie <= '1';
    end if;
    count := count+1;
    end case;
    end process;
    end Rapport_cyclique;

    (L'idée est simplement de compter un certain nombre de périodes d'horloge en maintenant la sortie à l'état haut, puis un autre nombre de périodes en maintenant la sortie à l'état bas)

    La fréquence n'est pas un probleme puisque la seule contrainte est que celle du signal de sortie soit supérieure à 50Hz.

    Mais voila, lorsque je teste ce module sous Quartus 2, il fonctionne à merveille pour Entrée = 0 ou 15, mais me donne un état indéterminé en sortie pour toute autre valeur...

    Un peu d'aide ne serais pas de refus ^^

    -----


  2. #2
    jiherve

    Re : Réaliser une PWM en VHDL

    Bonsoir
    ce process est un process purement asynchrone, dans le principe ce n'est pas interdit mais c'est fort dommageable pour obtenir une synthèse de compteur car qui dit comptage suppose implicitement bascules et donc horloge!
    manque aussi un reset, toute logique non initialisée mérite le bûcher!
    architecture Rapport_cyclique of Calculateur is
    begin
    process(H,Clear)
    variable count : integer range 0 to 15 ;
    -- sans Range l'entier est codé sur 32 bits
    begin
    if clear = '1' then
    count := 0;
    sortie <= '0';
    elsif rising_edge(h) then

    -- dans ce cas je prefère un if
    if entree = 0 then
    Sortie <= '0';
    elsif entree = 15 then
    Sortie <= '1';
    elsif Entree < 16 then
    if count > Entree then Sortie <= '0';
    else Sortie <= '1';
    end if;
    count := count+1;
    else
    count := 0;
    sortie <= '0';
    end if;

    end if;
    end process;
    end Rapport_cyclique;
    cela devrait marcher.

Sur le même thème :

Discussions similaires

  1. PIC18f4550 Réaliser une PWM
    Par titoff dans le forum Électronique
    Réponses: 3
    Dernier message: 12/03/2008, 10h53
  2. Une petite question à propos du VHDL
    Par l'apprentis dans le forum Électronique
    Réponses: 5
    Dernier message: 07/02/2008, 17h04
  3. comment realiser une CN
    Par ABN84 dans le forum Technologies
    Réponses: 4
    Dernier message: 28/08/2006, 22h23
  4. Créer une impulsion en VHDL....
    Par synapsium dans le forum Électronique
    Réponses: 0
    Dernier message: 03/06/2006, 16h21
  5. Réaliser une lévitation?
    Par Black_Hole dans le forum Physique
    Réponses: 22
    Dernier message: 22/07/2005, 18h38