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


von Tobias (Gast)


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;

von Segor (Gast)


Lesenswert?

>-- insert stimulus here
das ist der entscheidende Satz.

von Tobias (Gast)


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?

von Christian R. (supachris)


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.

von Tobias (Gast)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

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


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.

von Tobias (Gast)


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

von Tobias (Gast)


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;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
    Qa <= Qa;
2
    Qb <= Qb;
3
    Qc <= Qc;
4
    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.

von Tobias (Gast)


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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Gib mal den Signalen Defaultwerte:
1
signal c_a : std_logic := '0';
2
signal c_b : std_logic := '0';
3
signal c_c : std_logic := '0';
4
:

von Tobias (Gast)


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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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...

von Ich (Gast)


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ß

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


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.

von Mani (Gast)


Angehängte Dateien:

Lesenswert?

Das müsste es sein....

von Tobias (Gast)


Angehängte Dateien:

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Angehängte Dateien:

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:
1
entity d_ff is
2
    Port ( D : in  STD_LOGIC;
3
           clock : in  STD_LOGIC;
4
           Q : out  STD_LOGIC := '0');
5
end d_ff;
Dann gehts (Screenshot)  ;-)

EDIT:
Alternativ auch so:
1
entity d_ff is
2
    Port ( D : in  STD_LOGIC;
3
           clock : in  STD_LOGIC;
4
           Q : out  STD_LOGIC);
5
end d_ff;
6
7
architecture Behavioral of d_ff is
8
signal q_loc : std_logic := '0';
9
begin
10
11
 process (clock)
12
 begin
13
   if clock'event and clock='1' then  
14
      q_loc <= D;
15
   end if;
16
   Q <= q_loc;
17
 end process;
18
19
end Behavioral;

von Tobias (Gast)


Lesenswert?

Super! Vielen Dank!

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

Tobias

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.