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

fpga



  1. #1
    shadow-man

    fpga


    ------

    bonjours a tous
    J'ai une problème pour programmer un FPGA.
    je programme un PWM avec rapport cyclique et fréquence variable mais jai un petit problème.

    library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use ieee.std_logic_unsigned.all;
    -- Uncomment the following library declaration if using
    -- arithmetic functions with Signed or Unsigned values
    use IEEE.NUMERIC_STD.ALL;

    -- Uncomment the following library declaration if instantiating
    -- any Xilinx primitives in this code.
    --library UNISIM;
    --use UNISIM.VComponents.all;

    entity PWM_fixe_top is
    Port ( clk_in : in STD_LOGIC;
    clk_out : out STD_LOGIC
    );
    end PWM_fixe_top;

    architecture Behavioral of PWM_fixe_top is

    signal cmpt : std_logic_vector (23 downto 0) := X"000000";
    signal sortie : std_logic;
    signal freq : std_logic_vector (23 downto 0) :=X"0000FF"; --on peut faire varier la fréquence de 10Mhz a 3hz
    signal duty_cycle : std_logic_vector (23 downto 0) :=X"000040";


    begin

    process(clk_in)
    begin
    if(clk_in'event and clk_in ='1') then
    if (cmpt < duty_cycle) then
    sortie <= '1';
    else
    sortie <= '0';
    end if;
    if (cmpt < freq) then
    cmpt <= cmpt + 1;
    else
    cmpt <= X"000000";
    sortie <= not (sortie);
    end if;
    end if;
    clk_out <= sortie;
    end process;

    end Behavioral;

    mon but est d'éviter a l’utilisateur de calculer la valeur (en hexa) de duty_cycle lorsqu'il va changer la fréquence
    j'ai donc penser a sa

    duty_cycle_utilisateur : variable contennent la valeur du rapport cyclique de 0 à 100

    duty_cycle_utilisateur= duty_cycle*freq/100

    le problème c'est que je n'arriver pas a diviser se calculer par 100
    pouvez vous m'aider svp.

    -----

  2. Publicité
  3. #2
    jiherve

    Re : fpga

    Bonjour,
    il faut écrire :

    Code:
    entity PWM_fixe_top is
      Port 
       ( 
       freq : in unsigned(23 downto 0);
       duty_cycle_utilisateur : in unsigned(6 downto 0);
       reset : in std_logic;
       clk_in : in STD_LOGIC;
       clk_out : out STD_LOGIC
     );
    end PWM_fixe_top;
    
    architecture rtl of PWM_fixe_top is
    
     signal cmpt : unsigned (23 downto 0);
     signal duty_cycle :unsigned (23 downto 0);
     signal sortie : std_logic;
    
    
    begin
     clk_out <= sortie;-- une affectation asynchrone economise une bascule
     process(clk_in,reset)
      begin
       if reset = '1' then  -- toujours prevoir un reset 
         cmpt <= (others = '0'); -- cela permet de s'afranchir de la taille de cmpt
       elsif(clk_in'event and clk_in ='1') then
         if (cmpt >= duty_cycle) then
           sortie <= '0';
         end if;
         if (cmpt < freq) then
           cmpt <= cmpt + 1;
        else
          cmpt  <= (others => '0');
          sortie <= '1';-- affectation concurrente
          duty_cycle <= to_unsigned(to_integer(duty_cycle_utilisateur)*to_integer(freq)/100,24);-- attention cela induit la génération d'un vrai diviseur et d'un vrai multiplieur
        end if;
        
     end process;
    
    end rtl;
    si la fréquence est fixe on peut écrire:
    Code:
    entity PWM_fixe_top is
      generic
      (
        freq_in : integer range 0 to (2**24)-1
      );
      Port 
       ( 
       duty_cycle_utilisateur : in unsigned(6 downto 0);
       reset : in std_logic;
       clk_in : in STD_LOGIC;
       clk_out : out STD_LOGIC
     );
    end PWM_fixe_top;
    
    architecture rtl of PWM_fixe_top is
     constant freq     : unsigned(23 dowto 0) := to_unsigned(freq_in,24);
     constant coeff   : integer := freq_in/100;-- attention à la troncature
     signal cmpt : unsigned (23 downto 0);
     signal duty_cycle :unsigned (23 downto 0);
     signal sortie : std_logic;
    
    
    begin
     clk_out <= sortie;-- une affectation asynchrone économise une bascule
     process(clk_in,reset)
      begin
       if reset = '1' then  -- toujours prevoir un reset 
         cmpt <= (others = '0'); -- cela permet de s'afranchir de la taille de cmpt
       elsif(clk_in'event and clk_in ='1') then
         if (cmpt >= duty_cycle) then
           sortie <= '0';
         end if;
         if (cmpt < freq) then
           cmpt <= cmpt + 1;
        else
          cmpt  <= (others => '0');
          sortie <= '1';-- affectation concurrente
          duty_cycle <= to_unsigned(to_integer(duty_cycle_utilisateur)*coeff ,24);-- attention cela induit la génération d'un vrai multiplieur
        end if;
        
     end process;
    
    end rtl;
    Il vaudrait mieux choisir le duty cycle variable de 0 à 128 ce qui n'induirait que des décalages virtuels, dans les faits juste des connexions.

    JR
    l'électronique c'est pas du vaudou!

  4. #3
    shadow-man

    Re : fpga

    merci pour ta reponse
    malheureusement le programme ne marche pas dsl

    ERROR:HDLCompiler:69 - "C:\Users\qreynaud\Documents\x ilinx\teste2\top.vhd" Line 64: <cmpt> is not declared.
    ERROR:HDLCompiler:69 - "C:\Users\qreynaud\Documents\x ilinx\teste2\top.vhd" Line 60: <clk_in> is not declared.
    ERROR:HDLCompiler:989 - "C:\Users\qreynaud\Documents\x ilinx\teste2\top.vhd" Line 60: Attribute event requires a static signal prefix

    Et je ne comprend pas tout pourrait tu m'expliquer un peu?
    la ligne:
    duty_cycle <= to_unsigned(to_integer(duty_cy cle_utilisateur)*to_integer(fr eq)/100,24);
    ensuite pourquoi utiliser des unsigned ?

  5. #4
    shadow-man

    Re : fpga

    de plus c'est méthode marche mais a de inconvénient .
    on ne peut pas être très précis avec cette méthode donc si quelqu'un connaitrait une meilleur méthode pour faire un PWM a fréquence variable et a rapport cyclique variable et qui soit précise je suis preneur .

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    indri

    Re : fpga

    l'erreur de compil (si tu as copier-coller tel quel) il manque juste la déclaration correct du cmpt en std_logic_vector
    Pourquoi des unsigned? Pourquoi faudrait des signed?
    Sinon en quoi c'est imprécis son calcul?
    Là où va le vent...

  9. #6
    shadow-man

    Re : fpga

    le calcul est pas precis. par exemple dans mon application ma plage est de 400khz a 600khz mais je dois faire varier au grand maximun de 10hz en 10hz impossible de realiser ça.
    et pour info sa ne change rien de declarer cmpt rn std_logic_vector

  10. Publicité
  11. #7
    jiherve

    Re : fpga

    re,
    je n'avais pas testé la compilation, l'essentiel des problèmes venaient de l'overloading des librairies, les deux déclarées ici suffisent dans 99% des cas.

    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use IEEE.numeric_std.all;
    
    
    entity PWM_fixe_top is
      Port 
       ( 
       freq : in unsigned(23 downto 0);
       duty_cycle_utilisateur : in unsigned(6 downto 0);
       reset : in std_logic;
       clk_in : in STD_LOGIC;
       clk_out : out STD_LOGIC
     );
    end PWM_fixe_top;
    
    architecture rtl of PWM_fixe_top is
    
     signal cmpt : unsigned (23 downto 0);
     signal duty_cycle :unsigned (23 downto 0);
     signal sortie : std_logic;
    
    
    begin
     clk_out <= sortie;-- une affectation asynchrone economise une bascule
     process(clk_in,reset)
      begin
       if reset = '1' then  -- toujours prevoir un reset 
         cmpt <= (others => '0'); -- cela permet de s'afranchir de la taille de cmpt
       elsif(clk_in'event and clk_in ='1') then
         if (cmpt >= duty_cycle) then
           sortie <= '0';
         end if;
         if (cmpt < freq) then
           cmpt <= cmpt + 1;
         else
          cmpt  <= (others => '0');
          sortie <= '1';-- affectation concurrente
          duty_cycle <= to_unsigned(to_integer(duty_cycle_utilisateur)*to_integer(freq)/100,24);-- attention cela induit la génération d'un vrai diviseur et d'un vrai multiplieur
        end if;
      end if;
     end process;
    
    end rtl;
    çà cela compile

    Pourquoi les unsigned ben parce que c'est plus facile pour faire des calculs on peut rester en std_logic_vector mais cela sera plus verbeux!
    l'autre version

    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use IEEE.numeric_std.all;
    
    
    
    
    entity PWM_fixe_top is
      generic
      (
        freq_in : integer range 0 to (2**24)-1
      );
      Port 
       ( 
       duty_cycle_utilisateur : in unsigned(6 downto 0);
       reset : in std_logic;
       clk_in : in STD_LOGIC;
       clk_out : out STD_LOGIC
     );
    end PWM_fixe_top;
    
    architecture rtl of PWM_fixe_top is
     constant freq     : unsigned(23 downto 0) := to_unsigned(freq_in,24);
     constant coeff   : integer := freq_in/100;-- attention à la troncature
     signal cmpt : unsigned (23 downto 0);
     signal duty_cycle :unsigned (23 downto 0);
     signal sortie : std_logic;
    
    
    begin
     clk_out <= sortie;-- une affectation asynchrone économise une bascule
     process(clk_in,reset)
      begin
       if reset = '1' then  -- toujours prevoir un reset 
         cmpt <= (others => '0'); -- cela permet de s'afranchir de la taille de cmpt
       elsif(clk_in'event and clk_in ='1') then
         if (cmpt >= duty_cycle) then
           sortie <= '0';
         end if;
         if (cmpt < freq) then
           cmpt <= cmpt + 1;
        else
          cmpt  <= (others => '0');
          sortie <= '1';-- affectation concurrente
          duty_cycle <= to_unsigned(to_integer(duty_cycle_utilisateur)*coeff ,24);-- attention cela induit la génération d'un vrai multiplieur
        end if;
     end if; 
     end process;
    
    end rtl;
    JR
    l'électronique c'est pas du vaudou!

  12. #8
    jiherve

    Re : fpga

    Re
    pour obtenir de la précision il faut autre chose qu'un compteur , un intégrateur que l'on obtient avec un additionneur rebouclé, pour contrôler la fréquence on fait varier l’incrément, la dynamique de l’additionneur étant fixe.
    Je peux t’écrire un code mais cela serait mieux que tu réfléchisses un peu de ton coté.
    Quelle est la valeur de ta fréquence d'entrée?
    JR
    JR
    l'électronique c'est pas du vaudou!

  13. #9
    shadow-man

    Re : fpga

    merci beaucoup pour tous se code mais tu a raison je doit réfléchir par moi même.
    je n'ai rien comprit a ta technique d’intégrateur mais je vais chercher (" internet mon meilleur ami ") .
    que je t'explique un peu je doit être précis dans les haute fréquence (jusqu’à 1Mhz avec une erreur a moins de 3%)
    j'ai pas souvent programmer de FPGA donc j'ai chercher et j'ai trouver cette technique de compteur donc j'ai tester
    apres j'ai trouver mieux "la technique de comparer 2 signaux mais la c'est pas bon non plus car pour comparer des signaux il me faut un convertisseur numérique analogique donc pas assez rapide .
    et il y pas longtemps on ma dit de réaliser une table dans laquel j'aurais mit un code sur 24 bits et les valeur de ma fréquence et de mon rapport cyclique mais la pour l'instant c'est un peu le floue
    et enfin pour repondre a ta question ma fréquence est 50 Mhz normalement ou 100 Mhz sa depend de mon quartz que je met dessus.
    encore merci pour tout.

  14. #10
    shadow-man

    Re : fpga

    apret quelque rechercher j'ai modifier ta premier code pour que mon rapport cyclique s'adapte a la fréquence quesque vous en penser
    je ne sais pas encore comment faire le réglage de la fréquence mais je continue de chercher

    library ieee;
    use ieee.std_logic_1164.all;
    use IEEE.numeric_std.all;


    entity PWM_fixe_top is
    Port
    (
    reset : in std_logic;
    clk_in : in STD_LOGIC;
    clk_out : out STD_LOGIC
    );
    end PWM_fixe_top;

    architecture rtl of PWM_fixe_top is

    signal freq : unsigned (23 downto 0) := to_unsigned(202,24);
    signal cmpt : unsigned (23 downto 0);
    signal duty_cycle : unsigned (6 downto 0) := to_unsigned(50,7) ;
    signal duty_cycle1 : unsigned (23 downto 0) ;
    signal sortie : std_logic;


    begin
    duty_cycle1 <= to_integer (duty_cycle)*to_integer(freq)/to_unsigned(100,24);-- attention cela induit la génération d'un vrai diviseur et d'un vrai multiplieur
    process(clk_in,reset)
    begin
    if reset = '1' then -- toujours prevoir un reset
    cmpt <= (others => '0'); -- cela permet de s'afranchir de la taille de cmpt
    elsif(clk_in'event and clk_in ='1') then
    if (cmpt >= duty_cycle1) then
    sortie <= '0';
    else
    sortie <= '1';
    end if;
    if (cmpt < freq) then
    cmpt <= cmpt + 1;
    else
    cmpt <= (others => '0');
    sortie <= not(sortie);-- affectation concurrente
    end if;
    end if;
    end process;
    clk_out <= sortie;-- une affectation asynchrone economise une bascule
    end rtl;

  15. #11
    jiherve

    Re : fpga

    Bonjour,
    duty_cycle1 <= to_integer (duty_cycle)*to_integer(freq)/ to_unsigned(100,24);
    çà cela compile avec Modelsim et QII mais il vaux mieux écrire:
    duty_cycle1 <= to_unsigned(to_integer (duty_cycle)*to_integer(freq)/100,24);
    C'est plus correct le passage integer => unsigned n'est pas laissé au bon vouloir du compilateur.
    JR
    l'électronique c'est pas du vaudou!

  16. #12
    shadow-man

    Re : fpga

    ok merci une dernière question a chaque fois que je changer la valeur de ma fréquence ou de mon rapport cyclique je suis obliger de ré-compiler tout mon projet.
    est-il possible d’allouer une partie dynamique a ma fréquence et mon rapport cyclique

  17. Publicité
  18. #13
    jiherve

    Re : fpga

    Re,
    c'est ce que j'avais fait dans les codes envoyés.
    Mais comme déjà écrit comme il y a des calculs cela induira nécessairement l'instanciation d'unité de calculs.
    entre ta dernière version et ma première du #7 on passe de 36 logic elements à 641 LE dont 524 rien que pour le diviseur par 100 sur un Cyclone III!
    JR
    l'électronique c'est pas du vaudou!

  19. #14
    shadow-man

    Re : fpga

    Bonjour c'est encore moi.
    Je poursuit ma programmation et je voudrai afficher ma fréquence sur mes afficheur 7 segments (sur carte) et la faire varier chiffre par chiffre en sélectionnant chaque chiffre a l'aide de switch puis augmenter ou diminuer le chiffre grace a des bouton donc j'ai bientôt fini le code mais j'ai une erreur de synchronisation qui me bloque pourriez vous m'aidez ?
    encore une fois merci d'avance pour se qui prendront le temps de me répondre.

    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.STD_LOGIC_UNSIGNED.ALL;
    use IEEE.numeric_std.all;

    ENTITY countled IS
    PORT (
    b1 : in std_logic;
    b2 : in std_logic;
    sw : in std_logic_vector (3 downto 0);
    clk : IN STD_LOGIC;
    an : out std_logic_vector (3 downto 0);
    HEX : out std_logic_vector (6 downto 0)
    );
    END countled;


    ARCHITECTURE rtl OF countled IS

    signal enable : std_logic_vector (3 downto 0) := "1111";
    signal aff : std_logic_vector (6 downto 0) := "1000000";
    signal count : std_logic_vector (3 downto 0) := "0000";

    COMPONENT decodeur
    PORT(
    code_decodeur : IN std_logic_vector(3 downto 0);
    segment : OUT std_logic_vector(6 downto 0)
    );
    end component;

    begin

    Inst_decodeur: decodeur
    PORT MAP
    (
    code_decodeur => count ,
    segment => aff
    );

    PROCESS (clk,sw,b1,b2)
    BEGIN


    case sw is

    when "0001" =>
    if (clk'event and clk = '1')then
    enable <= "1110";
    if (b1 = '0' and b2 = '1' and count < "1010") then
    count <= count + 1;
    elsif (b1 = '1' and b2 = '0' and count > "0000") then
    count <= count - 1;
    end if;
    end if;

    when "0010" =>
    if (clk'event and clk = '1')then
    enable <= "1101";
    if (b1 = '0' and b2 = '1') then
    count <= count + 1;
    elsif (b1 = '1' and b2 = '0' and count > "0000") then
    count <= count - 1;
    end if;
    end if;


    --when "0100" =>
    -- if (clk'event and clk = '1')then
    -- enable <= "1011";
    -- if (b1 = '0' and b2 = '1') then
    -- count <= count + 1;
    -- elsif (b1 = '1' and b2 = '0') then
    -- count <= count - 1;
    -- end if;
    --end if;


    --when "1000" =>
    -- if (clk'event and clk = '1')then
    -- if (b1 = '0' and b2 = '1' and count < "1010") then
    -- count <= count + 1;
    -- enable <= "0111";
    -- end if;
    -- end if;


    when others =>
    enable <= "0000";

    end case;

    HEX <= aff;
    an <= enable;

    END PROCESS;
    END rtl;

    l'erreur est :
    line 59: Signal count cannot be synthesized, bad synchronous description. The description style you are using to describe a synchronous element (register, memory, etc.) is not supported in the current software release.

  20. #15
    indri

    Re : fpga

    Utilise la balise [ CODE ], c'est imbuvable sinon sans les alinéas

    Perso je ne metterais qu'un seul "if clk'event.." et ton "CASE" dedans, là c'est bizarre(d'après moi^^) (mais je peux pas affirmer que c'est ca l'erreur)

    Par contre tu ne détecte pas de flanc sur un bouton, donc des que tu appuis...tu incrémente/decremente au rythme de la clk (quelques megahertz?) tu va rien voir
    Là où va le vent...

  21. #16
    jiherve

    Re : fpga

    Bonjour,
    Indri à raison ,comme ce que tu veux décrire c'est un processus synchrone donc utilisant une ou des bascule et une horloge "normale" alors il faut sortir les if clk'event du case et ecrire :
    il clk'event.... then
    case chose truc
    end case
    end if;
    cela ira sans doute mieux.
    Ne jamais perdre de vue que le VHDL n'est pas un langage software il décrit des objets physique et ton code correspond à une bascule possédant un ersatz de multiplexeur sur son entrée d'horloge, le compilo dans sa grande sagesse refuse de se mouiller dans une telle hérésie.
    JR
    l'électronique c'est pas du vaudou!

  22. #17
    shadow-man

    Re : fpga

    ok merci pour le conseil de la balise
    pour se qui est de ne mettre un seul "clk'event ..." je l'ai fait cela revient au meme
    et je suivie ton conseil de faire une fréquence beaucoup plus basse que mes 50 Mhz
    avec une fréquence de 4 Hz cela fonctionne parfaitement merci du conseil. malheureusement je ne comprend pas pourquoi,
    puisque mon programme était fait sur le front montant de la fréquence d'horloge si quelqu'un pourrai m'expliquer
    merci d'avance

  23. #18
    shadow-man

    Re : fpga

    sinon j'ai encore une question (je suis chiant je sais)
    mon code si dessous marche mais lorsque je modifie un afficheur il me modifie tous les afficheur alors que moi je veut que chaque afficheur garde sa valeur.
    autrement dit j'ai pas envie que tous même afficheur est la même valeur.
    help svp
    Code:
    LIBRARY IEEE;
    USE IEEE.STD_LOGIC_1164.ALL;
    USE IEEE.STD_LOGIC_UNSIGNED.ALL;
    use IEEE.numeric_std.all;
    
    ENTITY countled IS
    PORT (
    b1 : in std_logic;
    b2 : in std_logic;
    sw : in std_logic_vector (3 downto 0);
    clk : IN STD_LOGIC;
    an : out std_logic_vector (3 downto 0);
    HEX : out std_logic_vector (7 downto 0)
    );
    END countled;
    
    
    ARCHITECTURE rtl OF countled IS
    
    signal enable : std_logic_vector (3 downto 0) ;
    signal aff : std_logic_vector (7 downto 0);
    signal count : unsigned (3 downto 0) := X"0";
    signal clk_4hz : std_logic;
    
    
    
    
    
    
    COMPONENT decodeur
    	PORT(
    		code_decodeur : IN unsigned(3 downto 0);          
    		segment : OUT std_logic_vector(7 downto 0)
    		);
    		end component;
    		
    COMPONENT div_freq
    	PORT(
    		clk : IN std_logic;          
    		clk_out : OUT std_logic
    		);
    	END COMPONENT;
    
    begin
    
    	Inst_decodeur: decodeur 
    		PORT MAP
    		(
    			code_decodeur => count ,
    			segment => aff
    		);
    	
    	Inst_div_freq: div_freq 
    		PORT MAP
    		(
    			clk => clk,
    			clk_out => clk_4hz
    		);
    		
    
    
    
    
    		
    PROCESS (clk,sw,b1,b2)
    BEGIN
    
    if (clk_4hz'event and clk_4hz = '1')then 
    	case sw is
    
    			when "0001" =>
    				enable <= "1110";
    					if (b1 = '0' and b2 = '1' and count < "1001") then 
    						count <= count + 1;
    					elsif (b1 = '1' and b2 = '0' and count > "0000") then 
    						count <= count - 1;
    					end if;
    						 
    			 when "0010" =>
    				 enable <= "1101";
    					if (b1 = '0' and b2 = '1' and count < "1001") then 
    						count <= count + 1;
    					elsif (b1 = '1' and b2 = '0' and count > "0000") then 
    						count <= count - 1;
    					end if;
    				
    				
    
    		
    			 when "0100" =>
    				enable <= "1011";
    					if (b1 = '0' and b2 = '1' and count < "1001") then 
    						count <= count + 1;
    					elsif (b1 = '1' and b2 = '0' and count > "0000") then 
    						count <= count - 1;
    					end if;
    								
    	 
    			 when "1000" =>  
    				enable <= "0111";
    					if (b1 = '0' and b2 = '1' and count < "1001") then 
    						count <= count + 1;
    					 elsif (b1 = '1' and b2 = '0' and count > "0000") then 
    						count <= count - 1;
    					end if;
    
    		
    
    			 when others =>
    					enable <= "0000";
    				
    	end case;
    end if;
    
    	HEX <= aff;
    	an <= enable;
    
    	
    	
    END PROCESS;
    END rtl;

  24. Publicité
  25. #19
    indri

    Re : fpga

    Citation Envoyé par shadow-man Voir le message
    o je suivie ton conseil de faire une fréquence beaucoup plus basse que mes 50 Mhz
    avec une fréquence de 4 Hz cela fonctionne parfaitement merci du conseil.
    C'est pas ce que j'ai dit...je dit de repérer le flanc du signal DU(des) BOUTON(s)

    Sinon pour l'autre question quand est-il du cablage des afficheurs? faut peut-êter prévoir un multiplexage?? Allumer chaque afficheur 1/4(ou autre) du temps suffisament rapidement comme l'on fait pour pour les afficheurs à plusieurs digits dont les segments(les pins) sont communs!
    Dernière modification par indri ; 28/04/2014 à 13h49.
    Là où va le vent...

  26. #20
    jiherve

    Re : fpga

    Bonjour,
    ben il faudrait que chacun des afficheur aie son propre compteur, ici il est partagé par tous les afficheurs.
    Il te faut donc déclarer un tableau de compteur et choisir le bon en fonction de la valeur de SW!
    JR
    l'électronique c'est pas du vaudou!

  27. #21
    shadow-man

    Re : fpga

    bonjour a tous
    je suis bloquer
    je voudrait afficher des chiffres différent sur chaque de mes 4 afficheur 7 segments pour sa je veux multiplexer mais impossible de faire un programme correcte.
    pourrier vous madez svp?

  28. #22
    jiherve

    Re : fpga

    bonjour,
    voila un truc qui devrait fonctionner

    Code:
           
    
            LIBRARY IEEE;
            USE IEEE.STD_LOGIC_1164.ALL;
            USE IEEE.STD_LOGIC_UNSIGNED.ALL;
            use IEEE.numeric_std.all;
    
            ENTITY countled IS
            PORT (
            reset : std_logic;
            b1 : in std_logic;
            b2 : in std_logic;
            sw : in std_logic_vector (3 downto 0);
            clk : IN STD_LOGIC;
            an : out std_logic_vector (3 downto 0);
            HEX : out std_logic_vector (7 downto 0)
            );
            END countled;
    
    
            ARCHITECTURE rtl OF countled IS
    
            signal enable : std_logic_vector (3 downto 0) ;
            signal aff : std_logic_vector (7 downto 0);
            type array_cpt  is array (0 to 3) of unsigned (3 downto 0);
            signal count : array_cpt ;
            signal scan_cpt : unsigned(9 downto 0);
            signal value :unsigned (3 downto 0);
            signal clk_4hz : std_logic;
    
    
    
    
    
    
            COMPONENT decodeur
            	PORT(
            		code_decodeur : IN unsigned(3 downto 0);          
            		segment : OUT std_logic_vector(7 downto 0)
            		);
            		end component;
            		
            COMPONENT div_freq
            	PORT(
            		clk : IN std_logic;          
            		clk_out : OUT std_logic
            		);
            	END COMPONENT;
    
            begin
    
            	Inst_decodeur: decodeur 
            		PORT MAP
            		(
            			code_decodeur => value ,
            			segment => aff
            		);
            	
            	Inst_div_freq: div_freq 
            		PORT MAP
            		(
            			clk => clk,
            			clk_out => clk_4hz
            		);
            		
    
    
    
    
            		
            PROCESS (clk,reset)
            BEGIN
            if reset  '1' then
             count <= (others => (others =>'0'));
             scan_cpt <=  (others =>'0');-- pour generer le scan des afficheurs
             value <=  (others =>'0');
            elsif (clk_4hz'event and clk_4hz = '1')then 
            	case sw is
    
            			when "0001" =>
            					if (b1 = '0' and b2 = '1' and count(0) < "1001") then 
            						count(0) <= count(0) + 1;
            					elsif (b1 = '1' and b2 = '0' and count(0) > "0000") then 
            						count(0) <= count(0) - 1;
            					end if;
            						 
            			 when "0010" =>
            					if (b1 = '0' and b2 = '1' and count(1) < "1001") then 
            						count(1) <= count(1) + 1;
            					elsif (b1 = '1' and b2 = '0' and count(1) > "0000") then 
            						count(1) <= count(1) - 1;
            					end if;
            				
            				
    
            		
            			 when "0100" =>
             					if (b1 = '0' and b2 = '1' and count(2) < "1001") then 
            						count(2) <= count(2) + 1;
            					elsif (b1 = '1' and b2 = '0' and count(2) > "0000") then 
            						count(2) <= count(2) - 1;
            					end if;
            								
            	 
            			 when "1000" =>  
            					if (b1 = '0' and b2 = '1' and count(3) < "1001") then 
            						count(3) <= count(3) + 1;
            					 elsif (b1 = '1' and b2 = '0' and count(3) > "0000") then 
            						count(3) <= count(3) - 1;
            					end if;
    
            		
    
            			 when others =>
            					null;
            				
            end case;
            -- gestion des afficheurs
            scan_cpt <= scan_cpt+1;
            case scan_cpt(9 downto 8) is
               when "00" =>
                   value <= count(0);
                   enable <= "1110";
               when "01" =>
                   value <= count(1);
                   enable <= "1101";
               when "10" =>
                   value <= count(2);
                   enable <= "1011";
               when others =>
                   value <= count(3);
                   enable <= "0111";
              end case;
    
            end if;
    
            	HEX <= aff;
            	an  <= enable;
    
            	
            	
            END PROCESS;
            END rtl;
    JR
    l'électronique c'est pas du vaudou!

  29. #23
    shadow-man

    Re : fpga

    salut a tous
    sur #8 jiherve tu me parlait du technique d’intégration avec additionneur rebouclé ,
    pourrai tu m'expliquer un peu car j'ai rien trouver sur internet qui y fessais référence
    merci d'avance

Sur le même sujet


Discussions similaires

  1. Fpga
    Par abdeldjabar dans le forum Électronique
    Réponses: 0
    Dernier message: 14/03/2010, 22h58
  2. Fpga
    Par cycyka dans le forum Électronique
    Réponses: 1
    Dernier message: 24/03/2009, 10h34
  3. FPGA et TNS
    Par bouly94 dans le forum Électronique
    Réponses: 2
    Dernier message: 14/05/2007, 15h56
  4. Fpga
    Par mmoctar dans le forum Électronique
    Réponses: 2
    Dernier message: 10/03/2007, 13h37
  5. FPGA
    Par gaupie dans le forum Électronique
    Réponses: 3
    Dernier message: 28/10/2003, 20h43
Découvrez nos comparatifs produits sur l'informatique et les technologies.