Accueil > Electronique > FPGA > PWM pour FPGA

PWM pour FPGA

samedi 2 juin 2007, par Steve

Introduction

La description qui suit permet de gérer une ou plusieurs PWM dans une FPGA. Elle est basée sur un compteur 16 bits, de deux ou plusieurs comparateurs et d’une ou plusieurs bascules RS.

Le compteur

Mon expérience m’a appris à me méfier des outils de synthèse. Toutefois, à ce jour, ils sont susceptibles de synthétiser un compteur performant.
Voici la description VHDL du compteur :

La bascule RS

La bascule RS est synchrone à une horloge. De plus, l’entrée de mise à zéro (R) est prioritaire.

Voici la description VHDL de la bascule :

Le comparateur

Le code du comparateur est extrêmement simple, jugez plutôt :

La PWM

Finalement, nous allons instancier toutes les descriptions nécessaires à l’obtention du bloc PWM.

Plusieurs PWMs

Si le besoin de plusieurs PWMs existe, il est possible de mutualiser le compteur ainsi que le comparateur à zéro. De ce fait, chaque PWM supplémentaire nécessite qu’un comparateur et qu’une bascule RS.

Remarque

L’utilisation d’un comparateur avec une sortie « plus petit que » se comporte de la même manière. Toutefois, il nécessite plus de logique que l’opérateur « égale ». De ce fait, la description que je propose permet une fréquence de travail plus élevée. De plus, la synthèse de l’opérateur « égale » est optimale sur tous les synthétiseurs que j’ai pu essayer ce qui n’est pas le cas de l’opérateur « plus petit que ».

Conclusion

J’ai synthétisé la description sous plusieurs outils et pour plusieurs cibles.

Version Outil de synthèse Cible Période minimum Niveau logique
pwm ISE 7.1 XC2S300E-7PQ208 8,049 ns 3
fourpwm ISE 7.1 XC2S300E-7PQ208 8,670 ns 3
pwm ISE 7.1 XC3S500E-4PQ208 8,180 ns 5
fourpwm ISE 7.1 XC3S500E-4PQ208 11,313 ns 5
pwm Libero 7.1 A54SX32A-F PQ208 12,155 ns  ?
fourpwm Libero 7.1 A54SX32A-F PQ208 12,155 ns  ?
pwm ispLEVER 7.0 LFXP3C-3P208C 6,107 ns 8
fourpwm ispLEVER 7.0 LFXP3C-3P208C 7,375 ns 8

Attention : Ces résultats ne sont donnés qu’à titre indicatif. En effet, il n’y a pas de contraintes sur l’affectation des broches.

Messages

  • Trés très belle description, bravo !
    ce n’est pas un reproche, mais personellement je préfère pour l’instanciation des composants utiliser => car les
    2 cas sont valables en VHDL.
    Pour ma part j’ai réalisé de nombreux compteurs décompteurs
    avec affichage multiplexé et une horloge 24H avec 4 digits.
    Si cela vous interesse je peux vous envoyer les codes en pdf.
    Pour ma part j’utilise iseWeb pack 10.1 de xilinx avec
    le starter kit coolrunnerII "cpld XC 2C 256-7TQ144 et en
    FPGA nexys2 "spartan xc 3s 500E"
    si vous avez d’autres réalisations ça m’interesse !
    très cordialement et merci pour vos descriptions.

    • Alain, je vous remercie pour votre message. Je ne passe pas souvent ici ces derniers temps parce que je suis très pris par mes enfants et mon emploi. Mais si ce genre de description vous intéresse, je vais essayer de faire un effort pour en publier quelques autres.

    • salut alain ,SVP j’ai besoin de vos codes VHDL pour l’affichage multiplixé car moi aussi je travaille avec la NEYXS2 et j’arrive pas à multiplixé l’affichage des 4 afficheurs à 7 segments
      voici mon email : bensalem.hachem@gmail.com
      et merci.

  • salut svp j’ai pas compris le role d’entrée d est ce que pr commande la valeur d alpha ou koi qlq’un m’explique merci d’abord !!!??

  • tu pourrais expliciter pourquoi tu as choisis ces composants un counter, un comparateur et une bascule rs ?

  • hello
    je voudrais plus d’explication sur le choix des composants

    cordialement

  • le code ne marche pas j’ai essayé un test bench et j’ai absolument rien en output. Voici le code, peut etre quelque chose est faux.
    LIBRARY ieee ;
    USE ieee.std_logic_1164.ALL ;

    — Uncomment the following library declaration if using
    — arithmetic functions with Signed or Unsigned values
    — USE ieee.numeric_std.ALL ;

    ENTITY pwm3_Tb IS
    END pwm3_Tb ;

    ARCHITECTURE behavior OF pwm3_Tb IS

    — Component Declaration for the Unit Under Test (UUT)

    COMPONENT pwm3
    PORT(
    clr : IN std_logic ;
    clk : IN std_logic ;
    d : IN std_logic_vector(15 downto 0) ;
    q : OUT std_logic
    ) ;
    END COMPONENT ;

    —Inputs
    signal clr : std_logic := ’0’ ;
    signal clk : std_logic := ’0’ ;
    signal d : std_logic_vector(15 downto 0) := (others => ’0’) ;

    —Outputs
    signal q : std_logic ;

    — Clock period definitions
    constant clk_period : time := 10 ns ;

    BEGIN

    — Instantiate the Unit Under Test (UUT)
    uut : pwm3 PORT MAP (
    clr => clr,
    clk => clk,
    d => d,
    q => q
    ) ;

    data_in_process : process
    begin
    d<= "1111111111111111" ;
    wait for 20 ms ;
    d<= "0000000011111111" ;
    wait for 20 ms ;
    d<= "1111111100000000" ;
    wait for 20 ms ;
    d<= "0000000000000000" ;
    wait for 20 ms ;

    end process ;

    — Clock process definitions
    clock_process :process
    begin
    clk <= ’0’ ;
    wait for clk_period/2 ;
    clk <= ’1’ ;
    wait for clk_period/2 ;
    end process ;

    — Reset process
    reset_process : process
    begin
    clr<=’0’ ;
    wait for 3 ns ;
    clr<=’1’ ;
    wait for 3 ns ;
    clr<=’0’ ;
    wait ;
    end process ;

    END ;

Un message, un commentaire ?

modération a priori

Ce forum est modéré a priori : votre contribution n’apparaîtra qu’après avoir été validée par un administrateur du site.

Qui êtes-vous ?
Votre message
  • Pour créer des paragraphes, laissez simplement des lignes vides.