# Implementace VGA videokarty na FPGA podle principů Bena Eatera
Vývojáři obeznámení s HDL ocení přechod od simulací v Turing Complete k reálné hardwarové realizaci. Na základě nápadů Bena Eatera z jeho videokurzů o diskrétní logice vzniká jednoduchá videokarta na FPGA. Používá se čip Altera EP4CE15F23C8N s 15000 logickými prvky, připojený k VGA přes standardní časování 800x600@60Hz. Systémová frekvence 50 MHz se dělí na 5 pro získání 10 MHz, kompatibilních s originálním projektem.
Modul ClockDivider zajišťuje dělení frekvence:
module ClockDivider
(
input wire clk,
output reg clk_out
);
reg [2:0] DATA;
always @(posedge clk)
begin
if(DATA == 3'd4)
begin
DATA <= 3'd0;
clk_out <= 1'd1;
end
else
begin
clk_out <= 1'd0;
DATA <= DATA + 1'd1;
end
end
endmodule
Specifika Verilogu pro vývoj na FPGA
Verilog se liší od imperativních jazyků paralelním prováděním. Proměnné se dělí na reg (uchovávají stav) a wire (vedení bez ukládání). Operátory přiřazení generují různé obvody:
- assign pro kombinační logiku:
wire a,b,c;
assign c = a & b;
- always @(...) = (blokující) pro sekvenční provádění uvnitř bloku.
- always @(posedge clk) <= (neblokující) pro registry s taktováním:
reg A;
always @(posedge clk)
begin
A <= ~A;
end
Parametry modulu se zadávají přes #() s výchozími hodnotami, předávání při instanciování probíhá pojmenovaně. Direktiva `define se nedoporučuje kvůli problémům preprocesoru.
Čítače pro časování VGA
Horizontální čítač sleduje pixely v řádku:
module HorizontalCounter
#(
parameter ENDSTRING = 0
)
(
input wire clk,
output reg [8:0] DATA
);
always @(posedge clk )
begin
if(DATA == ENDSTRING) DATA <= 9'd0;
else DATA <= DATA + 1'd1;
end
endmodule
Vertikální čítač se inkrementuje na konci řádku:
module VerticalCounter
#(
parameter ENDFRAME = 0,
parameter ENDSTRING = 0
)
(
input wire clk,
input reg [8:0] Hor_count,
output reg [10:0] DATA
);
always @(posedge clk )
begin
if(DATA == ENDFRAME) DATA <= 11'd0;
else if (Hor_count == ENDSTRING) DATA <= DATA + 1'd1;
end
endmodu
Signály Hsync, Vsync, Hblank, Vblank se aktivují podle časování tinyvga.com (front/back porch jsou uvedeny v case pro H_count/V_count).
Tvorba videodat
Rozlišení viditelné oblasti je 100x75 pixelů, 2bitový kolor (4 úrovně na kanál RGB, kódování do 6 bitů). Obrázek se připravuje v Photoshopu: resize na 100x75, Indexed Color s vlastní paletou (0x00/0x55/0xaa/0xff), export BMP 8-bit.
C++ utilita konvertuje BMP do Verilog pole mem[]:
#include <windows.h>
#include <iostream>
// ... (plný kód parseru BMP s SetPixCollor pro mapování palety do 6bitových hodnot)
Funkce SetPixCollor kóduje RGB do bitů (R2R1 G2G1 B2B1). Výstup mem_block.txt se používá v ROM FPGA pro adresování podle Hor_count[6:0] a V_count[6:0].
- Načtení BMP, kontrola hlaviček (bfType=0x4D42, biBitCount=8).
- Čtení palety RGBQUAD[256].
- Parsování pixelů, mapování do 6 bitů.
- Generování Verilog kódu a ASCII vizualizace.
Integrace a ladění
Sestavení v Quartus Prime: moduly se instancují s parametry (ENDSTRING=799, ENDFRAME=624). USB Blaster vyžaduje vlastní firmware pro stabilitu. Simulátor Quartus nahrazuje obvyklé debuggery – osciilogramy signálů clk_out, H_count, RGB.
Důležité body:
- Paralelismus Verilogu vyžaduje neblokující přiřazení pro registry.
- Časování VGA je kritické: 10 MHz pixelový clock pro 800x600@60Hz.
- 2bitový kolor zjednodušuje ROM (7500x6 bitů), ale zachovává gradace.
- Úspora na FPGA: minimální deska bez periferií + samostatné VGA kabely.
- Ladění přes simulaci, bez runtime chyb.
— Editorial Team
Zatím žádné komentáře.