Étape 3: VGA
Pour l’aspect visuel du jeu, nous avons pensé à utiliser les LEDs mais décidé sur l’utilisation de la sortie VGA pour afficher le jeu sur un écran. Pour ce faire, nous avons étudié comment un VGA fonctionne et comment le jury prend en entrée pour convertisseur numérique analogique (DAC). VGA utilise trois entrées pour 3 couleurs différentes qui sont ensuite combinés pour créer une gamme de couleurs et une synchronisation horizontale et verticale qui indique quels pixels soient allumés pour le signal RVB.
Le jury de DE2-115 a ADV7123 vidéo DAC qui prend un signal de 8 bits pour rouge, vert et bleu, un signal de synchronisation-N, un signal blanc-N et la synchronisation verticale et horizontale. Le rouge, le vert et le bleu, une synchronisation-N et un signal blanc-N sont utilisés pour créer le signal RVB analogique avec un signal composante sur le fil vert. La synchro-h et v-sync sont convertis en leurs équivalents analogiques.
Selon la résolution, un espacement différent (les pixels du montant mis en marche par seconde) sera nécessaire. Pour créer ce. Nous avons utilisé une phase verrouiller loop(PLL) mega fonction intégrée Quartus. Cela nous a permis de choisir n’importe quelle fréquence d’horloge. Avec cela, la synchro-h et v-sync peuvent être créés avec sachant combien de pixels large et haut votre résolution et à l’aide d’un compteur.
Ce module prend dans l’horloge, espacement et graphics array et sorties les entrées VGA nécessaires.
CODE adapté du « Prototypage FPGA par Verilog exemples » de Pong P. Chu / /
module vgaout(sw,clk,R,G,B,vga_clk,sync_n,blank_n,vga_HS,vga_VS) ;
entrée sw [2:0] ;
clk d’entrée ;
sortie [7:0] R, G, B ;
sortie vga_clk, sync_n, blank_n, vga_HS, vga_VS ;
reg [7:0] R_temp, G_temp, B_temp ;
écriture de fil, essai ;
fil xpixel, ypixel ;
clksrc clksrc1 (clk, vga_clk) ; PLL qui sert à créer 40MHz horloge nécessaire à la résolution
vgaSync vgaSync1(.clk(clk),.pixel_tick(vga_clk),.hsync(vga_HS),.vsync(vga_VS),.xpixel(xpixel),.ypixel(ypixel), .video_on(write)) ;
assigner sync_n = 1 ; vga_HS ^ vga_VS ; du manuel des DAC, la synchronisation et le blanc sont utilisés pour aider avec la synchronisation de RVB. Ils peuvent seulement 1 RVB causant pour toujours être sur.
assigner blank_n = 1 ; écrire ;
serait entrée de tableau graphique où mettre les objets
assignez le test = 1; / / ((xpixel>0) & & (xpixel < 1055)) ;
toujours @ (posedge clk)
commencer
R_temp = {8 {(sw [0] & écriture & test)}} ;
G_temp = {8 {(sw [1] & écriture & test)}} ;
B_temp = {8 {(sw [2] & écriture & test)}} ;
fin
assigner R = R_temp ;
assigner G = G_temp ;
attribuer B = B_temp ;
endmodule
module vgaSync(clk,pixel_tick,hsync,vsync,xpixel,ypixel,video_on) ;
entrée clk, pixel_tick ;
sortie fil hsync, vsync, video_on ;
sortie [0:10] xpixel, ypixel ;
reg [0:10] hcount, vcount ;
reg [0:10] hcount_temp, vcount_temp ;
Reg vsync_reg, hsync_reg ;
fil hsync_temp, vsync_temp ;
VGA 1920 par paramètre 1080 sync
localparam HD = 800 ; affichage horizontal
localparam RB = 40 ; porche de frontière/avant droite
localparam HR = 128 ; retracer de h.
localparam LB = 88 ; porche de frontière/arrière gauche
localparam VD = 600 ; c. affichage
localparam BB = 1 ; fond frontière/front porck
localparam VR = 4 ; c. de retracer
localparam TB = 23 ; Top border/ARRIERE porche
fil de hend, vend ;
s’inscrire
toujours @ (posedge clk)
commencer
vcount = vcount_temp ;
hcount = hcount_temp ;
vsync_reg = vsync_temp ;
hsync_reg = hsync_temp ;
fin
fin de l’écran
assigner hend = (hcount == (HD + RB + HR + LB-1)) ;
vend Assign = (vcount == (VD + BB + VR + TB-1)) ;
toujours
Si (pixel_tick)
Si (hend)
hcount_temp = 0 ;
d’autre
hcount_temp = hcount + 1 ;
d’autre
hcount_temp = hcount ;
toujours
Si (pixel_tick & hend)
Si (vend)
vcount_temp = 0 ;
d’autre
vcount_temp = vcount + 1 ;
d’autre
vcount_temp = vcount ;
assigner video_on = ((hcount=(HD+RB)) & & (hcount < =(HD+RB+HR+LB-1))) ; synchronisation horizontale et verticale doit être inversée pour résolution de 800 x 600
assigner vsync_temp = ~ (((vcount > =(VD+BB)) & & (vcount < =(VD+BB+VR+TB-1))) ;
sortie
assigner xpixel = hcount ;
assigner ypixel = vcount ;
assigner hsync = hsync_temp ;
assignez le vsync = vsync_temp ;