[Programmation] Code VHDL pour un MUX N:1 à base de MUX élémentaire 2:1
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Code VHDL pour un MUX N:1 à base de MUX élémentaire 2:1



  1. #1
    Matlabo

    Question Code VHDL pour un MUX N:1 à base de MUX élémentaire 2:1


    ------

    Bonjour,
    Alors j'essaie d'écrire du code VHDL pour implémenter un MUX N:1 avec des MUX 2:1
    Au début j'avais utilisé un process mais le compilateur m'a vite fait remarquer qu'entre port map et process c'est pas la joie.

    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;        
    use ieee.numeric_std.all;            
    
    
    
    entity MUX8_1 is
    	generic (
    			N : integer := 8;  -- N vers 1
    			C : integer := 3   -- Signaux de contrôle
    		);
    	port (
    		E : IN std_logic_vector(N-1 downto 0);
    		CTRL : IN std_logic_vector(C-1 downto 0);
    		S : OUT std_logic
    	);
    end MUX8_1;
    
    
    
    
    architecture MUX8_1_arc of MUX8_1 is
    --generic map (
    --		   N => 8,
    --		   C => 3
    --	)
    
    component MUX2_1 is
    	port (
    		E :  IN std_logic_vector (1 downto 0);
    		SLCT : IN std_logic; --avec 1 downto 0, la conversion
    		S : OUT std_logic     					-- ne peut se faire
    	);
    end component;
    
    begin
    process(E, CTRL)
    	variable L : integer := N;
    	variable a : integer := 0;
    	variable E1 : std_logic_vector(N-1 downto 0);
    	variable T1 : std_logic_vector(N-1 downto 0) := E;
    	variable T : std_logic;
    begin
    	Controle : for j in 0 to C-1 generate
    		L := L/2;
    		a := 0;
    
    		E1 := T1;
    		T1 := (others => '0');
    
    		Entree : for i in 0 to 2*L-1 generate
    			if (a mod 2 = 0) then
    				MUX : entity work.MUX2_1 port map(E1(2*L-1-i downto 2*L-2-i), CTRL(j), T);
    				T1 := T1&T;
    			end if;
    			a := a + 1;
    		end generate;
    
    	end generate;
    end process;
    
    
    end MUX8_1_arc;
    D'ailleurs pourquoi on ne peut pas mettre un port map dans un process ? (J'ai lu que c'était parce que port map est une instruction concurrente et du coup ça ne le faisait pas trop avec la séquentialité d'un process ...)

    Puis j'ai fais un truc assez grossier, enlever le process ...

    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;        
    use ieee.numeric_std.all;            
    
    
    
    entity MUX8_1 is
    	generic (
    			N : integer := 8;  -- N vers 1
    			C : integer := 3   -- Signaux de contrôle
    		);
    	port (
    		E : IN std_logic_vector(N-1 downto 0);
    		CTRL : IN std_logic_vector(C-1 downto 0);
    		S : OUT std_logic
    	);
    end MUX8_1;
    
    
    
    
    architecture MUX8_1_arc of MUX8_1 is
    --generic map (
    --		   N => 8,
    --		   C => 3
    --	)
    
    component MUX2_1 is
    	port (
    		E :  IN std_logic_vector (1 downto 0);
    		SLCT : IN std_logic; --avec 1 downto 0, la conversion
    		S : OUT std_logic     					-- ne peut se faire
    	);
    end component;
    
    
    	signal L : integer := N;
    	signal a : integer := 0;
    	signal E1 : std_logic_vector(N-1 downto 0);
    	signal T1 : std_logic_vector(N-1 downto 0) := E;
    	signal T : std_logic;
    begin
    	Controle : for j in 0 to C-1 generate
    		L <= L/2;
    		a <= 0;
    
    		E1 <= T1;
    		T1 <= (others => '0');
    
    		Entree : for i in 0 to 2*L-1 generate
    			if (a mod 2 = 0) then
    				MUX : entity work.MUX2_1 port map(E1(2*L-1-i downto 2*L-2-i), CTRL(j), T);
    				T1 <= T1&T;
    			end if;
    			a <= a + 1;
    		end generate;
    
    	end generate;
    
    
    end MUX8_1_arc;

    J'ai reçu deux erreurs + quelques warnings
    Les erreurs:
    ** Error: C:\Users\loune\OneDrive\Bureau \EE\S2\MSCL\Devoir Maison 1\Ex1_N.vhd(53): illegal concurrent statement.
    ** Error: C:\Users\loune\OneDrive\Bureau \EE\S2\MSCL\Devoir Maison 1\Ex1_N.vhd(54): (vcom-1450) Actual (slice name) for formal "E" is not a static signal name.

    Les warnings:
    ** Warning: C:\Users\loune\OneDrive\Bureau \EE\S2\MSCL\Devoir Maison 1\Ex1_N.vhd(51): (vcom-1147) Range in parameter specification of FOR GENERATE must be static.
    ** Warning: C:\Users\loune\OneDrive\Bureau \EE\S2\MSCL\Devoir Maison 1\Ex1_N.vhd(41): (vcom-1013) Initial value of "T1" depends on value of signal "E".
    ** Warning: C:\Users\loune\OneDrive\Bureau \EE\S2\MSCL\Devoir Maison 1\Ex1_N.vhd(38): Nonresolved signal 'L' may have multiple sources.
    Drivers:
    C:\Users\loune\OneDrive\Bureau \EE\S2\MSCL\Devoir Maison 1\Ex1_N.vhd(45):Conditional signal assignment line__45
    ** Warning: C:\Users\loune\OneDrive\Bureau \EE\S2\MSCL\Devoir Maison 1\Ex1_N.vhd(39): Nonresolved signal 'a' may have multiple sources.
    Drivers:
    C:\Users\loune\OneDrive\Bureau \EE\S2\MSCL\Devoir Maison 1\Ex1_N.vhd(57):Conditional signal assignment line__57
    C:\Users\loune\OneDrive\Bureau \EE\S2\MSCL\Devoir Maison 1\Ex1_N.vhd(46):Conditional signal assignment line__46

    Merci pour tout éclaircissement.

    -----
    Dernière modification par gienas ; 31/03/2023 à 21h57. Motif: Supprimé les balises spoiler

  2. #2
    jiherve

    Re : Code VHDL pour un MUX N:1 à base de MUX élémentaire 2:1

    bonsoir
    un "generate "ne peut être situé dans un "process"
    les bornes d'un "generate" doivent être statiques , en clair calculables à la compilation.
    donc il faut tout réécrire.
    n'utilises pas les balises spoiler mais les balise code (#).
    stp place le code de ton mux 2/1.
    procures toi le" VHDL GoldenReference guide" DOULOS, c'est la bible.
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    Matlabo

    Re : Code VHDL pour un MUX N:1 à base de MUX élémentaire 2:1

    Je sèche un peu ... Une indication sur le raisonnement de la l'algorithme ?

    PS: Merci pour le livre
    Dernière modification par Matlabo ; 31/03/2023 à 21h41.

  4. #4
    Matlabo

    Re : Code VHDL pour un MUX N:1 à base de MUX élémentaire 2:1

    Je viens de trouver la solution, je la laisse ici au cas ou:
    https://embdev.net/topic/552837#7384287

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

    Re : Code VHDL pour un MUX N:1 à base de MUX élémentaire 2:1

    bonsoir,
    bien plus court :
    Code:
    library ieee;
    use ieee.std_logic_1164.all;
    use ieee.std_logic_unsigned.all;        
    use ieee.numeric_std.all;            
    
    
    
    entity MUX8_1 is
    	generic (
    			N : integer := 8;  -- N vers 1
    			C : integer := 3   -- Signaux de contrôle
    		);
    	port 	(
    			E : IN std_logic_vector(N-1 downto 0);
    			CTRL : IN std_logic_vector(C-1 downto 0);
    			S : OUT std_logic
    		);
    end MUX8_1;
    
    
    
    
    architecture MUX8_1_arc of MUX8_1 is
    
    component MUX2_1 is
    	port (
    		E :  IN std_logic_vector (1 downto 0);
    		SLCT : IN std_logic; 
    		S : OUT std_logic     					
    	);
    end component;
    subtype buf is std_logic_vector (N-1 downto 0);
    type abuf is array (0 to C) of buf;
    signal S0 :abuf;
    begin
    	assert (N = 2**C)
    	report "parametres incorrects" severity failure;
    
     	S0(0) <= E;
     	controle0 : for i in 0 to C-1 generate
     		Controle1: for j in 0 to N/(2**(i+1)) -1 generate
        			MUX0: entity work.MUX2_1 port map(S0(i)(2*j+1 downto 2*j), CTRL(i), S0(i+1)(j));
     		end generate Controle1;
     	end generate Controle0;
     
     S <= S0(C)(0);
    
    end MUX8_1_arc;
    avec vérification des paramètres.
    tous les bits de S0 ne sont pas assignés mais le placeur routeur fera le ménage.
    JR
    l'électronique c'est pas du vaudou!

Discussions similaires

  1. [Programmation] Aide pour Code VHDL
    Par MER6SME dans le forum Électronique
    Réponses: 10
    Dernier message: 03/01/2018, 23h09
  2. code VHDL pour FIFO asynchrone
    Par invite6321e7d4 dans le forum Électronique
    Réponses: 2
    Dernier message: 15/03/2012, 20h35
  3. Code VHDL pour conversion d'un entier en binaire
    Par invitea9f621f9 dans le forum Électronique
    Réponses: 1
    Dernier message: 25/04/2010, 14h56
  4. Code VHDL pour conversion du décimal au binaire
    Par invitea9f621f9 dans le forum Électronique
    Réponses: 0
    Dernier message: 25/04/2010, 14h03
  5. Code VHDL pour un SPI
    Par invite003b36af dans le forum Électronique
    Réponses: 4
    Dernier message: 08/04/2006, 22h09
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...