Paso 3: VGA
Para el aspecto visual del juego, pensado sobre el uso de los LEDs pero decidió usar la salida VGA para mostrar el juego en una pantalla. Para lograr esto, hemos investigado cómo funciona una VGA y la Junta tiene entrada para el convertidor digital a analógico (DAC). VGA utiliza tres entradas de 3 colores diferentes que se combinan para crear una gama de colores y utiliza una sincronización vertical y horizontal que indica a qué píxeles se encienden para arriba la señal RGB.
La placa DE2-115 tiene DAC de video de ADV7123 que toma una señal de 8 bits para rojo, verde y azul, una señal de N Sync, una señal de N en blanco y las sincronizaciones verticales y horizontales. El rojo, verde y azul, un N Sync y una señal en blanco-N se utilizan para crear la señal rgb analógica con una señal de componente en el cable verde. El h-sync y v-sync se convierten en sus equivalentes analógicos.
Dependiendo de la resolución, una tasa de punto diferente (los píxeles cantidad activadas por segundo) será necesario. Para crear este. Se utilizó una fase de bloqueo loop(PLL) mega función Quartus. Esto nos permitió elegir una frecuencia de reloj. Con esto, el h-sync y v-sync pueden crearse con saber cuántos píxeles ancho y alto de su resolución y utilizando un contador.
Este módulo toma en el reloj, tipo de punto y gráficos matriz y salidas las entradas necesarias de la VGA.
ADAPTADAS de "Prototipos FPGA Verilog ejemplos" de Pong P. Chu código / /
módulo vgaout(sw,clk,R,G,B,vga_clk,sync_n,blank_n,vga_HS,vga_VS);
entrada sw [2:0];
entrada clk;
salida [7:0] R, G, B;
salida de vga_clk, sync_n, blank_n, vga_HS, vga_VS;
REG [7:0] R_temp, G_temp, B_temp;
escritura de alambre, prueba;
alambre xancho, ypixel;
clksrc clksrc1 (clk, vga_clk); PLL que se utiliza para crear el reloj de 40MHz necesario para la resolución de
vgaSync vgaSync1(.clk(clk),.pixel_tick(vga_clk),.hsync(vga_HS),.vsync(vga_VS),.xpixel(xpixel),.ypixel(ypixel), .video_on(write));
asignar sync_n = 1; vga_HS ^ vga_VS; de manual de DAC, la sincronización y el espacio en blanco se utilizan para ayudar en la sincronización de RGB. Pueden RGB causando sólo 1 para siempre.
asignar blank_n = 1; escribir;
entrada de matriz de gráficos donde poner objetos
asignar la prueba = 1; / / ((xpixel>0) & & (xancho < 1055));
siempre a (clk del posedge)
comenzar
R_temp = {8 {(sw [0] y escribe y prueba)}};
G_temp = {8 {(sw [1] y escribe y prueba)}};
B_temp = {8 {(sw [2] escritura & prueba)}};
final
asignar R = R_temp;
asignar G = G_temp;
asignar B = B_temp;
endmodule
módulo vgaSync(clk,pixel_tick,hsync,vsync,xpixel,ypixel,video_on);
entrada clk, pixel_tick;
salida cable hsync vsync, video_on;
salida [0 10] xancho, ypixel;
REG [0 10] hcount, vcount;
REG [0 10] hcount_temp, vcount_temp;
REG vsync_reg, hsync_reg;
alambre hsync_temp, vsync_temp;
VGA de 1920 por parámetro 1080 sync
localparam HD = 800; pantalla horizontal
localparam RB = 40; porche de frontera/delantero derecho
localparam HR = 128; retrace h.
localparam LB = 88; porche de frontera/lateral izquierdo
localparam VD = 600; v. pantalla
localparam BB = 1; inferior frontal frontera longaniza
localparam VR = 4; v. retrace
localparam TB = 23; porche de la frontera superior y la espalda
alambre de hend, vend;
registro
siempre a (clk del posedge)
comenzar
vcount = vcount_temp;
hcount = hcount_temp;
vsync_reg = vsync_temp;
hsync_reg = hsync_temp;
final
final de la pantalla
asignar hend = (hcount == (HD + RB + HR + LB-1));
asignar vend = (vcount == (VD + BB + VR + TB-1));
siempre
Si (pixel_tick)
Si (hend)
hcount_temp = 0;
otra cosa
hcount_temp = hcount + 1;
otra cosa
hcount_temp = hcount;
siempre
Si (pixel_tick & hend)
Si (vend)
vcount_temp = 0;
otra cosa
vcount_temp = vcount + 1;
otra cosa
vcount_temp = vcount;
asignar video_on = ((hcount=(HD+RB)) & & (hcount < =(HD+RB+HR+LB-1))); sincronización horizontal y vertical debe ser invertida para resolución de 800 x 600
asignar vsync_temp = ~ (((vcount > =(VD+BB)) & & (vcount < =(VD+BB+VR+TB-1)));
salida
asignar xancho = hcount;
asignar ypixel = vcount;
asignar hsync = hsync_temp;
asignar vsync = vsync_temp;