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
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. –
res <= Rout; Wo Rout ist nur ein Register mit dem Ergebnis. Ich fügte auch die Datenwegimplementierung –
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. –