2016-11-18 2 views
0

Ich dachte, ich habe diese Mapping-Sache herausgefunden, aber es scheint, ich nicht ... Also, ich habe den Code unten hat Top-Entity (Circuito), die Kontrolle und Datenpfad Entitäten hat Innerhalb. Wenn ich das Projekt synthetisiere, gibt es eine Reihe von Warnungen (0 Fehler), die grundsätzlich sagen, dass alle Ports im Datenpfad (Eingang und Ausgang) nicht verbunden sind ("[Synth 8-3331] Design-Datenpfad hat nicht verbundenen Port res [31]" und so weiter für alle Ports) und tatsächlich verbindet es nicht die Ports im Design und löscht sogar die Datenpfad-Entität, wobei die Kontrolleinheit in der Schaltung verbleibt (also kein Problem mit der Kontrolle). Die Reset- und CLK-Ports sind für beide Entitäten identisch, aber sie ordnen diesen Port nicht dem Datenpfad zu, nur um ihn zu steuern. Hilf mir, Leute, was ist los? Sag mir, wenn du mehr Code brauchst.Port Mapping funktioniert nur in einigen Entitäten

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
USE ieee.numeric_std.ALL; 

entity circuito is 
    port (
    clk, reset: in std_logic; 
    x, c0, c1, c2, c3, c4, c5, c6, c7 : in signed(6 downto 0); 
    res : out signed(31 downto 0); 
    done : out std_logic 
    ); 
end circuito; 

architecture Behavioral of circuito is 
    component control 
    port(
    clk, reset, done : in std_logic; 
    e_in : out std_logic; 
    e_out : out std_logic; 
    e_inter : out std_logic_vector (4 downto 0); 
     mux_sel1, mux_sel2, mux_sel3, mux_sel5, mux_sel6 : out std_logic_vector (1 downto 0); 
    mux_sel4, mux_sel7 : out std_logic); 
    end component; 
    component datapath 
    port(
     x, c0, c1, c2, c3, c4, c5, c6, c7 : in signed(6 downto 0); 
       clk, reset : in std_logic; 
       e_in : in std_logic; 
       e_out : in std_logic; 
       e_inter : in std_logic_vector (4 downto 0); 
       mux_sel1, mux_sel2, mux_sel3, mux_sel5, mux_sel6 : in std_logic_vector (1 downto 0); 
       mux_sel4, mux_sel7 : in std_logic; 
       res : out signed (31 downto 0); 
       done : out std_logic); 
    end component; 

    signal e_in : std_logic; 
    signal e_inter : std_logic_vector(4 downto 0); 
    signal finish, e_out : std_logic; 
    signal mux_sel1, mux_sel2, mux_sel3, mux_sel5, mux_sel6 : std_logic_vector (1 downto 0); 
    signal mux_sel4, mux_sel7 : std_logic; 

begin 

inst_datapath: datapath port map(
    clk => clk, 
    reset => reset, 
    done => finish, 
    e_in => e_in, 
    e_out => e_out, 
    e_inter => e_inter, 
    mux_sel1 => mux_sel1, 
    mux_sel2 => mux_sel2, 
    mux_sel3 => mux_sel3, 
    mux_sel4 => mux_sel4, 
    mux_sel5 => mux_sel5, 
    mux_sel6 => mux_sel6, 
    mux_sel7 => mux_sel7, 
    res => res, 
    x => x, 
    c0 => c0, 
    c1 => c1, 
    c2 => c2, 
    c3 => c3, 
    c4 => c4, 
    c5 => c5, 
    c6 => c6, 
    c7 => c7 
    ); 
inst_control: control port map(
    clk => clk, 
    reset => reset, 
    done => finish, 
    e_in => e_in, 
    e_out => e_out, 
    e_inter => e_inter, 
    mux_sel1 => mux_sel1, 
    mux_sel2 => mux_sel2, 
    mux_sel3 => mux_sel3, 
    mux_sel4 => mux_sel4, 
    mux_sel5 => mux_sel5, 
    mux_sel6 => mux_sel6, 
    mux_sel7 => mux_sel7 
    );  

end Behavioral; 

Wo Datenweg Komponente mit implementiert:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
USE ieee.numeric_std.ALL; 


--Datapath entity 
entity datapath is 
    port (x, c0, c1, c2, c3, c4, c5, c6, c7 : in signed(6 downto 0); 
      clk, reset : in std_logic; 
      e_in : in std_logic; 
      e_out : in std_logic; 
      e_inter : in std_logic_vector (4 downto 0); 
      mux_sel1, mux_sel2, mux_sel3, mux_sel5, mux_sel6 : in std_logic_vector (1 downto 0); 
      mux_sel4, mux_sel7 : in std_logic; 
      res : out signed (31 downto 0); 
      done : out std_logic  
      ); 
end datapath; 

architecture Behavioral of datapath is 
    signal Rx, Rc0, Rc1, Rc2, Rc3, Rc4, Rc5, Rc6, Rc7 : signed(6 downto 0) := (others => '0'); 
    signal Rout : signed(31 downto 0) := (others => '0'); 
    signal R1, R2, R3, R4, Rx2 : signed(31 downto 0) := (others => '0'); 
    signal add1, add2, mul1, mul2 : signed(31 downto 0) := (others => '0'); 
    signal mux1, mux2, mux3, mux4, mux5, mux6, mux7 : signed(31 downto 0) := (others => '0'); 

begin 
--"Fixed" Input Registers: 

--Register Rc0 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       Rc0 <= "0000000"; 
      elsif e_in = '1'then 
       Rc0 <= c0; 
      end if; 
     end if; 
    end process; 

--Register Rc1 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       Rc1 <= "0000000"; 
      elsif e_in = '1'then 
       Rc1 <= c1; 
      end if; 
     end if; 
    end process; 

--Register Rc2 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       Rc2 <= "0000000"; 
      elsif e_in = '1'then 
       Rc2 <= c2; 
      end if; 
     end if; 
    end process; 

--Register Rc3 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       Rc3 <= "0000000"; 
      elsif e_in = '1'then 
       Rc3 <= c3; 
      end if; 
     end if; 
    end process; 

--Register Rc4 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       Rc4 <= "0000000"; 
      elsif e_in = '1'then 
       Rc4 <= c4; 
      end if; 
     end if; 
    end process; 

--Register Rc5 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       Rc5 <= "0000000"; 
      elsif e_in = '1'then 
       Rc5 <= c5; 
      end if; 
     end if; 
    end process; 

--Register Rc6 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       Rc6 <= "0000000"; 
      elsif e_in = '1'then 
       Rc6 <= c6; 
      end if; 
     end if; 
    end process; 

--Register Rc7 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       Rc7 <= "0000000"; 
      elsif e_in = '1'then 
       Rc7 <= c7; 
      end if; 
     end if; 
    end process; 

--Register Rx 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       Rx <= "0000000"; 
      elsif e_in = '1'then 
       Rx <= x; 
      end if; 
     end if; 
    end process; 

--Intermediate Registers: 

    --Register R1 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       R1 <= X"00000000"; 
      elsif e_inter(0) = '1'then 
       R1 <= mul1; 
      end if; 
     end if; 
    end process; 

    --Register R2 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       R2 <= X"00000000"; 
      elsif e_inter(1) = '1'then 
       R2 <= mul2; 
      end if; 
     end if; 
    end process; 

    --Register R3 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       R3 <= X"00000000"; 
      elsif e_inter(2) = '1'then 
       R3 <= add1; 
      end if; 
     end if; 
    end process; 

    --Register R4 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       R4 <= X"00000000"; 
      elsif e_inter(3) = '1'then 
       R4 <= add2; 
      end if; 
     end if; 
    end process; 

    --Register Rx2 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       Rx2 <= X"00000000"; 
      elsif e_inter(4) = '1'then 
       Rx2 <= mul1; 
      end if; 
     end if; 
    end process; 

    --Multiplexer1 
    mux1 <= resize(Rc7, mux1'length) when mux_sel1 = B"00" else 
      resize(Rx, mux1'length) when mux_sel1 = B"01" else 
      resize(R3, mux1'length) when mux_sel1 = B"10" else 
      resize(Rx2, mux1'length) ; 

    --Multiplexer2 
    mux2 <= resize(Rx, mux2'length) when mux_sel2 = B"00" else 
      resize(Rx2, mux2'length) when mux_sel2 = B"01" else 
      resize(R1, mux2'length) ; 

    --Multiplexer3 
    mux3 <= resize(Rc7, mux3'length) when mux_sel3 = B"00" else 
      resize(Rc3, mux3'length) when mux_sel3 = B"01" else 
      resize(Rc1, mux3'length) when mux_sel3 = B"10" else 
      resize(R3, mux3'length) ; 

    --Multiplexer4 
    mux4 <= resize(Rx, mux4'length) when mux_sel4 = '0' else 
      resize(Rx2, mux4'length) when mux_sel4 = '1'; 

    --Multiplexer5 
    mux5 <= resize(R1, mux5'length) when mux_sel5 = B"00" else 
      resize(Rc2, mux5'length) when mux_sel5 = B"01" else 
      resize(R4, mux5'length) when mux_sel5 = B"10" else 
      resize(R3, mux5'length) ; 

    --Multiplexer6 
    mux6 <= resize(Rc6, mux6'length) when mux_sel6 = B"00" else 
      resize(R2, mux6'length) when mux_sel6 = B"01" else 
      resize(Rx2, mux6'length); 

    --Multiplexer7 
    mux7 <= resize(Rc4, mux7'length) when mux_sel7 = '0' else 
      resize(Rc0, mux7'length) when mux_sel7 = '1'; 


    --Adder1 
    add1 <= resize(mux5 + mux6, add1'length) ; 

    --Adder2 
    add2 <= resize(R2 + mux7, add1'length) ; 

    --Multiplier1 
    mul1 <= resize(mux1 * mux2, mul1'length) ; 

    --Multiplier1 
    mul2 <= resize(mux3 * mux4, mul2'length) ; 


    --"Fixed" Output Register: 

    --Register Rout 
    process (clk, reset) 
    begin 
     if clk'event and clk = '1'then 
      if reset = '1' then 
       Rout <= X"00000000"; 
      elsif (e_out = '1') then 
       Rout <= R3; 
       done <= '1'; 
      end if; 
     end if; 
    end process; 

    res <= Rout; 

end Behavioral; 

EDIT: einige Änderungen vorgenommen, keine Ahnung, was funktioniert, aber jetzt nur c5 Port nicht verbunden, sowohl in circuito und Datenweg

+0

Wie wird 'res' in' component datapath' getrieben? Der Fehler bedeutet, dass Sie innerhalb dieser Entität nichts auf res bringen, nicht dass dieser Port in der übergeordneten Entität nicht verbunden ist. –

+0

res <= Rout; Wo Rout ist nur ein Register mit dem Ergebnis. Ich fügte auch die Datenwegimplementierung –

+0

hinzu Ich würde die Warnungen durchlaufen, die vom Synthesewerkzeug produziert werden, und stellen sicher, dass der Code nicht weg optimiert wird. Berücksichtigen Sie anhand des gerade hinzugefügten zusätzlichen Codes, wie "e_inter" in "control" gesteuert wird. –

Antwort

0

haben aus die Kommentare, die Ausgabe e_inter von control ist immer nur Nullen. Im Anschluss daran durch zu Ihrem Fehler, das Signal res in datapath so zugeordnet:

if clk'event and clk = '1'then 
    if reset = '1' then 
     Rout <= X"00000000"; 
    elsif (e_out = '1') then 
     Rout <= R3; 
     done <= '1'; 
    end if; 
end if; 

...

res <= Rout; 

R3 wird so angetrieben:

if clk'event and clk = '1'then 
    if reset = '1' then 
     R3 <= X"00000000"; 
    elsif e_inter(2) = '1'then 
     R3 <= add1; 
    end if; 
end if; 

Aus diesen beiden Code-Snippets können wir sehen, dass, wenn e_inter(2) immer '0' ist, die einzige Zuweisung, die anvorgenommen werden kannsoll es auf alle Nullen zurücksetzen. Da dieser Port daher eine Konstante ist, werden die Tools ihn optimieren.

Die grundlegende Methode zur Diagnose dieser Art von Problem besteht darin, sich die Warnungen anzusehen. Es kann oft eine Menge nutzloser Warnungen geben, die diesen Vorgang langwierig machen, aber Sie sollten in der Lage sein, die Nachrichtenfilterung zu verwenden, um sie etwas auszudünnen und nützliche Nachrichten zu enthüllen. In diesem Fall hätte es Meldungen geben sollen, dass Logik und/oder Signale aufgrund von Konstantenvermehrung oder ähnlichem entfernt wurden.

+0

e_inter (2) ist auf '1' richtig und e_out auch auf '1' von Steuerelement-Komponente gesetzt wie beabsichtigt, verifizierte ich dies durch simulation –

+0

Aus den Kommentaren, "e_inter wird so gefahren:' e_inter <= B "00000"; "". Sie haben auch erwähnt, dass 'res' seit dem Vornehmen von Änderungen keine Warnung mehr generiert. Ich glaube, ich habe die ursprüngliche Fehlermeldung, die Sie gepostet haben, gelöst und Ihnen eine Technik zur Diagnose ähnlicher Probleme gegeben. –

+0

Ja, das stimmt, vielen Dank für Ihre Zeit, jetzt habe ich keine Konnektivitätsprobleme –

Verwandte Themen