Ich arbeite an der Erstellung eines 4-Bit-Shift-and-Add-Multiplikators. Ich erhalte diese Warnmeldung - "WARNING:HDLParsers:3555 - "//filer1.egr.msu.edu/samarar1/ece230/Project05/Project05.vhd" Zeile 220. Warnung für Verletzung von LRM-Abschnitt 1.1.1.2 über Konnektivitätsregeln. Der Parameter P des Moduspuffers sollte keinem formellen Port des Modusausgangs zugeordnet werden."
Wie kann ich diese Warnung beheben? Hier ist mein Code:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity shiftlne is
generic(n:integer:= 4);
port (R :in STD_LOGIC_VECTOR(n-1 downto 0);
L,E,w :in STD_LOGIC;
Clock :in STD_LOGIC;
Q :buffer STD_LOGIC_VECTOR(n-1 downto 0));
end shiftlne;
architecture Behavioral of shiftlne is
begin
process
begin
wait until Clock'Event and Clock = '1';
if L = '1' then
Q <= R;
elsif E = '1' then
Q(0) <= w;
Genbits: for i in 1 to n-1 loop
Q(i) <= Q(i-1);
End loop;
End if;
End process;
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity shiftrne is
generic(n:integer:= 4);
port(R :in STD_LOGIC_VECTOR(n-1 downto 0);
L,E,w:in STD_LOGIC;
Clock:in STD_LOGIC;
Q :buffer STD_LOGIC_VECTOR(n-1 downto 0));
end shiftrne;
architecture Behavioral of shiftrne is
begin
process
begin
wait until Clock'Event and Clock = '1';
if E = '1' then
if L = '1' then
Q <= R;
else
Genbits: for i in 0 to n-2 loop
Q(i) <= Q(i+1);
end loop;
Q(n-1) <= w;
end if;
end if;
end process;
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity mux2to1 is
port (w0,w1,s :in STD_LOGIC;
f :out STD_LOGIC);
end mux2to1;
architecture Behavioral of mux2to1 is
begin
with s select
f <= w0 when '0',
w1 when others;
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity regne is
generic (n: integer:= 4);
port(R :in STD_LOGIC_VECTOR(n-1 downto 0);
Resetn :in STD_LOGIC;
E,Clock :in STD_LOGIC;
Q :out STD_LOGIC_VECTOR(n-1 downto 0));
end regne;
architecture Behavioral of regne is
begin
process(Resetn,Clock)
begin
if Resetn = '0' then
Q <= (others => '0');
elsif Clock'event and Clock = '1' then
if E = '1' then
Q <= R;
end if;
end if;
end process;
end Behavioral;
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity Multiplier is
generic (n:integer:=4; nn:integer:=8);
port (Clock :in std_logic;
Resetn :in std_logic;
LA,LB,s :in std_logic;
DataA :in std_logic_vector(n-1 downto 0);
DataB :in std_logic_vector(n-1 downto 0);
P :buffer std_logic_vector(nn-1 downto 0);
Done :out std_logic);
end Multiplier;
architecture Behavioral of Multiplier is
type state_type is (s1,s2,s3);
signal y: state_type;
signal Psel,z,EA,EB,EP,Zero: std_logic;
signal B,n_Zeros: std_logic_vector(n-1 downto 0);
signal A,Ain,DataP,Sum: std_logic_vector(nn-1 downto 0);
component mux2to1
port(w0,w1 :in STD_LOGIC;
s :in STD_LOGIC;
f :out STD_LOGIC);
end component;
component regne
generic(n:integer:= 4);
port(R :in STD_LOGIC_VECTOR(n-1 downto 0);
Resetn :in STD_LOGIC;
E,Clock :in STD_LOGIC;
Q :out STD_LOGIC_VECTOR(n-1 downto 0));
end component;
component shiftlne
generic(n:integer:= 4);
port (R :in STD_LOGIC_VECTOR(n-1 downto 0);
L,E,w :in STD_LOGIC;
Clock :in STD_LOGIC;
Q :buffer STD_LOGIC_VECTOR(n-1 downto 0));
end component;
component shiftrne
generic(n:integer:= 4);
port (R :in STD_LOGIC_VECTOR(n-1 downto 0);
L,E,w :in STD_LOGIC;
Clock :in STD_LOGIC;
Q :buffer STD_LOGIC_VECTOR(n-1 downto 0));
end component;
begin
FSM_transitions: process(Resetn,Clock)
begin
if Resetn = '0' then
y<=s1;
elsif (Clock'event and Clock = '1') then
case y is
when s1=>
if s = '0' then y <= s1; else y <= s2;
end if;
when s2=>
if z = '0' then y <= s2; else y <= s3;
end if;
when s3 =>
if s = '1' then y <= s3; else y <= s1;
end if;
end case;
end if;
end process;
FSM_outputs: process(y,s,B(0))
begin
EP <= '0'; EA <= '0'; EB <= '0'; Done <= '0'; Psel <= '0';
case y is
when s1 =>
EP <= '1';
when s2 =>
EA <= '1'; EB <= '1'; Psel <= '1';
if B(0) = '1' then EP <= '1'; else EP <= '0';
end if;
when s3 =>
Done <= '1';
end case;
end process;
Zero <= '0';
n_Zeros <= (others => '0');
Ain <= n_Zeros & DataA;
ShiftA:shiftlne generic map (n=>nn)
port map(Ain,LA,EA,Zero,Clock,A);
ShiftB:shiftrne generic map (n=>n)
port map(DataB,LB,EB,Zero,Clock,B);
z <= '1' when B = n_Zeros else '0';
Sum <= A + P;
GenMUX: for i in 0 to nn-1 generate
Muxi: mux2to1 port map (Zero,Sum(i),Psel,DataP(i));
end generate;
RegP:regne generic map (n=>nn)
port map (DataP,Resetn,EP,Clock,P);
end Behavioral;
Ich denke, hier läuft es schief:
RegP:regne generic map (n=>nn) port map (DataP,Resetn,EP,Clock,P);
Der Port, von dem P kommt, ist ein Ausgang, aber P ist ein Puffer.
Ich habe empfohlen, genau aus diesem Grund niemals 'buffer' zu verwenden. Verwenden Sie eine lokale Variable zum Lesen und Schreiben und weisen Sie diese einem Ausgang zu. Ich verwende in meinem Design die Konvention, _buf zu dieser Art von lokalen Signalen hinzuzufügen: Ausgangsport ist Q, lokales Signal ist Q_buf, Q <= Q_buf.
Zum Beispiel: Sie haben ein großes, fast funktionierendes Design. Aus irgendeinem Grund stellen Sie fest, dass Sie ein Ausgangssignal haben, das Sie zurücklesen müssen. Damit ändern Sie den Port auf 'buffer' und .... Ihr VHDL-System fällt auseinander! Jetzt möchte es, dass Sie ALLE Ports in der Hierarchie aller Module ändern, an denen dieses Signal vom Ausgang zum Puffer durchgeht.
Höchstwahrscheinlich liegt Ihr Problem hier:
RegP:regne Generic Map (n=>nn) Port Map (DataP,Resetn,EP,Clock,P); — <—- hier
Q :out STD_LOGIC_VECTOR(n-1 downto 0));
wo Sie versuchen , einem Puffer einen Ausgabeport zuzuweisen . Buffer müssen ihre Werte intern zugewiesen bekommen und können normalerweise keine Verbindung zu out
.
Mein Rat ist, die Verwendung von Puffern zu minimieren. Sie führen oft zu Problemen, insbesondere bei der Synthese.
Blair Fonville
Alter Furz