www.mikrocontroller.net

Forum: FPGA, VHDL & Co. VGA signal wird vom bildschirm nicht erkannt


Autor: Fragesteller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich habe eine beispielprojekt für die ausgabe eines bildes über vga 
kopiert und möchte es nun auf meinm dev. board zum laufen bringen.
simulation und compilieren ging einwandfrei, jedoch bekommt mein 
bildschirm kein signal vom board, wenn ich das board programmiert habe.


die Frequenz der clock scheint nicht schuld zu sein. eine falsche 
zuordnung der pins kann auch ausgeschlossen werden. mehrmals überprüft.

Anbei das projekt. Es soll einfach nur ein rechteck auf den bildschirm 
gezeichnet werden. ich kann einfach keinen fehler finden.
eventuell sieht jemand von euch eine auffälligkeit. ich bin schon 
langsam am verzweifeln. ich finde einfach keinen fehler.
ich habe eine DE2 board von altera mit cyclone II fpga.
ENTITY clockmodule IS
  PORT(
    reset    : in std_logic;      -- reset    
    clk50_in  : IN std_logic;
    
    VGA_R    : OUT std_logic_vector (9 downto 0);
    VGA_G    : OUT std_logic_vector (9 downto 0);
    VGA_B    : OUT std_logic_vector (9 downto 0);
    VGA_HS_out  : OUT std_logic;
    VGA_VS_out  : OUT std_logic;
        
    VGA_CLK    : OUT std_logic;
    VGA_BLANK  : OUT std_logic;
    VGA_SYNC  : OUT std_logic
  );
END clockmodule;

ARCHITECTURE behaviour OF clockmodule IS

  -- Video parameters
  constant HTOTAL : integer := 800;
  constant HSYNC : integer := 96;
  constant HBACK_PORCH : integer := 48;
  constant HACTIVE : integer := 640;
  constant HFRONT_PORCH : integer := 16;
  constant VTOTAL : integer := 525;
  constant VSYNC : integer := 2;
  constant VBACK_PORCH : integer := 33;
  constant VACTIVE : integer := 480;
  constant VFRONT_PORCH : integer := 10;
  constant RECTANGLE_HSTART : integer := 100;
  constant RECTANGLE_HEND : integer := 540;
  constant RECTANGLE_VSTART : integer := 100;
  constant RECTANGLE_VEND : integer := 380;

  signal clk25        : std_logic; -- 25MHz clock -> should be 25.125 MHz
  
  -- Horizontal position (0-800)
  signal horizontal_counter  : std_logic_vector (9 downto 0);
  
  -- Vertical position (0-524)
  signal vertical_counter    : std_logic_vector (9 downto 0);
  
  
  signal EndOfLine, EndOfField : std_logic;
  signal vga_hblank, vga_hsync, vga_vblank, vga_vsync : std_logic; -- Sync. signals
  signal rectangle_h, rectangle_v, rectangle : std_logic; -- rectangle area
begin

  -- generate a 25 MHz clock
  process (clk50_in)
  begin 
    if clk50_in'event and clk50_in = '1' then
      if (clk25 = '0') then
        clk25 <= '1';
      else
        clk25 <= '0';
      end if;
    end if;
  end process;


  HCounter : process (clk25, reset)
  begin
    if reset = '1' then
      horizontal_counter <= (others => '0');
    elsif clk25'event and clk25 = '1' then
      if EndOfLine = '1' then
        horizontal_counter <= (others => '0');
      else
        horizontal_counter <= horizontal_counter + 1;
      end if;
    end if;
  end process HCounter;

  EndOfLine <= '1' when horizontal_counter = HTOTAL - 1 else '0';

  VCounter: process (clk25, reset)
  begin
    if reset = '1' then
      vertical_counter <= (others => '0');
    elsif clk25'event and clk25 = '1' then
      if EndOfLine = '1' then
        if EndOfField = '1' then
          vertical_counter <= (others => '0');
        else
          vertical_counter <= vertical_counter + 1;
        end if;
      end if;
    end if;
  end process VCounter;



  HSyncGen : process (clk25, reset)
  begin
    if reset = '1' then
      vga_hsync <= '1';
    elsif clk25'event and clk25 = '1' then
      if EndOfLine = '1' then
        vga_hsync <= '1';
      elsif horizontal_counter = HSYNC - 1 then
        vga_hsync <= '0';
      end if;
    end if;
  end process HSyncGen;
  
  
  HBlankGen : process (clk25, reset)
  begin
    if reset = '1' then
      vga_hblank <= '1';
    elsif clk25'event and clk25 = '1' then
      if horizontal_counter = HSYNC + HBACK_PORCH then
        vga_hblank <= '0';
      elsif horizontal_counter = HSYNC + HBACK_PORCH + HACTIVE then
        vga_hblank <= '1';
      end if;
    end if;
  end process HBlankGen;



  -- Vertical Signals!  
  VSyncGen : process (clk25, reset)
  begin
    if reset = '1' then
      vga_vsync <= '1';
    elsif clk25'event and clk25 = '1' then
      if EndOfLine ='1' then
        if EndOfField = '1' then
          vga_vsync <= '1';
        elsif vertical_counter = VSYNC - 1 then
          vga_vsync <= '0';
        end if;
      end if;
    end if;
  end process VSyncGen;
  
  
  VBlankGen : process (clk25, reset)
  begin
    if reset = '1' then
      vga_vblank <= '1';
    elsif clk25'event and clk25 = '1' then
      if EndOfLine = '1' then
        if vertical_counter = VSYNC + VBACK_PORCH - 1 then
          vga_vblank <= '0';
        elsif vertical_counter = VSYNC + VBACK_PORCH + VACTIVE - 1 then
          vga_vblank <= '1';
        end if;
      end if;
    end if;
  end process VBlankGen;


  RectangleHGen : process (clk25, reset)
  begin
    if reset = '1' then
      rectangle_h <= '1';
    elsif clk25'event and clk25 = '1' then
      if horizontal_counter = HSYNC + HBACK_PORCH + RECTANGLE_HSTART then
        rectangle_h <= '1';
      elsif horizontal_counter = HSYNC + HBACK_PORCH + RECTANGLE_HEND then
        rectangle_h <= '0';
      end if;
    end if;
  end process RectangleHGen;
  
  
  RectangleVGen : process (clk25, reset)
  begin
    if reset = '1' then
      rectangle_v <= '0';
    elsif clk25'event and clk25 = '1' then
      if EndOfLine = '1' then
        if vertical_counter = VSYNC + VBACK_PORCH - 1 + RECTANGLE_VSTART then
          rectangle_v <= '1';
        elsif vertical_counter = VSYNC + VBACK_PORCH - 1 + RECTANGLE_VEND then
          rectangle_v <= '0';
        end if;
      end if;
    end if;
  end process RectangleVGen;
  
  
  rectangle <= rectangle_h and rectangle_v;



  VideoOut: process (clk25, reset)
  begin
    if reset = '1' then
      VGA_R <= "0000000000";
      VGA_G <= "0000000000";
      VGA_B <= "0000000000";
    elsif clk25'event and clk25 = '1' then
      if rectangle = '1' then
        VGA_R <= "1111111111";
        VGA_G <= "1111111111";
        VGA_B <= "1111111111";
      elsif vga_hblank = '0' and vga_vblank ='0' then
        VGA_R <= "0000000000";
        VGA_G <= "0000000000";
        VGA_B <= "1111111111";
      else
        VGA_R <= "0000000000";
        VGA_G <= "0000000000";
        VGA_B <= "0000000000";
      end if;
    end if;
  end process VideoOut;
  
  
  VGA_CLK <= clk25;
  VGA_HS_out <= not vga_hsync;
  VGA_VS_out <= not vga_vsync;
  VGA_SYNC <= '0';
  VGA_BLANK <= not (vga_hsync or vga_vsync);


end behaviour;


Autor: mac4ever (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab zwar jetzt keine Fehlersuche betrieben, aber hier ist eine 
funktionierende VGA-Ausgabe die ich auch schon selbst mal getestet habe.
Vielleicht mal drüber fliegen und auf deinem Board testen. Für eine 
simple VGA-Ausgabe hat deine Lösung auf jedenfall sehr viel Text :)

http://derepas.com/fabrice/hard/#squares

Autor: Andreas Voggeneder (avg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du generierst das Signal "EndOfField" nicht in Deinem Design.
Es wird zwar in mehreren Prozessen verarbeitet (gelesen) aber nirgens 
erzeugt.
Dadurch funktioniert auch die VSYNC-Generierung nicht

Autor: Fragesteller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hoppla,

das habe ich vergessen zu posten:
EndOfField <= '1' when vertical_counter = VTOTAL - 1 else '0';


dieses andere tutorial habe ich auch gefunden - es ist zwar für ein 
anderes board (das ich gepostet habe ich genau für mein board) und es 
funktioniert auch nicht.

ich weiß einfach nicht wo der fehler liegen könnte.


beim compilieren bekomme ich nur ein warning:
Warning (13410): Pin "VGA_SYNC" is stuck at GND

Autor: Nephilim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn dort die zeile
VGA_SYNC <= '0';

steht, dann wundert mich die warning eigentlich nicht.

Autor: Fragesteller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie dem auch sei,

Bei dem kurzen Projekt von "mac4ever" reagiert mein bildschirm 
wenigstens. er bekommt ein signal, wennauch nichts außer schwarz 
angezeigt wird.

bei "meinem" projekt (tutorial von uni columbia) bekommt der bildschirm 
kein signal.

lg

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

Bewertung
0 lesenswert
nicht lesenswert
> bei "meinem" projekt bekommt der bildschirm kein signal.
Gar keines? Woher weißt du das? Oder fehlt nur eines?
Hast du das mit einem Oszi/Logic-Analyzer kontrolliert?

Hast du schon mal eine Testbench laufen lassen? Eine Waveform zu 
bekommen ist in deinem Fall richtig einfach, du mußt von aussen nur den 
clk50_in anlegen. Dann könntest du schon mal die Zähler usw... 
beobachten.

Das mit dem VGA_SYNC würde ich an deiner Stelle auch noch mal genauer 
anschauen ;-)

Autor: Hansi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert der oben angegebene Code ?

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

Bewertung
0 lesenswert
nicht lesenswert
Hansi schrieb:
> Funktioniert der oben angegebene Code ?
Davon würde ich nicht ausgehen... :-/

Schon, weil so kein Takt erzeugt werden sollte:
    if clk50_in'event and clk50_in = '1' then
      if (clk25 = '0') then
        clk25 <= '1';
      else
        clk25 <= '0';
      end if;
    end if;
Zum teilen von Takten gibt es PLLs/ClockManager...

Autor: Robert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für eine Ausgabe auf IOs reicht der ja schon

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

Bewertung
0 lesenswert
nicht lesenswert
Robert schrieb:
> Für eine Ausgabe auf IOs reicht der ja schon
Schon gesehen: der so erzeugte Takt wird hier aber nicht für eine 
Ausgabe auf IOs verwendet.

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.