Zpět na domů

FPGA VGA karta: Verilog a časování

Článek popisuje implementaci VGA grafické karty na FPGA podle principů Bena Eatera. Jsou pokryty Verilog moduly pro clock divider, čítače, synchronizační signály a ROM s 2bitovou barvou z BMP. Je uveden C++ kód konvertoru obrázků.

VGA na FPGA: od Verilog k obrazovce
Advertisement 728x90

# 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:

Google AdInline article slot
  • 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:

Google AdInline article slot
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[]:

Google AdInline article slot
#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

Advertisement 728x90

Číst dál