www.mikrocontroller.net

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


Autor: Guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
IF (synfrei'EVENT AND synfrei='1')THEN
synstart<='1';
--ELSE
--synstart<='0';
end if;

if synfrei = '0' then
synstart<='0';
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

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde es in etwa so machen:
IF rising_edge(clk) THEN
    syn_saved <= synfrei;
end if;

synstart <= synfrei & not syn_saved;
Siehe auch:
http://www.ibrtses.com/electronics/fpgabasic.html


Rick

Autor: +++ (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Daniel R. (daniel_r)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: Ranjeet Kuruvilla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ranjet Kuruvilla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ranjet Kuruvilla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ranjet Kuruvilla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ranjet Kuruvilla (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?
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.
   if rising_edge(clk) THEN
     if (FULL='0' and FULL_OLD='1') or (EMPTY='0' AND EMPTY_OLD='1') then
       DATA_VALID<='1';
     end if;               -- <<< das hier
     if DATA_VALID='1' then
       DATA_VALID<='0';
     end if;
     FULL_OLD  <= FULL;    -- <<< das hier
     EMPTY_OLD <= ENPTY;   -- <<< das hier
   end if;

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.