Signal zu früh

Gast #1657708
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
Gast #1658308
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
Moderator (Firma: Titel) Persönliche Seite #1658368
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... :-/
Gast #1658494
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 ;-)
Moderator (Firma: Titel) Persönliche Seite #1658521
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren