2012-04-01 13 views
4

Für eine Klasse wurde ich gebeten, eine VHDL-Prozedur zu schreiben, die zwei ganzzahlige Eingaben A und B benötigt und A durch A + B und B durch A-B ersetzt. Ich habe das folgende Programm und die Testbench geschrieben. Es schließt die Implementierung und die Verhaltenssyntaxprüfung ab, es wird jedoch nicht simuliert. Obwohl ich keine Fehler erhalte, erhalte ich einige Warnungen, die besagen, dass sich A und B in kombinatorischen Feedback-Schleifen befinden. Kann jemand etwas Licht auf das Problem werfen?VHDL-Prozeduren

Modul:

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity Problem2 is 
Port (A : inout integer; 
     B : inout integer); 
end Problem2; 

architecture Behavioral of Problem2 is 

procedure AB (signal A,B: inout integer) is 
begin 
A<=A+B after 20 ns; 
B<=A-B after 30 ns; 
end AB; 

begin 

AB(A=>A, B=>B); 

end Behavioral; 

Testbench:

LIBRARY ieee; 
USE ieee.std_logic_1164.ALL; 

ENTITY Problem2_test IS 
END Problem2_test; 

ARCHITECTURE behavior OF Problem2_test IS 

    -- Component Declaration for the Unit Under Test (UUT) 

    COMPONENT Problem2 
    PORT(
    A : INOUT integer; 
    B : INOUT integer 
    ); 
END COMPONENT; 


--BiDirs 
    signal A : integer; 
    signal B : integer; 
    -- No clocks detected in port list. Replace <clock> below with 
-- appropriate port name 

BEGIN 

    -- Instantiate the Unit Under Test (UUT) 
    uut: Problem2 PORT MAP (
      A => A, 
      B => B 
     ); 

ABproc: process is 
begin 
    A<=25; 
    B<=22; 
    wait; 
end process; 

END; 
+0

, die keinen Sinn bekommen hat ... – ferdepe

Antwort

6

Das Problem ist:

  1. Ihre Komponente schreibt seine eigene Eingänge. Dies entspricht einer Endlosschleife. Der Grund, warum Sie dies getan haben, ist, weil ....
  2. Die Beschreibung des Problems macht keinen Sinn.

ich gebeten wurde, eine VHDL-Prozedur zu schreiben, die zwei Integer-Eingängen A und B nimmt ...

Feine

... und ersetzt A mit ...

Was ?!

Sie können nicht ersetzenA (oder B), weil Sie dieses Problem bekommen werden. Sie könnten eine Prozedur schreiben, die zwei ganzzahlige Eingaben benötigt und zwei ganzzahlige Ausgaben liefert. Diese Ausgänge könnten dann einige Register speisen, die dann den Eingang speisen, aber dort muss ein Register vorhanden sein, um die kombinatorische Rückkopplungsschleife zu unterbrechen.

1

Testen Sie es nicht innerhalb der problem2 Einheit. Rufen Sie das Verfahren direkt von Ihrem Prüfstand aus an.

(Dieser Code ist nicht getestet!)

ABproc: process is 
begin 
    A<=25; 
    B<=22; 
    AB(A, B); 
    wait 1 ns; 
    assert A = 47; 
    assert B = 3; 
    wait; -- forever 
end process;