Forum: FPGA, VHDL & Co. Signale in ModelSIM werden falsch dargestellt (?)


von Gast (Gast)


Lesenswert?

Kennt jemand das Problem, daß Signale, die infolge eines Eintaktvorgangs 
eigentlich einen Takt verzögern ändern müssten, bereits zum Takt mit der 
Quelle mitändern ?

Es scheint ein Darstellungsproblem zu sein, denn die Reaktion auf das 
scheinbar falsche Signal stimmt.

Woran kann es liegen ?

von Falk B. (falk)


Lesenswert?

@ Gast (Gast)

>Kennt jemand das Problem, daß Signale, die infolge eines Eintaktvorgangs
>eigentlich einen Takt verzögern ändern müssten, bereits zum Takt mit der
>Quelle mitändern ?

Ja.

>Es scheint ein Darstellungsproblem zu sein,

Nö.

> denn die Reaktion auf das
>scheinbar falsche Signal stimmt.

>Woran kann es liegen ?

Deine Testbench ist falsch. Deine Eingangssignale dürfen sich erst NACH 
der Taktflanke ändern, 10ps reichen schon. Wenn sie sich genau parallel 
mit der Taktflanke ändern knallts.

MFG
Falk

von Gast (Gast)


Lesenswert?

Nein, die TB ist in Ordnung. Es passiert auch nur bei DIESEM Signal, 
alles andere in der Schaltung läuft. Ich versuche das mal zu 
extrahieren, auf AE/XE zu packen und zu posten.

von Gast (Gast)


Lesenswert?

Habe es mal rauskopiert und entschärft. So sieht der Code aus:
1
input: process (reset, clk)                
2
begin
3
  if (reset = '1') then
4
    instream <= (others => '1');
5
    wen <= '0';
6
    error <= '0';
7
  elsif rising_edge(clk) then                
8
    if (localreset = '1') then      
9
      instream <= (others => '1');
10
      wen <= '0';
11
      error <= '0';
12
    elsif (data_new = '1') then -- new data coming
13
      if (ram_full = '1') then -- ok to write ?      
14
        instream <= (others => '1');
15
        wen <= '0';
16
        error <= '1';              
17
      else -- ram not full, write !
18
        if (test = '1') then -- select data
19
          instream <= test_data;
20
        else
21
          instream <= datainput;  
22
        end if;
23
        wen <= '1';
24
        error <= '0';
25
      end if;
26
    else -- no local reset
27
      instream <= (others => '1');      
28
      wen <= '0';
29
    end if;
30
  end if;
31
end process input;

Sowohl instream als auch wen wechseln mit der Taktflanke, wenn auch das 
data_new ändert und nicht, wenn es bereits 1 war, also einen Takt 
später- Ich sehe nur noch nicht, ob es nicht das datanew ist, das zu 
spät dargestellt wird.

Die Reaktion auf den localreset funktioniert, wie erwartet: localreset 
geht auf 1, die Signale bleiben und wechseln erst zur nächsten 
Taktflanke auf Startzustand. Auch der asynchrone Reset läuft. Dieser 
kommt, wie auch das localreset und der clk aus der testbench, während 
das datanew aus einer anderen Schaltung produziert wird. Das sieht aber 
logisch und korrekt aus. (?)

von Mathi (Gast)


Lesenswert?

Ich versuche mal Dein Problem zusammen zu fassen:
instream und wen ändern sich mit der gleichen Flanke wie auch data_new, 
obwohl sie sich erst ändern sollen wenn data_new 1 ist?

Die Frage ist, woher kommt das data_new? Wird es in der gleichen 
Taktdomäne erzeugt?

von Gast (Gast)


Lesenswert?

Ja, ist ein file. Dierekter Ausgang des FF mit demselben Takt. Ich 
reduziere / anonymisiere jetzt mal das Design und die Testbench und 
simuliere es noch mal. Wenn das soweit ist, dann kriegt das Mentor als 
Hausaufgabe. Es ist übrigens nicht das erste mal, dass ich sowas habe.

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.