Forum: FPGA, VHDL & Co. STimuli Testbench


von FPGA (Gast)


Lesenswert?

Hallo ! Frage wieso werden im modelsim aus dieser tb keine signale 
generiert, zumindest clk müsste sich ja periodisch änder aber es sieht 
so aus als ob überhaupt keine signale aus ISE an modelsim weitergegeben 
werden

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

ENTITY tb IS
END tb;

ARCHITECTURE behavior OF tb IS

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

    COMPONENT fastcount
    PORT(
         SDA : INOUT  std_logic;
         SCL : INOUT  std_logic;
         clk : INOUT  std_logic;
         puls : INOUT  std_logic
        );
    END COMPONENT;


  --BiDirs
   signal SDA : std_logic;
   signal SCL : std_logic;
   signal clk : std_logic;
   signal puls : std_logic;

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

BEGIN

  -- Instantiate the Unit Under Test (UUT)
   uut: fastcount PORT MAP (
          SDA => SDA,
          SCL => SCL,
          clk => clk,
          puls => puls
        );


Testbench_Process : Process
    Begin
    Wait for 10 ns;
    SDA <= '1';
    Wait for 10 ns;
    SDA <= '0';
    Wait for 10 ns;
    SDA <= '1';
    Wait;
    End Process;


   -- Clock process definitions
   clk_process :process
   begin
    clk <= '0';
    wait for clk_period/2;
    clk <= '1';
    wait for clk_period/2;
   end process;


END;

von Klaus F. (kfalser)


Lesenswert?

Wahrscheinlich, weil alle dein Ports als INOUT deklariert sind.

Zumindest das clk Signal geht nur in deine UUT hinein, ist also für die 
UUT ein IN port.

von Duke Scarring (Gast)


Angehängte Dateien:

Lesenswert?

> USE ieee.std_logic_unsigned.all;
Schmeiß das raus, das bringt nur verwirrung...

>constant clk_period : time := 1us;
Da muss noch ein Leerzeichen zwischen 1 und us.

Ansonsten solltest Du Dir klarmachen, das XST und Isim oder ModelSim 
verschiedene Programme sind, die jeweils Deinen Quellcode 
interpretieren. Da wandern keine Signal/Daten/whatever hin und her. Nur 
Quelltexte und evtl. Steuerdateien.

In meinem Modelsim tackert Deine Clock jedenfalls los:
1
$ vlib work
2
$ vcom tb.vhd
3
Model Technology ModelSim XE III vcom 6.2g Compiler 2007.02 Feb 22 2007
4
-- Loading package standard
5
-- Loading package std_logic_1164
6
-- Loading package numeric_std
7
-- Compiling entity tb
8
-- Compiling architecture behavior of tb
9
** Warning: [4] tb.vhd(29): (vcom-1207) An abstract literal and an identifier must have a separator between them.
10
11
$ vsim -gui tb
12
> add wave -r *
13
> run 1 ms

Duke

von FPGA (Gast)


Lesenswert?

Danke für eure antworten, tuckert bei dir clk automatisch los oder musst 
clk(mit rechte maustaste) auf clock setzten ?

was müsste ich schreiben wenn sich SCL automatisch ändern soll also 
zeitgesteuert z.B.: 10ns '1' und dann wieder 10ns '0'  usw.

Testbench_Process : Process
    Begin
    Wait for 10 ns;
    SCL <= '1';
    Wait for 10 ns;
    SCL <= '0';
    Wait for 10 ns;
    SCL <= '1';
    Wait;
    End Process;

...würde das mit diesem process funktionieren ?

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


Lesenswert?

FPGA schrieb:
> ...würde das mit diesem process funktionieren ?
Damit wäre der SCL für 10ns undefiniert, dann 10ns high, dann wieder 
10ns low und den Rest high. Kürzer ginge das ohne Prozess auch so:
SCL <= 'U', '1' after 10 ns, '0' after 20 ns, '1' after 30 ns;

> ...würde das mit diesem process funktionieren ?
Das könntest du aber auch einfach mal ausprobieren... :-/

von FPGA (Gast)


Lesenswert?

danke !
ich glaub inzwischen dass das problem wo anders liegt weil, einmal 
funktionierts und schaltet zw. 0 und 1,  dann wieder bleibt das SCL 
signal rot und ich kann es nur "händisch" auf 1 bzw 0 setzen

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


Lesenswert?

FPGA schrieb:
> dann wieder bleibt das SCL signal rot
Rot=Undefined.
Das kommt, weil es vermutlich von 2 Treibern gleichzeitig mit '0' und 
'1' angesteuert wird..

> und ich kann es nur "händisch" auf 1 bzw 0 setzen
Naja, das tut man nicht... :-/
Oder willst du später in der echten Hardware von Hand mitmischen müssen?

von FPGA (Gast)


Lesenswert?

Danke für die Hilfe !

Aber ein Problem hab ich noch,  was mach ich mit SDA das ist wie beim 
I2C eben üblich eine bidirektionale Leitung.

Diese wird noch immer als undefined angezeigt obwohl in meinem programm 
bis jetzt der port nur gelesen und nicht beschrieben wird.

In weiterer folge (sollte das programm irgendwann funktionieren) wird 
über die testbench das start/stop bit, adresse, read/write an die entity 
übergeben welchen entsprechen(I2C) reagieren soll(counterstand an den 
master zurückschicken).

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


Lesenswert?

Probiers mal so:
1
   signal SDA : std_logic := '0'; -- Initialwert angeben

> ... an die entity übergeben ...
Formal nicht ganz richtig: die Testbench übergibt die Signale an die 
Komponente. Diese Komponente nimmt sie über den Port entgegen. Dieser 
Port ist in der Entity definiert.

von FPGA (Gast)


Lesenswert?

hallo,

also ich hab jetzt versucht das SDA Problem anders zu lösen(einen Pin 
für SDA out und einen für SDA in) doch sdaout wird noch immer als 
undefined angezeigt egal ob ich das signal mit 0 intialisiere oder nicht 
?

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
--USE ieee.std_logic_unsigned.all;
USE ieee.numeric_std.ALL;

ENTITY testbe IS
END testbe;

ARCHITECTURE behavior OF testbe IS

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

    COMPONENT fastcount
    PORT(
         SDAOUT : out  STD_LOGIC;
         SDAIN : in  STD_LOGIC;
         SCL : IN  std_logic;
         puls : IN  std_logic
        );
    END COMPONENT;


   --Inputs
   signal SCL : std_logic := '0';
   signal puls : std_logic := '0';
  signal SDAIN: std_logic := '0';

  --BiDirs
  signal SDAOUT : std_logic;

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

BEGIN

  -- Instantiate the Unit Under Test (UUT)
   uut: fastcount PORT MAP (
          SDAIN => SDAIN,
          SDAOUT => SDAOUT,
       SCL => SCL,

          puls => puls
        );

   -- Clock process definitions
--   clk_process :process
--   begin
--    clk <= '0';
--    wait for clk_period/2;
--    clk <= '1';
--    wait for clk_period/2;
--   end process;

  SCL_process :process
   begin
    SCL <= '0';
    wait for clk_period/2;
    SCL <= '1';
    wait for clk_period/2;
   end process;


dummy : process
begin
    while( 1 = 1) loop
    wait for 200 ns;
    SDAIN <= '1';
    SDAOUT <= SDAIN;
    wait for 200 ns;
    SDAIN <= '0';
    SDAOUT <= SDAIN;
    end loop;
end process;

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


Lesenswert?

> doch sdaout wird noch immer als undefined angezeigt
Weil das ein Ausgang ist:
    SDAOUT : out  STD_LOGIC;
Geht sowas nicht ohne Konflikte:
    SDAOUT <= SDAIN;
Du kannst nicht auf ein Ausgangssignal deiner Komponente schreiben.

von FPGA (Gast)


Lesenswert?

Danke für den Hinweis !
.....aber selbst wenn ich SDAOUT auskommentiere wird er noch immer als 
undefiniert(rot) angezeigt

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


Lesenswert?

Da hilft nur Raten:
Vermutlich wird aus der Komponente fastcount noch nichts ausgegeben...

von FPGA (Gast)


Lesenswert?

Danke supergeil du bist ein schatz !!!

von FPGA (Gast)


Lesenswert?

Das war der grund jetzte funktionierts

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.