www.mikrocontroller.net

Forum: FPGA, VHDL & Co. ISE Webpack 11 - Testbenchprobleme


Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich habe einen einfachen 4-Bit-Zähler mit D-FF und Halbaddierern mit dem 
Webpack erstellt.

Wollte das ganze mit dem Simulator testen, wozu ich eine Testbench in 
VHDL erstellt habe, bzw. von der Software erstellen ließ.

Wenn ich die Simulation starte, funktioniert lediglich die clock. Alle 
anderen Ausgänge bleiben auf 'U' (unassigned nehme ich an?)

Ich hoffe jemand kann mir weiterhelfen, vielen Dank schonmal!

Hier der Zähler und die Testbench:

entity f_bit_counter is
    Port ( clock : in  STD_LOGIC;
           Qa : inout  STD_LOGIC;
           Qb : inout  STD_LOGIC;
           Qc : inout  STD_LOGIC;
           Qd : inout  STD_LOGIC);
end f_bit_counter;

architecture Behavioral of f_bit_counter is

component half_adder

  port (a, b : in std_logic;
      sum, carry : out std_logic);
end component;

component d_ff

  port (d, clock : in std_logic;
      q : out std_logic);
end component;

signal Qan1, Qbn1, Qcn1, Qdn1,
      c_a, c_b, c_c, c_d : std_logic;

begin

ha_a : half_adder port map ( a => Qa, b => '1', sum => Qan1, carry => 
c_a );
ha_b : half_adder port map ( a => Qb, b => c_a, sum => Qbn1, carry => 
c_b );
ha_c : half_adder port map ( a => Qc, b => c_b, sum => Qcn1, carry => 
c_c );
ha_d : half_adder port map ( a => Qd, b => c_c, sum => Qdn1, carry => 
c_d );

d_ff_a : d_ff port map ( d => Qan1, clock => clock, q => Qa );
d_ff_b : d_ff port map ( d => Qbn1, clock => clock, q => Qb );
d_ff_c : d_ff port map ( d => Qcn1, clock => clock, q => Qc );
d_ff_d : d_ff port map ( d => Qdn1, clock => clock, q => Qd );

end Behavioral;

ENTITY testbench_counter IS
END testbench_counter;

ARCHITECTURE behavior OF testbench_counter IS

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

    COMPONENT f_bit_counter
    PORT(
         clock : IN  std_logic;
         Qa : INOUT  std_logic;
         Qb : INOUT  std_logic;
         Qc : INOUT  std_logic;
         Qd : INOUT  std_logic
        );
    END COMPONENT;


   --Inputs
   signal clock : std_logic := '0';

  --BiDirs
   signal Qa : std_logic;
   signal Qb : std_logic;
   signal Qc : std_logic;
   signal Qd : std_logic;

   -- Clock period definitions
   constant clock_period : time := 1us;

BEGIN

  -- Instantiate the Unit Under Test (UUT)
   uut: f_bit_counter PORT MAP (
          clock => clock,
          Qa => Qa,
          Qb => Qb,
          Qc => Qc,
          Qd => Qd
        );

   -- Clock process definitions
   clock_process :process
   begin
    clock <= '0';
    wait for clock_period/2;
    clock <= '1';
    wait for clock_period/2;
   end process;


   -- Stimulus process
   stim_proc: process
   begin
       hold reset state for 100ms.
      wait for 100ms;

      wait for clock_period*10;

      -- insert stimulus here

      wait;
   end process;

END;

Autor: Segor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>-- insert stimulus here
das ist der entscheidende Satz.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Erstmal danke für die schnelle Antwort.

Ja den Satz hab ich natürlich gesehen ;-)

Reicht denn nicht der Takt als Stimulus für den Zähler?

Muss ich die einzelnen Ausgänge (Qa bis Qd) erst auf 0 irgendwie 
initialisieren?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kein Wunder. Du schaltest ja die Ausgänge der D-FF direkt auf die 
IONOUTS, ohne irgendwie die Richtung der Ports umzuschalten. Außerdem 
brauchst du natürlich dann einen Stimulus für die Eingänge.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die Antwort!

Ich habe jetzt anstelle der inout ports signals genommen.
Wie sollte denn beispielhaft ein Stimulus auf die Eingänge aussehen?

Bin recht neu bei VHDL und habe noch so meine Probleme. Wäre super, wenn 
jemand zu obigen einen Vorschlag machen könnte.

Oder kennt jemand eine Quelle in der Testbenches ausführlich erklärt 
werden? Habe bisher nichts wirklich brauchbares gefunden (und eigentlich 
schon viel gesucht)

Tobias

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Bin recht neu bei VHDL und habe noch so meine Probleme.
Lies mal das Buch "VHDL Synthese" von Reichardt/Schwarz ISBN: 3486581929

> Oder kennt jemand eine Quelle in der Testbenches ausführlich erklärt
> werden?
Dir reicht vorerst eine oberflächliche, dafür aber praxisnahe 
Betrachtung des Themas. Im o.g. Buch ist das enthalten.

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe eine andere Frage zum gleichen Thema.

Nutzt jemand ISIM?

Ich finde keinen Button in der ISE zum starten. Von der Console kann ich 
es starten. Leider weiss ich nicht wie ich ISIM eine Simulation starte. 
Es ist immer alles ausgegraut.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Um ISIM zu starten musst du Links im "Design" Panel unter "Sources 
for..."
"Behavioral Simulation" auswählen. Da kannst du dann (wenn du eine 
Testbench erstellt hast) unter Processes unter anderem "Run simulation" 
auswählen.

Tobias

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Um nochmal auf die obige Frage von mir zurückzukommen:

Ich kriege einfach keine Simulation für den 4bit-Zähler zum laufen. Ich 
habe jetzt schon einiges gelesen, wie eine Testbench funktioniert etc. 
ist mir auch klar.

Ich habe auch die einzelnen Komponenten getestet mit einer Simulation 
(also das D-FF und den Halbaddierer).

Wenn ich die ganze Schaltung testen will, bleiben jedoch immer alle 
Werte auf 'U'. Langsam verzweifle ich daran ;-)

Kann jemand helfen?

Vielen Dank!

Hier die aktuelle Testbench:

ENTITY testbench IS
END testbench;

ARCHITECTURE behavior OF testbench IS

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

    COMPONENT f_bit_counter
    PORT(
         clock : IN  std_logic;
         Qa : OUT  std_logic;
         Qb : OUT  std_logic;
         Qc : OUT  std_logic;
         Qd : OUT  std_logic
        );
    END COMPONENT;


   --Inputs
   signal clock : std_logic := '0';

   --Outputs
   signal Qa : std_logic := '0';
   signal Qb : std_logic := '0';
   signal Qc : std_logic := '0';
   signal Qd : std_logic := '0';

   -- Clock period definitions
   constant clock_period : time := 1us;

BEGIN

  -- Instantiate the Unit Under Test (UUT)
   uut: f_bit_counter PORT MAP (
          clock => clock,
          Qa => Qa,
          Qb => Qb,
          Qc => Qc,
          Qd => Qd
        );

   -- Clock process definitions
   clock_process :process
   begin
    clock <= '0';
    wait for clock_period/2;
    clock <= '1';
    wait for clock_period/2;
   end process;


   -- Stimulus process
   stim_proc: process
    begin

    wait for 100us;

      wait for clock_period*10;

    Qa <= Qa;
    Qb <= Qb;
    Qc <= Qc;
    Qd <= Qd;

     end process;

END;

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
    Qa <= Qa;
    Qb <= Qb;
    Qc <= Qc;
    Qd <= Qd;
Das darfst du nicht machen. Der einzige Eingang in deine Komponente 
f_bit_counter ist der Takt. Und nur der wird auch stimuliert.

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Danke für die Antwort.

Ja so dachte ich das auch, dass ich nur den Takt benötige. Aber auch 
dann passiert rein garnichts.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gib mal den Signalen Defaultwerte:
signal c_a : std_logic := '0';
signal c_b : std_logic := '0';
signal c_c : std_logic := '0';
:

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo tu ich das am besten? Bisher habe ich das in der 
Architektur-Beschreibung getan.
Dadurch hat sich allerdings auch nichts verändert. Mich wundert das doch 
sehr...

Ich habe sogar in dem Stimuli-Prozess den Ausgangssignalen mal feste 
Werte zugewiesen. Trotzdem blieben sie uninitialisiert.

Woran kann das nur liegen?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Woran kann das nur liegen?
Das hier ist gerade wie im Trüben fischen :-/

Pack mal deine beiden aktuellen Dateien zusammen und poste die...

Autor: Ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Ich gehe mal davon aus, dass du auch eine Verhaltensbeschreibung für die 
Komponenten half_adder und d_ff hast, und nicht blos eine entity!?

Gruß

Autor: René D. (Firma: www.dossmatik.de) (dose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias schrieb:
> Hallo!
> Um ISIM zu starten musst du Links im "Design" Panel unter "Sources
> for..."
> "Behavioral Simulation" auswählen. Da kannst du dann (wenn du eine
> Testbench erstellt hast) unter Processes unter anderem "Run simulation"
> auswählen.
>
> Tobias

Hallo Tobias,

ich kann es einfach nicht finden,
kannst du mir einen Screenshot senden. Es ist als bin ich bla.

Autor: Mani (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das müsste es sein....

Autor: Tobias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

hier sind jetzt die aktuellen Dateien mit dem vhdl-Code. Vielleicht hat 
jemand Lust sich einmal anzuschauen, wo das Problem liegen könnte.

Danke und Viele Grüße,
Tobias

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Tobias schrieb:
> hier sind jetzt die aktuellen Dateien mit dem vhdl-Code.
Dein and2 muß erst mal andtwo heißen.

Und dann sollte noch das d_ff initialisiert werden:
entity d_ff is
    Port ( D : in  STD_LOGIC;
           clock : in  STD_LOGIC;
           Q : out  STD_LOGIC := '0');
end d_ff;
Dann gehts (Screenshot)  ;-)

EDIT:
Alternativ auch so:
entity d_ff is
    Port ( D : in  STD_LOGIC;
           clock : in  STD_LOGIC;
           Q : out  STD_LOGIC);
end d_ff;

architecture Behavioral of d_ff is
signal q_loc : std_logic := '0';
begin

 process (clock)
 begin
   if clock'event and clock='1' then  
      q_loc <= D;
   end if;
   Q <= q_loc;
 end process;

end Behavioral;

Autor: Tobias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super! Vielen Dank!

Es lag also nur an der fehlenden Initialisierung...hätt ich ja noch 
lange suchen können!

Tobias

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.