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.
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 ...)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;
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.
-----