2016-04-13 9 views
1

Ich habe einen Addierblock und ich muss den Ausgang (std_logic_vector) zurück zu einem der Addierer-Eingangsports mit einer anderen Nummer hinzugefügt werden (Dies ist in einem anderen getan werden Entität, in der der Addierer verwendet wird.). Ich habe versucht, das durch process mit sensitivity list zu tun, aber es hat nicht funktioniert. Gibt es einen Weg dazu? Hinweis: Es werden keine Uhren verwendet.vhdl Rückmeldung der Ausgang eines Blocks zu seinem Eingang

Hier ist mein Code:

library IEEE; 
use IEEE.std_logic_1164.all; 

entity example is 
port ( 
    X: IN std_logic_vector(15 downto 0); 
    Y: IN std_logic_vector(15 downto 0); 
    Z: OUT std_logic_vector(15 downto 0) 
    ); 
end example; 

architecture arch_example of example is 
    component adder is 
    port(a: in std_logic_vector(15 downto 0); 
     b: in std_logic_vector(15 downto 0); 
     cin: in std_logic; 
     s: out std_logic_vector(15 downto 0); 
     overflow: out std_logic); 
    end component; 
    signal s, ain, bin: std_logic_vector(15 downto 0); 
    signal cin, overflow, useless: std_logic; 
begin 
    process(x, y) is 
    begin 
     ain <= x; 
     bin <= y; 
     cin <= '0'; 
    end process; 
    process(s, overflow) is 
    begin 
     ain <= s; 
     bin <= "1111111110000001"; 
     cin <= overflow; 
    end process; 
    U1: adder port map (ain, bin, cin, s, overflow); 
    z <= s; 
end arch_example; 
+0

Sie müssen uns geben einen Code oder ein Diagramm zu erklären, was Sie versuchen zu erreichen, . Aber es ist ein wenig besorgniserregend zu sagen, dass "keine Uhren verwendet werden" - die "kombina- tionale Rückmeldung" ist kein "synchrones Design" und sollte daher nicht gemacht werden. –

+0

Der obige Code erklärt, was ich machen möchte, irgendwelche Vorschläge? @MatthewTaylor – kamal

Antwort

1

in Ihrem Code haben Sie mehrere Treiber für die Signale ain, bin und cin weil zwei Prozesse diese Signale zur gleichen Zeit fahren. Sie können es sich als zwei Tore vorstellen, die denselben Draht fahren.

Um einem Zwischenergebnis in einem vollständig kombinatorischen Design eine weitere Zahl hinzuzufügen, benötigen Sie einen zweiten Addierer. Der erste Addierer kann nicht wiederverwendet werden, weil Sie nicht einfach sagen können, wann Sie zum Beispiel mit Multiplexern zu den neuen Eingängen wechseln. (Es wird mit den Konzepten der asynchronen Logik möglich sein, aber das ist viel komplexer.)

Eine einfache Lösung ist Ihre Addiererkomponente zu instanziiert zweimal:

architecture arch_example of example is 
    component adder is 
    port(a: in std_logic_vector(15 downto 0); 
     b: in std_logic_vector(15 downto 0); 
     cin: in std_logic; 
     s: out std_logic_vector(15 downto 0); 
     overflow: out std_logic); 
    end component; 
    signal s : std_logic_vector(15 downto 0); 
    signal overflow : std_logic; 
begin 
    U1: adder port map (x, y, '0', s, overflow); 
    U2: adder port map (s, "1111111110000001", overflow, z, open); 
end arch_example; 

Die Code-Snippet oben nutzt eine Positionszuordnung Komponentenports. Dies sollte vermieden werden, da die Reihenfolge der Ports leicht verwechselt werden kann. Ich empfehle stattdessen benannte Zuweisungen zu verwenden. siehe hier kann man explictly welcher Port (auf der linken Seite von =>) zugeordnet ist, welches Signal (rechts):

architecture arch_example of example is 
    component adder is 
    port(a: in std_logic_vector(15 downto 0); 
     b: in std_logic_vector(15 downto 0); 
     cin: in std_logic; 
     s: out std_logic_vector(15 downto 0); 
     overflow: out std_logic); 
    end component; 
    signal s : std_logic_vector(15 downto 0); 
    signal overflow : std_logic; 
begin 
    U1: adder port map (
     a => x, 
     b => y, 
     cin => '0', 
     s => s, 
     overflow => overflow); 

    U2: adder port map (
     a => s, 
     b => "1111111110000001", 
     cin => overflow, 
     s => z, 
     overflow => open); 
end arch_example; 
+0

Soviel ich weiß, wird der erste 'Prozess' ausgeführt, wenn sich die Eingänge' X' und 'Y' ändern, und der zweite wird ausgeführt, wenn' s' und 'Überlauf' sich ändern. Also wird in dem ersten "Prozess", "ain <= X" und "bin <= Y" (es werden keine anderen Werte bereitgestellt), dann erzeugt der Addierer "s" und "Überlauf", was den zweiten "Prozess" auslöst und jetzt haben 'ain' und' bin' neue Werte. Daher sollten 'ain' und' bin' nicht gleichzeitig unterschiedliche Werte zugewiesen bekommen. Was stimmt nicht mit meiner Analyse? – kamal

+0

@mhmdhsenkamal Aber die Signalzuweisungen aus dem ersten Prozess bleiben, auch wenn der Prozess am Ende ausgesetzt ist. Und jeder Prozess wird einmalig nach dem Start der Simulation ausgeführt, daher weisen beide Prozesse bereits beim Start der Simulation -> mehrere Treiber - unterschiedliche Werte zu. –

+0

Vielen Dank! Ich habe versucht, keinen weiteren Addierer hinzuzufügen, aber es scheint, dass ich keine andere Wahl habe. – kamal