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


von VHDL'er (Gast)


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
1
process (clk_48_i, reset_i)
2
begin
3
  if reset_i = '0' then
4
    pixelpunkte_s <= (others => '0');
5
    zeile_s <= (others => '0');
6
  elsif clk_48_i'event and clk_48_i = '1' then
7
    if clk_24_s = '1' then
8
      pixelpunkte_s <= pixelpunkte_s + 1;
9
      if pixelpunkte_s = 799 then
10
        pixelpunkte_s <= (others => '0');
11
        zeile_s <= zeile_s + '1';
12
        if zeile_s = 524 then
13
          zeile_s <= (others => '0');
14
        end if;
15
      end if;
16
    end if;
17
  end if;
18
end process;
1
process (clk_48_i, reset_i)
2
begin
3
  if reset_i = '0' then
4
    vsync_o <= '1';
5
  elsif clk_48_i'event and clk_48_i = '1' then
6
    if clk_24_s = '1' then
7
      if zeile_s = 524 then
8
        vsync_o <= '0';
9
      else
10
        vsync_o <= '1';
11
      end if;
12
    end if;
13
  end if;
14
end process;

MfG

von Schrotty (Gast)


Lesenswert?

Na du schreibst ja auch:

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

von VHDL'er (Gast)


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;
1
 if pixelpunkte_s = 799 then
2
        pixelpunkte_s <= (others => '0');
1
 if clk_24_s = '1' then
2
      if pixelpunkte = 799 then
3
        signal_o <= '0';
4
      else
5
        signal_o <= '1';
6
      end if;
7
    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

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


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?
1
    if clk_24_s = '1' then
2
      pixelpunkte_s <= pixelpunkte_s + 1;
3
      if pixelpunkte_s = 799 then
4
        pixelpunkte_s <= (others => '0');
5
        zeile_s <= zeile_s + '1';
6
        vsync_o <= '1';                  ------------
7
        if zeile_s = 524 then
8
          zeile_s <= (others => '0');
9
          vsync_o <= '0';                ------------
10
        end if;
11
      end if;
12
    end if;
Dann hast du diese seltsamen Latency-Effekte nicht.

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

von D. I. (Gast)


Lesenswert?

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

Oder ganze SMS verschicken ;)

von VHDL'er (Gast)


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 ;-)

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


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:
1
    if clk_24_s = '1' then
2
      :
3
      if pixelpunkte_s = 799 then
4
        :
5
        if zeile_s = 524 then
6
          zeile_s <= (others => '0');
7
        end if;
8
      end if;
9
    end if;
10
:
11
:
12
    if clk_24_s = '1' then 
13
      :      -- hier fehlt die Abfrage nach den Pixelpunkten...
14
      if zeile_s = 524 then
15
        vsync_o <= '0';
16
      else
17
        vsync_o <= '1';
18
      end if;
19
    end if;

von VHDL'er (Gast)


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.

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


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...

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.