2016-03-25 42 views
-1

Ich gehe direkt auf Details.Eingangszuordnung in Testbench und Ausgabewerte (ghdl und gtkwave)

Ich benutze Ubuntu 14.04LTS, GHDL-Compiler und GTKWave für die Simulation.

Ich habe zwei Dateien für ein einfaches 2-Multiplexer zu simulieren: mux2.vhd und mux2_testbench.vhd

Dies ist der Code für mux2.vhd

-- Libraries 

library ieee; 
use ieee.std_logic_1164.all; 


-- Entity declaration 

entity mux2 is 

    port(
     e0, e1 : in std_logic; 
     c : in std_logic; 
     output : out std_logic 
    ); 

end mux2; 


-- Architecture declaration 

architecture mux2_arch of mux2 is 

    begin 
    process (e0, e1, c) 

     begin 
     if c = '0' then 
      output <= e0; 
     else 
      output <= e1; 
     end if; 
    end process; 
end mux2_arch; 

-Code für die Testbench

--Libraries 

library ieee; 
use ieee.std_logic_1164.all; 

--Empty entity for simulation 

entity mux2_testbench is 
end mux2_testbench; 

architecture testbench_arch of mux2_testbench is 
    component test is 
     port(
      c : in std_logic; 
      e0, e1 : in std_logic; 
      output : out std_logic 
     ); 
    end component; 

    signal c: std_logic; 
    constant clk: time:=50 ns; 
    signal e0: std_logic; 
    signal e1: std_logic; 
    signal output: std_logic; 

    begin 
     lab: test 
     port map(
      c => c, 
      e0 => e0, 
      e1 => e1, 
      output => output 
     ); 



     process 
     begin 

      --Case 1: Control signal is low 
      c <= '0'; 

      e0 <= '0'; 
      e1 <= '0'; 
      wait for 100 ns; 
      e0 <= '0'; 
      e0 <= '1'; 
      wait for 100 ns; 
      e0 <= '1'; 
      e0 <= '0'; 
      wait for 100 ns; 
      e0 <= '1'; 
      e0 <= '1'; 
      wait for 100 ns; 

      --Case 2: Control signal is high 
      c <= '1'; 

      e0 <= '0'; 
      e1 <= '0'; 
      wait for 100 ns; 
      e0 <= '0'; 
      e0 <= '1'; 
      wait for 100 ns; 
      e0 <= '1'; 
      e0 <= '0'; 
      wait for 100 ns; 
      e0 <= '1'; 
      e0 <= '1'; 
     end process; 

end testbench_arch; 

Dinge, die ich mache:

ich über Klemme bin Kompilieren ohne Fehler mit: ghdl -a mux2.vhd und ghdl -a mux2_testbench.vhd

Dann habe ich die ausführbare Datei für die Testumgebung zu erstellen: ghdl -e mux2_testbench

Schließlich schaffe ich die vCD-Datei ich brauche gtkwave zu verwenden: ghdl -r mux2_testbench --vcd = test.vcd &

Simulation: gtkwave test.vcd

Ich habe zwei Probleme mit diesem Code: 1. Auch wenn ich verschiedene Werte in Signale E0 und E1 hier schreibe, e1 zeigt nichts in der Simulation . Es ist immer '0'.

  1. Das Ausgangssignal zeigt in der Simulation den Wert "U". Ich bin mir nicht einmal sicher, was das bedeutet und konnte in Google nichts finden.

Vielen Dank im Voraus, Freunde.

+2

Welche Zeile schreibt etwas anderes als '0' nach e1? Keine, die ich sehen kann ... gibt es einen Kopier-/Einfügefehler? Außerdem sehe ich keine Entität/keinen Bogen für die Komponente "Test". –

+0

Bitte formatieren Sie Ihren Code. – Paebbels

Antwort

0

Zuerst ist 'U' der Standardwert für den Typ std_logic. Es bedeutet nicht initialisiert. Jedes Signal, das nicht zugewiesen wurde oder nicht angesteuert wird, hat den Wert 'U'. Ich denke, es ist sehr wahrscheinlich, dass Ihre Ausgänge nicht angesteuert werden, da Sie eine Komponente mit der Bezeichnung test instanziiert haben. Ihr zu testendes Gerät entity heißt mux2.Ich empfehle, den Namen Ihrer Komponente mux2, dann ist die Standard verbindlichen Regeln Wechsel ermöglicht mux2 Ihr Unternehmen gebunden an die Komponente mux2 zu sein:

component mux2 is 
    port(c : in std_logic; 
     e0, e1 : in std_logic; 
     output : out std_logic); 
end component; 

und

-- this is component instantiation 
    lab: mux2 
    port map(
     c => c, 
     e0 => e0, 
     e1 => e1, 
     output => output 
    ); 

So, Die entitymux2 wird nicht gebunden an die componenttest. Stellen Sie sich einen component wie einen IC-Sockel vor; Denken Sie an eine entity als wie der IC, der in den Sockel geht. Wenn Ihr component heißt test und Ihr entity heißt mux2, wie kann der Simulator binden (d. H. Verbinden) die beiden zusammen? Sie könnten schreiben, was ein configuration genannt wird, um dies Bindung zu tun, aber es wäre viel einfacher, den component Namen zu mux2 zu ändern, dann wird dies automatisch geschehen.

(Oder noch besser, warum verwenden Komponente Instanziierung überhaupt? Warum mit der Komponente die Mühe machen? Warum nicht direkte Instanziierung statt?)

-- this is direct instantiation 
    lab: entity work.mux2 
    port map(
     c => c, 
     e0 => e0, 
     e1 => e1, 
     output => output 
    ); 

Zweitens scheint es klar, dass Sie nicht sind Fahren e1. Sicherlich Zeilen wie diese:

e0 <= '0'; 
    e0 <= '1'; 

e0 <= '0'; 
    e1 <= '1'; 
-- ^
-- | 
1

mit Brians Kommentar sein soll ich Entsprechend hinzugefügt, um eine Konfigurationsspezifikation mux2 statt Test im Prüfstand zu verwenden:

architecture testbench_arch of mux2_testbench is 
    component test is 
     port (
      c:  in std_logic; 
      e0, e1: in std_logic; 
      output: out std_logic 
     ); 
    end component; 

    signal c:  std_logic; 
    constant clk: time := 50 ns; 
    signal e0:  std_logic; 
    signal e1:  std_logic; 
    signal output: std_logic; 

    for lab: test use entity work.mux2; -- added 

begin 
lab: 
    test 
     port map (
      c => c, 
      e0 => e0, 
      e1 => e1, 
      output => output 
     ); 

    process 
    begin 

     --Case 1: Control signal is low 
     c <= '0'; 

     e0 <= '0'; 
     e1 <= '0'; 
     wait for 100 ns; 
     e0 <= '0'; 
     e0 <= '1'; 
     wait for 100 ns; 
     e0 <= '1'; 
     e0 <= '0'; 
     wait for 100 ns; 
     e0 <= '1'; 
     e0 <= '1'; 
     wait for 100 ns; 

     --Case 2: Control signal is high 
     c <= '1'; 

     e0 <= '0'; 
     e1 <= '0'; 
     wait for 100 ns; 
     e0 <= '0'; 
     e0 <= '1'; 
     wait for 100 ns; 
     e0 <= '1'; 
     e0 <= '0'; 
     wait for 100 ns; 
     e0 <= '1'; 
     e0 <= '1'; 
     wait for 100 ns; -- added to terminate the simulation 
     wait;    -- added "" 
    end process; 

end architecture testbench_arch; 

ich auch Die beiden Warteanweisungen wurden hinzugefügt, sodass die Simulation ohne Hinzufügen eines Flags --stop-time = somvalue beendet wird, wenn --wave = testbench.ghw anstelle von --vcd = test.vcd verwendet wird.

(Gtkwave akzeptiert auch das GHW-Dump-Dateiformat, das für ghdl einzigartig ist, es ist ein komprimiertes Format und nicht so gut wie CTL-Cd, um eine Simulation zu stoppen, die sonst ständig eine Schleife durchlaufen würde).

Dies gibt:

mux2_testbench.png

Beachten Sie, dass mit e1 in Ehrerbietung Antwort auf Matthäus immer niedrig ist, können Sie immer noch unterscheiden, welcher Eingang auf output zeigt sich, was zeigt c bietet es Auswahlfunktion ist.

Das 'U' wäre angezeigt worden, weil der Komponententest nicht gebunden war und ein Entitätstest in der Arbeitsbibliothek nicht gefunden wurde.

Die Binding-Angabe im obigen Beispiel erfolgt durch die Konfigurationsspezifikation. Siehe IEEE Std 1076-2008 7.3 Konfigurationsspezifikation und 7.3.2 Bindungsanzeige.

Sie können auch direkte Entitätsinstanziierung als Matthew Advokaten verwenden, oder indem Sie eine Konfigurationsdeklaration verwenden, die eine Bindungsindikation enthält, lassen Sie die Testkomponenteninstanz unverändert.

Die Möglichkeit, die Testbench wiederzuverwenden, wäre durch die Stimulationsmuster für Eingaben in die zu testende Einheit (Labor) eingeschränkt.