Forum: FPGA, VHDL & Co. [VHDL] kurzer "puls"


von Guest (Gast)


Lesenswert?

Hallo, wie kann ich in vhdl folgendes realisieren:

So ein Siganl liegt Am eingang an:
__________________________---------------------_____-------__________

Und  so soll es am Ausgang aussehen:
__________________________--________________________--______________

?



Das führte leider nicht zum gewünschten Ergebniss:
(wenn ich das auskommentierte statt dem zweiten if verwende geht es auch 
nicht)
1
IF (synfrei'EVENT AND synfrei='1')THEN
2
synstart<='1';
3
--ELSE
4
--synstart<='0';
5
end if;
6
7
if synfrei = '0' then
8
synstart<='0';
9
end if;

Das ganze hat den Sinn, das ich ein Flip Flop brauche, das bei einer 
Taktflanke einen Reset machen soll.
Allerdings kann man das nicht direkt machen(gibt kein FF mit zwei 
Takteingängen).
Deshalb wollte ich ein FF mit Asynchronen Reset machen, bei dem das 
obige Signal anliegt. Vlt. hat jemand eine bessere Idee als diese 
Vorgehensweise.

MFG

von Rick Dangerus (Gast)


Lesenswert?

Ich würde es in etwa so machen:
1
IF rising_edge(clk) THEN
2
    syn_saved <= synfrei;
3
end if;
4
5
synstart <= synfrei & not syn_saved;
Siehe auch:
http://www.ibrtses.com/electronics/fpgabasic.html


Rick

von +++ (Gast)


Lesenswert?

Dein Denken ist zu C-orientiert. In programmierbarer Logik laufen alle 
Prozesse parallel ab. Deine Variante erzeugt einen Spike, dessen Länge 
von den Gatterläufzeiten abhängt.

Ohne ein clk-Signal lässt sich das nicht machen. Man kann kein Monoflop 
auf einen FPGA realisieren.

Ricks variante funktioniert solange sicher, wie dass der Highanteil 
deines Eingangssignals größer als 2 Taktperioden der clk ist.
So wie ich das deinem Text entnehme scheint das ja der Fall zu sein.

von Falk (Gast)


Lesenswert?

@Rick Dangerus


>Ich würde es in etwa so machen:

>IF rising_edge(clk) THEN
>    syn_saved <= synfrei;
>end if;
>synstart <= synfrei & not syn_saved;

Fast richtig. GANZ wichtig ist bei asynchronen Eingängen, dass diese vor 
JEGLICHER Nutzung synchronisert werden. Ausserdem fehlt dein Prozess, 
das verwirrt Anfänger.

process
begin
  if rising_edge(clk) THEN
    syn_saved <= synfrei;
    syn_delayed <= syn_saved;
    synstart <= syn_saved & not syn_delayed;
  end if;
end process;

MFG
Falk

von Daniel R. (daniel_r)


Lesenswert?

@Falk

Dein Code ist auch nur fast richtig. "&" muss durch "and" ersetzt werden 
und clk fehlt in der Sensivity-List.


process(clk)
begin
  if rising_edge(clk) THEN
    syn_saved <= synfrei;
    syn_delayed <= syn_saved;
    synstart <= syn_saved and not syn_delayed;
  end if;
end process;

Daniel

von Falk B. (falk)


Lesenswert?

@ Daniel R.

>Dein Code ist auch nur fast richtig. "&" muss durch "and" ersetzt werden
>und clk fehlt in der Sensivity-List.

Stimmt! War ein Aufmerksamkeitstest ;-)

MfG
Falk


von Ranjeet Kuruvilla (Gast)


Lesenswert?

Hallo
Habe das jetz ausprobiert, aber jetzt bekomme ich Probleme, weil 
data_valid ein out std_logic ist, der Rest abe rnur std_logic.

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


Lesenswert?

Das Ganze hier ist irgendwie
> synfrei
;-)

> Habe das jetz ausprobiert...
Und dafür 1 1/2 Jahre gebraucht?

> ...aber jetzt bekomme ich Probleme, weil data_valid ein out std_logic ist,
> der Rest abe rnur std_logic.
Nein, dein Problem liegt u.A. darin, dass wir hier zum ersten Mal von 
data_valid hören. Ich sehe in meiner Glaskugel: du willst einen Out-Port 
lesen.

Aber du könntest dir und uns helfen, wenn du einfach mal den ganzen 
Code postest. Meinst du nicht auch?

Eine Frage: welches Buch verwendest du zum Lernen von VHDL?

von Ranjet Kuruvilla (Gast)


Lesenswert?

Hallo
Stimmt, hatte ich nicht bedacht.

Also hier die Variablen

entity FIFO is
    Port ( CLK : in STD_LOGIC;
           DATA_IN : in  STD_LOGIC_VECTOR (10 downto 0);
           DATA_OUT : in  STD_LOGIC_VECTOR (10 downto 0);
           WRITE_ENABLE : out  STD_LOGIC;
        READ_ENABLE : out STD_LOGIC;
        DATA_VALID : out STD_LOGIC);
end FIFO;

signal ADDRA, ADDRB : STD_LOGIC_VECTOR (19 downto 0);
signal empty_old, full_old : STD_LOGIC;
signal EMPTY, FULL : STD_LOGIC;
signal WEA : STD_LOGIC;

Was soll also passieren: Wenn empty oder full von 1 auf 0 runtergeht, 
dann soll data_valid für einen Takt auf 1 und danach wieder auf 0 
gesetzt werden.

empty_old und full_old sind dabei die Signale einen Takt davor.

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


Lesenswert?

> DATA_OUT : in  STD_LOGIC_VECTOR (10 downto 0);
der ist aber schon extrem ;-)

> signal ADDRA, ADDRB : STD_LOGIC_VECTOR (19 downto 0);
und der auch: das ist mal ein großer FIFO :-O


> Wenn empty oder full von 1 auf 0 runtergeht,
> dann soll data_valid für einen Takt auf 1 und danach
> wieder auf 0 gesetzt werden.
Viel zu umständlich.
Für einen FIFO verwendest du einfach einen Ringpuffer (in der Größe 2^n, 
also 2, 4, 8,...32, 64, 128...), einen Schreib- und einen Lese-Zähler, 
der gerade so den Index aufnehmen kann (Breite n). Wenn der 
Schreibzähler = Lesezähler ist, ist der FIFO leer. Wenn  Schreibzähler+1 
= Lesezähler, dann ist der FIFO voll, weil der Schreibzähler den 
Lesezähler quasi von unten her einholt.

Das wars.

Mein Tipp:
Sieh dir mal das Thema Ports genauer an.
Sieh dir mal an, wie andere das machen.
VHDL ist schon recht alt, da gibt es sogar schon Bücher dazu.
Siehst du den blauen Strich unter dem Wort VHDL? Klick da mal drauf.

von Ranjet Kuruvilla (Gast)


Lesenswert?

Hey danke für den Tipp. Das Problem ist nur, dass ich das genauso von 
desingen soll!

Daher habe ich keine andere Wahl.

Und nun noch der DATA_VALID Puls.

von Ranjet Kuruvilla (Gast)


Lesenswert?

Hallo
Ich bräuchte wirklich eine Beschreibung der Variablen synfrei, synstart 
und syn_delayed.


Denn wie gesagt: Ich habe die Variablen empty, full, etc.

von Ranjet Kuruvilla (Gast)


Lesenswert?

if rising_edge(clk) THEN
    if (FULL='0' and FULL_OLD='1') or (EMPTY='0' AND EMPTY_OLD='1') then
      DATA_VALID<='1';
    if DATA_VALID='1' then
      DATA_VALID<='0';
    end if;
  end if;

Was ist denn an der Lösung falsch?

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


Lesenswert?

1
   if rising_edge(clk) THEN
2
     if (FULL='0' and FULL_OLD='1') or (EMPTY='0' AND EMPTY_OLD='1') then
3
       DATA_VALID<='1';
4
     if DATA_VALID='1' then
5
       DATA_VALID<='0';
6
     end if;
7
   end if;
> Was ist denn an der Lösung falsch?
Nichts, es fühlt sich nur irgendwie unschön an.

Den 1 Takt VALID erzeugt man am besten dort, wo auch EMPTY und FULL 
erzeugt werden. Aber wenn du mit dem 1 Takt Latency klarkommst, wird das 
schon gehen.
Trotzdem: mach' noch ein
>> end if;
mit rein.
1
   if rising_edge(clk) THEN
2
     if (FULL='0' and FULL_OLD='1') or (EMPTY='0' AND EMPTY_OLD='1') then
3
       DATA_VALID<='1';
4
     end if;               -- <<< das hier
5
     if DATA_VALID='1' then
6
       DATA_VALID<='0';
7
     end if;
8
     FULL_OLD  <= FULL;    -- <<< das hier
9
     EMPTY_OLD <= ENPTY;   -- <<< das hier
10
   end if;

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.