Forum: FPGA, VHDL & Co. Verständnis Problem Pipeline/Simulation


von Peter Z. (Gast)


Angehängte Dateien:

Lesenswert?

Hi,
der folgende Code soll eine Operation, hier Minimum, durchführen, das 
Ergebnis in ein FF packen und im nächsten Zyklus ausgeben.
Allerdings kann man bei der Simulation erkennen das von TwoIN bis TwoFF 
schon ein ClkZyklus vergeht und dann noch einer von TwoFF bis TwoOUT.
Meine Vermutung ist, dass in der Simulation neue Daten am Eingang(TwoIN) 
erst bei T + deltaT anliegen und noch mit den Daten zum Zeitpunkt T 
gerechnet wird. Kann dies wer bestätigen oder mich berichtigen?
Danke!
1
  signal sMinTemp      : STD_ULOGIC_VECTOR(gDataWidth - 1 downto 0); --FF
2
begin
3
  process (iAppClock, iAppReset, iAppEnable) is
4
  begin
5
    if (rising_edge(iAppClock)) then
6
      if (iAppReset = '1' or iAppEnable = '0') then
7
        sMinTemp <= (others => '-');
8
        oMin <= (others => '-');  
9
      else
10
        oMin <= sMinTemp; --OUT
11
        if (unsigned(iDatumA) <= unsigned(iDatumB)) then
12
          sMinTemp <= iDatumA; --IN
13
        else
14
          sMinTemp <= iDatumB; --IN
15
        end if;
16
      end if;
17
    end if;
18
  end process;

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


Lesenswert?

Peter Z. schrieb:
> oMin <= (others => '-');
Mal davon abgesehen, dass sich das nicht synthetisieren lässt: wenn's 
sowieso egal ist, warum dann ein Reset?

Zur Frage: die Simu sieht gut aus. Wenn sich ein Signal mit dem Takt 
ändert, dann kann es hier natürlich erst mit dem nächsten Takt 
irgendeine Änderung bewirken...

: Bearbeitet durch Moderator
von Peter Z. (Gast)


Lesenswert?

Danke. Also wenn ichs richtig verstanden habe ist dies schon Logik + FF.
1
process (iAppClock, iAppReset, iAppEnable) is
2
begin
3
  if (rising_edge(iAppClock)) then
4
    if (iAppReset = '1' or iAppEnable = '0') then
5
      oMin <= (others => '0');  
6
    else
7
      if (unsigned(iDatumA) <= unsigned(iDatumB)) then
8
        oMin <= iDatumA; --IN
9
      else
10
        oMin <= iDatumB; --IN
11
      end if;
12
    end if;
13
  end if;
14
end process;

von Peter Z. (Gast)


Lesenswert?

Ich denke dannach hab ich eigentlich gesucht: Erst Operation dann FF.
Macht man das so?
1
  DelayOperation: if (gDelayed = true) generate
2
    signal sMinTemp      : STD_ULOGIC_VECTOR(gDataWidth - 1 downto 0);
3
  begin
4
    process (iDatumA, iDatumB) is
5
    begin
6
      if (unsigned(iDatumA) <= unsigned(iDatumB)) then
7
        sMinTemp <= iDatumA;
8
      else
9
        sMinTemp <= iDatumB;
10
      end if;
11
    end process;
12
13
    process (iAppClock, iAppReset, iAppEnable) is
14
    begin
15
      if (rising_edge(iAppClock)) then
16
        if (iAppReset = '1' or iAppEnable = '0') then
17
          oMin <= (others => '0');    
18
        else
19
          oMin <= sMinTemp;
20
        end if;
21
      end if;
22
    end process;
23
  end generate DelayOperation;

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


Lesenswert?

Peter Z. schrieb:
> Erst Operation dann FF.
> Macht man das so?
Kann man, wenn's hilft oder nötig ist...

Aber ich würde diesen Vergleich nebenläufig schreiben. Man wird ja nicht 
nach Lines of Code bezahlt.

von Peter Z. (Gast)


Lesenswert?

Top. Danke (:

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.