mikrocontroller.net

Forum: FPGA, VHDL & Co. Signal zu früh


Autor: VHDL'er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kann mir jemand sagen wo mein Denkfehler liegt?

Nach 800 pixelpunkte wird pixelpunkte auf 0 gesetzt und zeile erhöht. 
Das Problem ist, dass vsync zu früh auf 0 gesetzt wird.

Vsync wird nicht bei Zeile=0 auf 0 gesetzt sondern mitten Zeile=524
process (clk_48_i, reset_i)
begin
  if reset_i = '0' then
    pixelpunkte_s <= (others => '0');
    zeile_s <= (others => '0');
  elsif clk_48_i'event and clk_48_i = '1' then
    if clk_24_s = '1' then
      pixelpunkte_s <= pixelpunkte_s + 1;
      if pixelpunkte_s = 799 then
        pixelpunkte_s <= (others => '0');
        zeile_s <= zeile_s + '1';
        if zeile_s = 524 then
          zeile_s <= (others => '0');
        end if;
      end if;
    end if;
  end if;
end process;
process (clk_48_i, reset_i)
begin
  if reset_i = '0' then
    vsync_o <= '1';
  elsif clk_48_i'event and clk_48_i = '1' then
    if clk_24_s = '1' then
      if zeile_s = 524 then
        vsync_o <= '0';
      else
        vsync_o <= '1';
      end if;
    end if;
  end if;
end process;

MfG

Autor: Schrotty (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na du schreibst ja auch:

      if zeile_s = 524 then
        vsync_o <= '0';

Autor: VHDL'er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich es so schreibe wird es auch richtig ausgelöst. Das Signal wird 
immer am Ende des Prozesses ausgeführt.

Signal_o wird 0 wenn pixelpunkte=0;
 if pixelpunkte_s = 799 then
        pixelpunkte_s <= (others => '0');
 if clk_24_s = '1' then
      if pixelpunkte = 799 then
        signal_o <= '0';
      else
        signal_o <= '1';
      end if;
    end if;

Wenn ich aber den oberen Code benütze wird v_signal zu früh ausgelöst.
Signal_o hat die fallende Flanke bei pixelpunkte=0.

Aber v_sync hat die fallende Flanke wenn signal_o die steigende Flanke 
hat.
Somit haben v_sync und signal_o nicht gemeinsam die fallende Flanke.

Signal_o passt- bei Pixelpunkte=0 fällt die Flanke. Aber vsync hat die 
fallende Flanke im Bereich vsync=524 und nicht vsync=0

Ich hoffe du verstehst was ich meine

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

Bewertung
0 lesenswert
nicht lesenswert
>> Vsync wird nicht bei Zeile=0 auf 0 gesetzt sondern mitten Zeile=524
Wenn vsync_o an zeile_s hängt, warum machst du die Verwaltung dieses 
Signals nicht dort rein, wo die Zeilen auch verwaltet werden?
    if clk_24_s = '1' then
      pixelpunkte_s <= pixelpunkte_s + 1;
      if pixelpunkte_s = 799 then
        pixelpunkte_s <= (others => '0');
        zeile_s <= zeile_s + '1';
        vsync_o <= '1';                  ------------
        if zeile_s = 524 then
          zeile_s <= (others => '0');
          vsync_o <= '0';                ------------
        end if;
      end if;
    end if;
Dann hast du diese seltsamen Latency-Effekte nicht.

BTW:
Das Wort
> Pixelpunkte
ist noch schlimmer als LCD-Display... :-/

Autor: D. I. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> BTW:
> Das Wort
>> Pixelpunkte
> ist noch schlimmer als LCD-Display... :-/

Oder ganze SMS verschicken ;)

Autor: VHDL'er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wenn vsync_o an zeile_s hängt, warum machst du die Verwaltung dieses
>Signals nicht dort rein, wo die Zeilen auch verwaltet werden?

Da mir nach Überlegung einfacher war dass der eine Prozess zählt und ein 
anderer Prozess überprüft ob es den Wert erreicht hat und dann das 
Signal auslöst.

So wie du gemeint hast, hat es funktioniert. Ich finde es aber trotzdem 
komisch weil es bei mir solche Probleme gemacht hat.

Es läuft ja letztendlich alles parallel ab und ob ich den Code in den 
einen Prozess schreibe oder einen Prozess extra dafür schreibe hätte ich 
gemeint ist egal.

Ich habe nämlich noch einen process wo hsync überprüft wird- da hat es 
funktioniert.


>> Pixelpunkte
>ist noch schlimmer als LCD-Display... :-/

Ob ich jetzt schreibe Pixelpunkte und Pixelzeile oder wie auch immer ist 
letztendlich egal. Wichtig ist dass der Code funktioniert und dass man 
sich auskennt. Man darf nicht alles so verkrampft sehen ;-)

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

Bewertung
0 lesenswert
nicht lesenswert
VHDL'er schrieb:
> einen Prozess extra dafür schreibe hätte ich gemeint ist egal.
Ist es auch, aber du hattest in deinem ersten Prozess andere Bedingungen 
für das Weiterschalten der Zeile als in deinem 2. Prozess für die 
Erzeugung des vsync Signals:
    if clk_24_s = '1' then
      :
      if pixelpunkte_s = 799 then
        :
        if zeile_s = 524 then
          zeile_s <= (others => '0');
        end if;
      end if;
    end if;
:
:
    if clk_24_s = '1' then 
      :      -- hier fehlt die Abfrage nach den Pixelpunkten...
      if zeile_s = 524 then
        vsync_o <= '0';
      else
        vsync_o <= '1';
      end if;
    end if;

Autor: VHDL'er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beides läuft ja parallel ab. Somit kann zeile erst 524 werden wenn 
pixelpunkte=799 ist. Gilt das nicht auch für den anderen Prozess.

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

Bewertung
0 lesenswert
nicht lesenswert
> Somit kann zeile erst 524 werden
Es geht eher darum, wann die zeile 0 werden kann, und wann vsync 0 
werden wird.
Das sollten nach deinem Wunsch eigentlich die selben Zeitpunkte sein, 
aber die Bedingung für die Umschlatung von vsync und zeile sind 
andere...

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.