Hinder undvika spel (3 / 9 steg)
Steg 3: VGA
För den visuella aspekten av spelet, vi tänkte använda lamporna men beslutade om att använda VGA-utgång för visning av spelet på en skärm. För att åstadkomma detta, undersökt vi hur en VGA fungerar och hur styrelsen tar ingång för digital till analog omvandlare (DAC). VGA använder tre ingångar för 3 olika färger som kombineras sedan för att skapa ett utbud av färger och det använder en vertikal och horisontell synkroniseras som berättar vilka pixlar tänds för RGB-signalen.
DE2-115 styrelsen har ADV7123 video DAC som tar en 8 bitars signal för rött, grönt och blått, en Sync-N signal, en signal om Tom-N och den vertikala och horisontella synkroniseras. Rött, grönt och blått, en Sync-N och en Blank-N signal används för att skapa analog rgb-signal med en komponent signal på den gröna ledningen. H-sync och v-sync omvandlas till analoga motsvarighet.
Beroende på upplösning är en annan dot räntan (belopp pixlar påslagen per sekund) behovet. För att skapa detta. Vi använde en fas lås loop(PLL) mega funktion inbyggd i Quartus. Detta gjorde det möjligt för oss att välja någon klockfrekvens. Med detta, kan h-sync och v-sync skapas med att veta hur många pixlar bred och hög er resolution och använda en räknare.
Denna modul tar i klockan, dot pris och graphics array och utgångar nödvändiga VGA ingångar.
KODEN bygger på "FPGA prototyper av Verilog exempel" av Pong s. Chu / /
modul vgaout(sw,clk,R,G,B,vga_clk,sync_n,blank_n,vga_HS,vga_VS);
Mata in [2:0] sw;
ingående clk;
utgång [7:0] R, G, B;
utgång vga_clk, sync_n, blank_n, vga_HS, vga_VS;
REG [7:0] R_temp, G_temp, B_temp;
Wire skriva, test.
Wire xpixel, ypixel;
clksrc clksrc1 (clk, vga_clk); PLL som används för att skapa 40MHz klocka behövs för upplösning
vgaSync vgaSync1(.clk(clk),.pixel_tick(vga_clk),.hsync(vga_HS),.vsync(vga_VS),.xpixel(xpixel),.ypixel(ypixel), .video_on(write));
tilldela sync_n = 1; vga_HS ^ vga_VS; från DAC manual används blank och sync för att hjälpa med sync av RGB. De kan bara 1 orsakar RGB för att alltid vara på.
tilldela blank_n = 1; skriva;
skulle matas från graphics array var att sätta objekt
tilldela test = 1; / / ((xpixel>0) & & (xpixel < 1055));
alltid @ (posedge clk)
börja
R_temp = {8 {(sw [0] och skriva & test)}};
G_temp = {8 {(sw [1] och skriva & test)}};
B_temp = {8 {(sw [2] och skriva & test)}};
slutet
tilldela R = R_temp;
tilldela G = G_temp;
tilldela B = B_temp;
endmodule
modul vgaSync(clk,pixel_tick,hsync,vsync,xpixel,ypixel,video_on);
ingående clk, pixel_tick;
utgång tråd hsync, vsync, video_on;
utgång [10:0] xpixel, ypixel;
REG [10:0] hcount, vcount;
REG [10:0] hcount_temp, vcount_temp;
REG vsync_reg, hsync_reg;
Wire hsync_temp, vsync_temp;
VGA 1920 x 1080 sync parameter
localparam HD = 800; horisontella displayen
localparam RB = 40; högra kantlinje/front verandan
localparam HR = 128; h. retrace
localparam LB = 88. vänstra kant/tillbaka veranda
localparam VD = 600; v. display
localparam BB = 1; nedre gränsen/front porck
localparam VR = 4; v. retrace
localparam TB = 23. övre gränsen/tillbaka veranda
Wire hend, vend;
Registrera dig
alltid @ (posedge clk)
börja
vcount = vcount_temp;
hcount = hcount_temp;
vsync_reg = vsync_temp;
hsync_reg = hsync_temp;
slutet
slutet av skärmen
tilldela hend = (hcount == (HD + RB + HR + LB-1));
tilldela vend = (vcount == (VD + BB + VR + TB-1));
alltid
om (pixel_tick)
om (hend)
hcount_temp = 0;
annat
hcount_temp = hcount + 1.
annat
hcount_temp = hcount;
alltid
om (pixel_tick & hend)
om (vend)
vcount_temp = 0;
annat
vcount_temp = vcount + 1.
annat
vcount_temp = vcount;
tilldela video_on = ((hcount=(HD+RB)) & & (hcount < =(HD+RB+HR+LB-1))); horisontell och vertikal sync måste inverteras för 800 x 600 upplösning
tilldela vsync_temp = ~ (((vcount > =(VD+BB)) & & (vcount < =(VD+BB+VR+TB-1)));
utgång
tilldela xpixel = hcount;
tilldela ypixel = vcount;
tilldela hsync = hsync_temp;
tilldela vsync = vsync_temp;