VGA controller

Sezione dedicata al linguaggio di descrizione hardware per logiche programmabili

VGA controller

Postby Micos » 14 Apr 2012, 15:05

Ciao a tutti, come state?

ho visto pubblicati alcuni sorgenti in vhdl e volevo contribuire anche io visto che mi sono
messo al''opera per realizzare un controller video vga da interfacciare ad un micro.
Ho preso spunto da alcuni documenti di qualche anno fa di deluca relativi alla generazione dei segnali VGA.

Io sto iniziando strutturando l'interfaccia in questo modo
1) modulo VGA
2) contatore per righe e colonne
3) interfaccia rom contenente le informazioni dei pixel

Intanto rilascio il codice per il modulo VGA sperando che qualcuno possa valutare ed eventualmente
fare qualche appunto per ottimizzare il codice.

Code: Select all
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- clk = 25.275 MHz
-----------------------------------------------------------------------------------
 entity controllo_vga is
    Port ( clk : in  STD_LOGIC;
           hsync : out  STD_LOGIC;
           vsync : out  STD_LOGIC; 
           v_blank: out std_logic;   
           h_blank: out std_logic;
           en_clk :out STD_LOGIC);           
end controllo_vga;
------------------------------------------------------------------------------------
architecture Behavioral of controllo_vga is
   constant max_x : integer := 799;  -- 799 risoluzione orizzontale
   constant max_y : integer := 525;  -- 525 risoluzione verticale

   signal h_counter: integer range 0 to max_x;    -- contatore orizzontale
   signal v_counter: integer range 0 to max_y;    -- contatore verticale
   signal fineriga: std_logic;   
   signal enable_h: std_logic;
   signal enable_v: std_logic;
                
begin     
-- primo contatore per sincronismo orizzontale da 0 a 799
H_contatore:process(clk)     
begin                     
     if rising_edge(clk)  then                  
      if h_counter = max_x then       
         h_counter <= 0;       
         fineriga <='1';       
      else                         
         h_counter <= h_counter + 1;
         fineriga <='0';          -- reset fineriga
                    end if;                     
      else null;
      end if;
end process;   
-- secondo contatore per sincronismo verticale da 0 a 525
V_contatore:process(clk,fineriga)     
begin                     
     if rising_edge(clk)  then      
      if fineriga='1' then
         if v_counter = max_y then       
            v_counter <= 0;                      
         else                           
            v_counter <= v_counter + 1;
         end if;   
      else null;
      end if;
      else null;
      end if;
end process;   
-- processo per generare impulso sincronismo verticale  e orizzontale
process (h_counter,v_counter,enable_h,enable_v) -- solo contatore verticale e orizzontale
begin
       -- Generazione sincronismo orizzontale
      if (h_counter>0 and h_counter <96) then      -- qui genera impulso Hsync tra 1 e 96
            hsync<='0';
      else
            hsync<='1';
      end if;
      
      -- Generazione sincronismo verticale
      if (v_counter>0 and v_counter <3) then        -- qui genera impulso Vsync tra 1 e 2
         vsync <='0';
      else
         vsync <='1';
      end if;
            
       -- Segnale enable counter orizzontale 600 pixel
      --                0                  599
      if (h_counter >=152) and (h_counter<=751) then     -- (160,759) qui creo un enable counter orizzontale
             enable_h<='1';            -- per visualizzare pixel (zona display H)                              
      else                                              -- 600 pixel
             enable_h<='0';                                      
      end if;      
       
       -- Segnale enable counter orizzontale 600 pixel
      --                0                  599
      if (h_counter >=152) and (h_counter<=751) then  -- enable counter orizzontale                                              
                  h_blank<='1';
      else                                              -- 600 pixel                    
                  h_blank<='0';   
      end if;      
                       
        -- Segnale di blank verticale e di enable counter verticale
      --              0                  399
      if (v_counter>=70) and (v_counter<=469) THEN    -- (71, 470) qui creo un enable counter verticale
             enable_v<='1';            -- per visualizzare pixel (zona display V)
              v_blank<='1';
      else
                  enable_v<='0';
                   v_blank<='0';                           -- qui posso scrivere sulla ram
      end if;   
       
      -- Segnale uscita Enable clock
              IF (enable_h='1') and (enable_v='1') then   -- qui mi creo un enable display
                                                   --per il verticale e orizzontale
                 en_clk <='1'; 
              else
                 en_clk <='0';   
              end if;         
end process;
end Behavioral;

Last edited by Micos on 25 May 2012, 11:13, edited 1 time in total.
Micos
 
Posts: 36
Joined: 30 Jun 2011, 08:15
Location: Pisa

Re: VGA controller

Postby flz47655 » 15 Apr 2012, 16:43

Ciao, tutto bene ;)
Non sono ancora passato a studiare un controller VGA ma sembra molto interessante.

Per curiosità la risoluzione del tuo controller è 800x526? Mi sembra un po' atipica..

Al momento purtroppo non posso darti grandi consigli perchè sono un beginner di VHDL però continua a postare, l'argomento è molto interessante. Al momento ho solo letto tempo fa un articolo di una rivista che parlava dell'argomento...

Che scheda di sviluppo utilizzi?

Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: VGA controller

Postby Micos » 15 Apr 2012, 18:18

ciao a tutti,

la schedina che uso è molto semplice e monta una EP1C6TC144C8.

La risoluzione prevista è di 600 x 400 con 8 bit colore.
Per memorizzare una pagina video di 600x400x8bit occorrono quindi 240.000 byte di memoria.

Ciao a tutti e buona serata
Micos
 
Posts: 36
Joined: 30 Jun 2011, 08:15
Location: Pisa

Re: VGA controller

Postby flz47655 » 19 Apr 2012, 20:41

Ciao, per curiosità che modello è la dev-board?
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: VGA controller (PONG)

Postby Micos » 25 May 2012, 10:57

Sto per imbattermi in un progetto che per voi sarà magari abbastanza semplice, ma per me, credo, sarà abbastanza complesso.
Voglio realizzare un semplice gioco del Pong con una fpga.
Il gioco dovrebbe visualizzarsi su un monitor VGA e dovrei comandare le racchette con qualcosa di semplice tipo pulsanti o joystick.

Avete qualche suggerimento da darmi a tal proposito?
pensate lo si possa realizzare in modo puramente HW o è meglio se lo gestisco con un microprocessore esterno, tipo PIC o AVR,
lasciando alla fpga il solo compito della generazione dei sincronismi e dei colori?
Sto incontrando non poche difficoltà.

Qualcuno di voi ha qualche esperienza?
Micos
 
Posts: 36
Joined: 30 Jun 2011, 08:15
Location: Pisa

Re: VGA controller

Postby flz47655 » 25 May 2012, 11:05

Non ho mai provato a fare qualcosa del genere ma io personalmente userei una soft-cpu o un micro esterno per la logica di gioco, più che altro per rendere più modulare il progetto
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: VGA controller

Postby Micos » 25 May 2012, 11:10

Hai già implementato un soft-micro su fpga e se si quale...

Non ho la più pallida idea di come fare.
So che se ce sono alcuni open ma la maggior parte è per xilinx e non per altera e io vorrei usare alt.
Micos
 
Posts: 36
Joined: 30 Jun 2011, 08:15
Location: Pisa

Re: VGA controller

Postby flz47655 » 25 May 2012, 11:19

Ho implementato seguendo un tutorial un soft-core NIOS II su Cyclone IV (una DE0-Nano che aveva tra l'altro il tutorial), se hai fretta ti consiglio di usare un micro col quale ti trovi bene e lasciare alla FPGA solamente alcuni compiti tra cui la generazione del segnale video, mi ricordo che seguendo passo passo le istruzioni ci avevo messo 2 ore per mettere su questo soft-core e farci girare un programmino che tra l'altro aveva pochissima memoria a disposizione a meno di non usare una ram esterna

Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: VGA controller

Postby Micos » 25 May 2012, 11:36

Si ho sentito parlare di Nios ma per implementarlo ho capito che hai bisogno di una architettura completa (una board) con un sacco di periferiche esterne, ram, e tanto altro. Io invece vorrei mettere tutto su una unica fpga a meno di una piccola memoria esterna per la programmazione.

Ho visto qualcosa su nios, ma sempre il classico "led blink", "hello world" e niente di più, non capisco il perchè.
Penso che si possa fare molto di più con un micro di quel tipo.
Micos
 
Posts: 36
Joined: 30 Jun 2011, 08:15
Location: Pisa

Re: VGA controller

Postby flz47655 » 25 May 2012, 11:42

Le periferiche esterne sono opzionali, puoi anche creare la ram tramite dei flip-flop della FPGA ma è estremamente inefficace perché ne hai molto pochi a disposizione.

Ti consiglio se non vuoi mettere una RAM esterna di usare un micro a questo punto per il programma, ti rimangono un mucchio di risorse sulla FPGA per implementare magari alcuni algoritmi particolarmente pesanti sul micro (anche se con ping-pong non penso che avrai grandi problemi se scegli il micro giusto), inoltre se scegli un micro con ADC puoi agganciarci direttamente il joystick senza ADC esterni

Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16

Re: VGA controller

Postby deluca » 26 May 2012, 14:52

Ancora non avevo partecipato a questo topic, tralaltro è un argomento che mi piace e mi appassiona da sempre.
Il PONG segnò la mia vita professionale e fu l'inizio della mia passione per l'elettronica.

Erano gli anni '70 (1975 forse) e per la prima volta vidi il primo video-gioco. Un tempo si giocava molto al flipper (pinball) che insieme alla slot-machine e al bingo erano gli unici giuochi elettromeccanici che si vedevano nelle sale. Non c'era neppure l'ombra di giochi elettronici.
Un pomeriggio d'estate due grossi uomini introdussero un grosso cassone in legno con un televisore incassato, trasportandolo a braccia, nella sala giochi che io da piccolo frequentavo (ehm illegalmente ... ero minorenne). Una partita a due si pagava 50 lire (forse 100 non ricordo) e se eri bravo potevi giocare per ore ed ore con l'incazzatura del gestore.
Quel gioco cambiò la mia vita. A tutti i costi volevo vedere e capire come funzionava, infatti, non appena venivano i tizzi per svuotare il cassetto delle monete, io cercavo di inserire la testa dentro il cassone per vedere la scheda elettronica che faceva funzionare il tutto.
Era una schedona con centinaia di cosetti neri e un migliaio di fili.

Col tempo ne arrivarono altri sempre più sofisticati ma il Pong per anni rimase il gioco preferito.
Nel 1977 o forse dopo, mio padre me ne ragalò uno domestico a colori da collegare alla TV che ancora custodisco gelosemente che potete visionare qui e che fa parte della mia piccola collezione di home computer.
http://www.delucagiovanni.com/__pingpong.html

Il pong è davvero uno dei più semplici video-games che nella sua semplicità racchiude molti aspetti
importanti e complessi della programmazione in vhdl (se lo sviluppate in hw ed in modo digitale, intendo).

----------------------------
Per farla breve, qualche anno fa conducendo un corso sulle logiche programmabili mi posi come meta di far realizzare ai ragazzi un gioco del pong implementato su fpga.
Qui il link ove è possibile visionare il video:


La strada non è semplice, ma nemmeno tanto complessa, si tratta banalmente di generare i sincronismi video VGA, un background a colori, 3 sprite di cui 2 le bat (racchette) e una pallina che in questo caso è il vecchio fantasmino di pac-man, poi implementare un algoritmo per l'alpha-blending o un multiplex, ed infine un semplice generatore di suoni monotonale per il blip, il controllo dei pulsanti up/down e la gestione hardware delle collisioni tra i bat e la pallina.
La gestione degli sprite e la matematica per il rimbalzo la si può realizzare via hw o affidare ad un micro interno o esterno come nel caso della applicazione mostrata nel video. Infine, se volete cambiare il background potete creare tanti sfondi e metterli caricarli su una sd-card sotto forma di immagini bitmapped.

Se volete conoscere la storia del Pong e dei VideoGames allora date un'occhiata a questo sito:
http://www.pong-story.com

Qui il video dell'inventore, Ralph Baer, mentre gioca con la prima versione di pong, il Brown-Box.


Alla prossima, e ciao a tutti.
Ciao
Il mio sito: http://www.delucagiovanni.com ......e la chat: chat/
User avatar
deluca
Site Admin
 
Posts: 1104
Joined: 19 Jun 2011, 10:44
Location: 95123 - Catania (Italy)

Re: VGA controller

Postby flz47655 » 26 May 2012, 15:05

Ciao Micos,
La realizzazione totalmente in HW deve dare una soddisfazione senza pari, ma devi essere molto tenace e deciso e sapere bene VHDL.

Materiale non manca:
http://www.fpga4fun.com/PongGame.html
http://www1bpt.bridgeport.edu/sed/proje ... gpong.html
http://www.cis.jhu.edu/~gagan/Data/fpga_report.pdf

Ne trovi tanto altro ancora, sembra che tutti quelli che fanno FPGA giocano i ping-pong :D
Ciao
flz47655
 
Posts: 639
Joined: 19 Jan 2012, 21:16


Return to VHDL x FPGA

Who is online

Users browsing this forum: No registered users and 2 guests