2016-06-16 12 views
0

Dies ist der vhdl-Code. dieses keinen FehlerIch versuche, eine 8bit 4-1 Auswahlschaltung mit vhdl zu machen. Kann mir jemand helfen, was mit diesem Code nicht stimmt?

library IEEE; 
use IEEE.std_logic_1164.all; 

entity sel4_1 is 
    port(A, B, C, D : in std_logic; 
    SEL  : in std_logic_vector(1 downto 0); 
    outsgnl : out std_logic); 
    end sel4_1; 

architecture EX1 of sel4_1 is 
begin 

process(A, B, C, D, SEL) 
begin 
case SEL is 
    when "00" => outsgnl <= A; 
    when "01" => outsgnl <= B; 
    when "10" => outsgnl <= C; 
    when others => outsgnl <= D; 
end case; 
end process; 

end EX1; 

Dies hat, ist die Testbank, die den Fehler hat

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_unsigned.all; 

entity TESTBENCH is 
end TESTBENCH; 

architecture RTL of TESTBENCH is 

component sel4_1 

    port(A,B,C,D : in std_logic_vector(7 downto 0); 
     outsgnl : out std_logic); 

end component; 

signal INA, INB, INC, IND, OUTSGNL : std_logic_vector(7 downto 0); 
signal SEL : std_logic_vector(1 downto 0); 

begin 
    U0: sel4_1 port map(INA, INB, INC, IND, SEL, OUTSGNL); 
    process 
    begin 
    INA <= "11111111"; 
    INB <= "11110000"; 
    INC <= "00001111"; 
    IND <= "00000000"; 

    SEL <= "00"; wait for 10 ns; 
    SEL <= "01"; wait for 10 ns; 
    SEL <= "10"; wait for 10 ns; 
    SEL <= "11"; wait for 10 ns; 

    wait; 
    end process; 
end RTL; 

der Fehler, der herauskam ist testbench.vhdl: 19: 27: nicht assoziieren ' ina‘mit Signalschnittstelle "ina"

testbench.vhdl: 19: 27: (Art der 'ina' ist std_logic)

testbench.vhdl: 11: 9: (Art der Signalschnittstelle „ina“ ist ein Subtyp von std_logic_vector)

+0

Bei der Analyse (Compilierung) Testbench fehlt die Komponente Deklaration SEL und hat outsgnl als std_logic (nicht std_logic_vector (7 downto 0) deklariert. Sel4_1 doesn ' • Korrigieren Sie die Deklaration der Komponente entweder mit der Entität sel4_1 und verwenden Sie eine generate-Anweisung, um sie 8-mal zu instanziieren, oder bearbeiten Sie die Entität sel4_1, um ihre A-, B-, C-, D- und Outsignl-Ports std_logic_vector (7 bis 0) zu machen) (und die ersten vorgeschlagenen Änderungen an der Komponentendeklaration vornehmen.) Letzteres simuliert erfolgreich – user1155120

Antwort

0

Das Problem ist, dass Ihre Entität sel4_1 und die Komponente sel_4_1 ist nicht die gleiche. Ihre A-, B-, C-, D-Ports sind std_logic in der ersten, aber std_logic_vector(7 downto 0) in der zweiten.

Ändern Sie die Entität (oder Komponente) mit dem, was Sie wirklich benötigen, und es sollte ordnungsgemäß funktionieren.

+0

Zusätzlich zu den Ports A, B, C und D von sel4_1 nicht deklarieren als std_logic_vector (7 downto 0) (sie sind std_logic) In der Komponentendeklaration für sel4_1 fehlt eine Deklaration für SEL und outsgnl sollte als std_logic_vector deklariert werden (7 bis 0) .Dann simuliert der Testbench richtig - [testbench.png] (http://i.stack.imgur.com/rywhv.png). – user1155120

+0

vielen Dank euch beiden! endlich kann ich es kompilieren und simulieren – HAKIM

0

Dies ist der Code, nachdem einige Korrekturen:

library IEEE; 
use IEEE.std_logic_1164.all; 

entity sel4_1 is 
    port(A, B, C, D : in std_logic_vector(7 downto 0); 
     SEL   : in std_logic_vector(1 downto 0); 
     outsgnl  : out std_logic_vector(7 downto 0)); 
    end sel4_1; 

architecture EX1 of sel4_1 is 
begin 

process(A, B, C, D, SEL) 
begin 
case SEL is 
    when "00" => outsgnl <= A; 
    when "01" => outsgnl <= B; 
    when "10" => outsgnl <= C; 
    when others => outsgnl <= D; 
end case; 
end process; 

end EX1; 

Prüfstand:

library IEEE; 
use IEEE.std_logic_1164.all; 
use IEEE.std_logic_unsigned.all; 

entity TESTBENCH is 
end TESTBENCH; 

architecture RTL of TESTBENCH is 

component sel4_1 
    port(A,B,C,D : in std_logic_vector(7 downto 0); 
     SEL  : in std_logic_vector(1 downto 0); 
     OUTSGNL : out std_logic_vector(7 downto 0)); 
end component; 

signal INA, INB, INC, IND, OUTSGNL : std_logic_vector(7 downto 0); 
signal SEL : std_logic_vector(1 downto 0); 

begin 
    U0: sel4_1 port map(INA, INB, INC, IND, SEL, OUTSGNL); 
    process 
    begin 
    INA <= "11111111"; 
    INB <= "11110000"; 
    INC <= "00001111"; 
    IND <= "00000000"; 

    SEL <= "00"; wait for 10 ns; 
    SEL <= "01"; wait for 10 ns; 
    SEL <= "10"; wait for 10 ns; 
    SEL <= "11"; wait for 10 ns; 

    wait; 
    end process; 
end RTL; 
0

Als Alternative zu Hakim (vollkommen richtig) Vorschlag gibt es eine gleichzeitige Art und Weise zu tun das gleiche.

library IEEE; 
use IEEE.std_logic_1164.all; 

entity sel4_1 is 
    port(A, B, C, D : in std_logic_vector(7 downto 0); 
     SEL   : in std_logic_vector(1 downto 0); 
     outsgnl  : out std_logic_vector(7 downto 0)); 
    end sel4_1; 

architecture EX1 of sel4_1 is 
begin 

    with SEL select 
    outsgnl <= A when "00", 
       B when "01", 
       C when "10", 
       D when others; 
end EX1; 

Ich bevorzuge Prozesse für andere als getaktete Prozesse zu vermeiden. Ein fehlendes Signal in der Empfindlichkeitsliste führt zu Simulations/Synthese-Mismatches. Und diese Sensitivitätslisten beizubehalten, kann ein Bär werden. Und wenn ein Kombinationsprozess notwendig ist, sollte die Liste sehr klein sein. (Und, ja, es gibt VHDL-2008 all, die hilft.)

+0

danke! Ich bin noch ein Anfänger in VHDL. Alles, was vorgeschlagen wird, wird mir sehr helfen – HAKIM