<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Truly Integrated &#187; FPGA</title>
	<atom:link href="http://truly-integrated.net/category/fpga/feed/" rel="self" type="application/rss+xml" />
	<link>http://truly-integrated.net</link>
	<description>electronics microcontrollers fpga vhdl</description>
	<lastBuildDate>Fri, 19 Feb 2010 21:22:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>pl</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Generator sygnałów VGA w VHDL</title>
		<link>http://truly-integrated.net/2009/08/generator-sygnalow-vga-w-vhdl/</link>
		<comments>http://truly-integrated.net/2009/08/generator-sygnalow-vga-w-vhdl/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 11:01:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[FPGA]]></category>

		<guid isPermaLink="false">http://truly-integrated.net/?p=189</guid>
		<description><![CDATA[W dzisiejszym wpisie zaprezentuję jak wykonać generator sygnałów VGA dla trybu 640&#215;480@60Hz. Jest to element umożliwiający wyświetlanie czegokolwiek na matrycy/kineskopie monitora, także, o ile zajmujemy się projektowaniem GPU, warto poświęcić mu trochę uwagi (:
Każdy monitor ze złączem w standardzie VGA wymaga podawania pięciu sygnałów:

R,G,B &#8211; składowe kolorów (&#8220;treść&#8221; obrazu)
v_sync &#8211; synchronizacja pionowa
h_sync &#8211; synchronizacja pozioma

Poszczególne [...]]]></description>
			<content:encoded><![CDATA[<p>W dzisiejszym wpisie zaprezentuję jak wykonać generator sygnałów VGA dla trybu 640&#215;480@60Hz. Jest to element umożliwiający wyświetlanie czegokolwiek na matrycy/kineskopie monitora, także, o ile zajmujemy się projektowaniem GPU, warto poświęcić mu trochę uwagi (:</p>
<p>Każdy monitor ze złączem w standardzie VGA wymaga podawania pięciu sygnałów:</p>
<ul>
<li><em>R,G,B</em> &#8211; składowe kolorów (&#8220;treść&#8221; obrazu)</li>
<li><em>v_sync</em> &#8211; synchronizacja pionowa</li>
<li><em>h_sync</em> &#8211; synchronizacja pozioma</li>
</ul>
<p>Poszczególne sygnały muszą spełniać pewne normy czasowe, które zostały opisane (również dla innych rozdzielczości) na <a href="http://www.epanorama.net/documents/pc/vga_timing.html">tej stronie</a>. Obraz jest wyświetlany z częstotliwością 25MHz (jest to wartość przybliżona, rzeczywista jest nieco większa, ale nie ma to znaczenia) na pojedynczy piksel, przy czym należy zauważyć, iż całkowity obraz ma wymiary 800&#215;525px, z czego obszar aktywny zajmuje oczywiście 640&#215;480px. Czas spędzony w pozostałym obszarze jest używany do cofania plamki do pozycji początkowej oraz przechodzenia do nowej linii. Jest to &#8220;pamiątka&#8221; po erze monitorów CRT które wyświetlały obraz z użyciem działa elektronowego, o czym więcej <a href="http://en.wikipedia.org/wiki/Cathode_ray_tube">tutaj</a>.</p>
<p>Wyróżniamy cztery podstawowe etapy synchronizacji poziomej:</p>
<ol>
<li>640 px &#8211; obszar aktywny (Horizontal Display, HD)</li>
<li>16 px &#8211; obszar wygaszania plamki i &#8220;przygotowania do powrotu&#8221; (Horizontal Front Porch, HF)</li>
<li>96 px &#8211; obszar powrotu plamki (Horizontal Return, HR)</li>
<li>48 px &#8211; obszar zapalania plamki i &#8220;przygotowania do rysowania&#8221; (Horizontal Back Porch, HB)</li>
</ol>
<p>Sumarycznie etapy te trwają 800px. Sygnał synchronizacji poziomej powiniem mieć wartość &#8216;0&#8242; podczas trwania etapu nr 3 oraz wartość &#8216;1&#8242; we wszystkich pozostałych.</p>
<p>Analogicznie, dla sychrnonizacji pionowej, mamy:</p>
<ol>
<li>480 li &#8211; obszar aktywny (Vertical Display, VD)</li>
<li>10 li &#8211; (Vertical Front Porch, VF)</li>
<li>33 li &#8211; (Vertical Back Porch, VB)</li>
<li>2 li &#8211; powrót plamki (Vertical Return, VR)</li>
</ol>
<p>Sumarycznie 525 linii. Sygnał synchronizacji pionowej powinien mieć wartość &#8216;0&#8242; podczas etapu nr 3, w pozostałych wypadkach powinien mieć wartość &#8216;1&#8242;. Posileni takim ładunkiem teorii możnemy przystąpić do wcielania naszego generatora w życie.</p>
<p>Pierwszym krokiem jest dobór sygnałów wejściowych i wyjściowych naszego generatora. Ja rozpisałem je następująco:</p>
<div class="codesnip-container" >
<div class="vhdl codesnip" style="font-family:monospace;"><span class="kw1">entity</span> vga_640_gen <span class="kw1">is</span><br />
<span class="kw1">port</span> <span class="br0">&#40;</span> &nbsp;<span class="co1">&#8211; common signals</span><br />
clk, rst <span class="sy0">:</span> <span class="kw1">in</span> <span class="kw2">std_logic</span><span class="sy0">;</span><br />
<span class="co1">&#8211; vga signals</span><br />
pix_x, pix_y <span class="sy0">:</span> <span class="kw1">out</span> <span class="kw2">std_logic_vector</span><span class="br0">&#40;</span>9 <span class="kw1">downto</span> 0<span class="br0">&#41;</span><span class="sy0">;</span><br />
hs, vs, blank, pix_clk <span class="sy0">:</span> <span class="kw1">out</span> <span class="kw2">std_logic</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">end</span> vga_640_gen<span class="sy0">;</span></div>
</div>
<p>Sygnały clk, i rst to nic innego jak wejście zegara, który na płycie Nexys 2 ma częstotliwość 50MHz, tak więc po podzieleniu na 2 idealnie nadaje się na zegar pikseli 25MHz oraz sygnał resetu całego generatora. 10-bitowe sygnały pix_x oraz pix_y zawierają informację odnośnie aktualnie wyświetlanego piksela. Linie hs i vs to linie synchronizacji odpowiednio: poziomej i pionowej. Sygnał blank informuje nas o tym czy generator znajduje się w obszarze aktywnym czy też nie, zaś pix_clk to wyjście zegara pikseli 25Mhz.</p>
<p>Przystępujemy do implementacji architektury generatora:</p>
<div class="codesnip-container" >
<div class="vhdl codesnip" style="font-family:monospace;"><span class="kw1">architecture</span> Behavioral <span class="kw1">of</span> vga_640_gen <span class="kw1">is</span></p>
<p><span class="co1">&#8211; signals for pixel clock generation</span><br />
<span class="kw1">signal</span> pix_clk_reg, pix_clk_next <span class="sy0">:</span> <span class="kw2">std_logic</span><span class="sy0">;</span></p>
<p><span class="kw1">signal</span> blank_reg, blank_next <span class="sy0">:</span> <span class="kw2">std_logic</span><span class="sy0">;</span></p>
<p><span class="co1">&#8211; internal signals</span><br />
<span class="kw1">signal</span> h_tick, v_tick <span class="sy0">:</span> <span class="kw2">std_logic</span><span class="sy0">;</span><br />
<span class="kw1">signal</span> h_sync_reg, h_sync_next <span class="sy0">:</span> <span class="kw2">std_logic</span><span class="sy0">;</span><br />
<span class="kw1">signal</span> v_sync_reg, v_sync_next <span class="sy0">:</span> <span class="kw2">std_logic</span><span class="sy0">;</span></p>
<p><span class="co1">&#8211; counters for horizontal and vertical sync</span><br />
<span class="kw1">signal</span> v_count_reg, v_count_next <span class="sy0">:</span> <span class="kw2">std_logic_vector</span><span class="br0">&#40;</span>9 <span class="kw1">downto</span> 0<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">signal</span> h_count_reg, h_count_next <span class="sy0">:</span> <span class="kw2">std_logic_vector</span><span class="br0">&#40;</span>9 <span class="kw1">downto</span> 0<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="co1">&#8211; horizontal and vertical syncs generating constants</span><br />
<span class="kw1">constant</span> HD <span class="sy0">:</span> <span class="kw2">integer</span> <span class="sy0">:=</span> <span class="nu0">640</span><span class="sy0">;</span><br />
<span class="kw1">constant</span> HF <span class="sy0">:</span> <span class="kw2">integer</span> <span class="sy0">:=</span> <span class="nu0">16</span><span class="sy0">;</span><br />
<span class="kw1">constant</span> HB <span class="sy0">:</span> <span class="kw2">integer</span> <span class="sy0">:=</span> <span class="nu0">48</span><span class="sy0">;</span><br />
<span class="kw1">constant</span> HR <span class="sy0">:</span> <span class="kw2">integer</span> <span class="sy0">:=</span> <span class="nu0">96</span><span class="sy0">;</span><br />
<span class="kw1">constant</span> VD <span class="sy0">:</span> <span class="kw2">integer</span> <span class="sy0">:=</span> <span class="nu0">480</span><span class="sy0">;</span><br />
<span class="kw1">constant</span> VF <span class="sy0">:</span> <span class="kw2">integer</span> <span class="sy0">:=</span> <span class="nu0">10</span><span class="sy0">;</span><br />
<span class="kw1">constant</span> VB <span class="sy0">:</span> <span class="kw2">integer</span> <span class="sy0">:=</span> <span class="nu0">33</span><span class="sy0">;</span><br />
<span class="kw1">constant</span> VR <span class="sy0">:</span> <span class="kw2">integer</span> <span class="sy0">:=</span> <span class="nu0">2</span><span class="sy0">;</span></p>
<p><span class="kw1">begin</span></p>
<p><span class="co1">&#8211; update process</span><br />
update <span class="sy0">:</span> <span class="kw1">process</span> <span class="br0">&#40;</span>clk, rst<span class="br0">&#41;</span><br />
<span class="kw1">begin</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>rst <span class="sy0">=</span> &#8216;1&#8242;<span class="br0">&#41;</span> <span class="kw1">then</span><br />
h_count_reg &amp;lt<span class="sy0">;=</span> <span class="br0">&#40;</span><span class="kw1">others</span> <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> &#8216;0&#8242;<span class="br0">&#41;</span><span class="sy0">;</span><br />
v_count_reg &amp;lt<span class="sy0">;=</span> <span class="br0">&#40;</span><span class="kw1">others</span> <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> &#8216;0&#8242;<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>pix_clk_reg &amp;lt<span class="sy0">;=</span> &#8216;0&#8242;<span class="sy0">;</span><br />
h_sync_reg &amp;lt<span class="sy0">;=</span> &#8216;0&#8242;<span class="sy0">;</span><br />
v_sync_reg &amp;lt<span class="sy0">;=</span> &#8216;0&#8242;<span class="sy0">;</span></p>
<p>blank_reg &amp;lt<span class="sy0">;=</span> &#8216;0&#8242;<span class="sy0">;</span><br />
<span class="kw1">elsif</span> <span class="kw1">rising_edge</span><span class="br0">&#40;</span>clk<span class="br0">&#41;</span> <span class="kw1">then</span><br />
pix_clk_reg &amp;lt<span class="sy0">;=</span> pix_clk_next<span class="sy0">;</span></p>
<p>h_count_reg &amp;lt<span class="sy0">;=</span> h_count_next<span class="sy0">;</span><br />
v_count_reg &amp;lt<span class="sy0">;=</span> v_count_next<span class="sy0">;</span></p>
<p>h_sync_reg &amp;lt<span class="sy0">;=</span> h_sync_next<span class="sy0">;</span><br />
v_sync_reg &amp;lt<span class="sy0">;=</span> v_sync_next<span class="sy0">;</span></p>
<p>blank_reg &amp;lt<span class="sy0">;=</span> blank_next<span class="sy0">;</span><br />
<span class="kw1">end</span> <span class="kw1">if</span><span class="sy0">;</span><br />
<span class="kw1">end</span> <span class="kw1">process</span> update<span class="sy0">;</span></p>
<p><span class="co1">&#8211; clock generation</span><br />
pix_clk_next &amp;lt<span class="sy0">;=</span> <span class="kw1">not</span> pix_clk_reg<span class="sy0">;</span></p>
<p><span class="co1">&#8211; blank generation</span><br />
blank_next &amp;lt<span class="sy0">;=</span> &#8216;0&#8242; <span class="kw1">when</span> <span class="br0">&#40;</span>h_count_reg &amp;lt<span class="sy0">;</span> HD<span class="br0">&#41;</span> <span class="kw1">and</span> <span class="br0">&#40;</span>v_count_reg &amp;lt<span class="sy0">;</span> VD<span class="br0">&#41;</span> <span class="kw1">else</span> &#8216;1&#8242;<span class="sy0">;</span></p>
<p><span class="co1">&#8211; horizontal and vertical tick signal generation</span><br />
h_tick &amp;lt<span class="sy0">;=</span> &#8216;1&#8242; <span class="kw1">when</span> h_count_reg <span class="sy0">=</span> <span class="br0">&#40;</span>HD+HF+HB+HR-1<span class="br0">&#41;</span> <span class="kw1">else</span> &#8216;0&#8242;<span class="sy0">;</span><br />
v_tick &amp;lt<span class="sy0">;=</span> &#8216;1&#8242; <span class="kw1">when</span> v_count_reg <span class="sy0">=</span> <span class="br0">&#40;</span>VD+VF+VB+VR-1<span class="br0">&#41;</span> <span class="kw1">else</span> &#8216;0&#8242;<span class="sy0">;</span></p>
<p><span class="co1">&#8211; sync signals generation</span><br />
h_sync_next &amp;lt<span class="sy0">;=</span> &#8216;1&#8242; <span class="kw1">when</span> <span class="br0">&#40;</span>h_count_reg &amp;gt<span class="sy0">;=</span> <span class="br0">&#40;</span>HD+HF<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">and</span><br />
<span class="br0">&#40;</span>h_count_reg &amp;lt<span class="sy0">;=</span> <span class="br0">&#40;</span>HD+HF+HR-1<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">else</span> &#8216;0&#8242;<span class="sy0">;</span><br />
v_sync_next &amp;lt<span class="sy0">;=</span> &#8216;1&#8242; <span class="kw1">when</span> <span class="br0">&#40;</span>v_count_reg &amp;gt<span class="sy0">;=</span> <span class="br0">&#40;</span>VD+VF<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">and</span><br />
<span class="br0">&#40;</span>v_count_reg &amp;lt<span class="sy0">;=</span> <span class="br0">&#40;</span>VD+VF+VR-1<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="kw1">else</span> &#8216;0&#8242;<span class="sy0">;</span></p>
<p><span class="co1">&#8211; horizontal counter process</span><br />
h_counter <span class="sy0">:</span> <span class="kw1">process</span> <span class="br0">&#40;</span>pix_clk_reg, h_tick, h_count_reg<span class="br0">&#41;</span><br />
<span class="kw1">begin</span><br />
<span class="kw1">if</span> pix_clk_reg <span class="sy0">=</span> &#8216;1&#8242; <span class="kw1">then</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>h_tick <span class="sy0">=</span> &#8216;1&#8242;<span class="br0">&#41;</span> <span class="kw1">then</span><br />
h_count_next &amp;lt<span class="sy0">;=</span> <span class="br0">&#40;</span><span class="kw1">others</span> <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> &#8216;0&#8242;<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">else</span><br />
h_count_next &amp;lt<span class="sy0">;=</span> h_count_reg + <span class="nu0">1</span><span class="sy0">;</span><br />
<span class="kw1">end</span> <span class="kw1">if</span><span class="sy0">;</span><br />
<span class="kw1">else</span><br />
h_count_next &amp;lt<span class="sy0">;=</span> h_count_reg<span class="sy0">;</span><br />
<span class="kw1">end</span> <span class="kw1">if</span><span class="sy0">;</span><br />
<span class="kw1">end</span> <span class="kw1">process</span> h_counter<span class="sy0">;</span></p>
<p><span class="co1">&#8211; vertical counter process</span><br />
v_counter <span class="sy0">:</span> <span class="kw1">process</span> <span class="br0">&#40;</span>pix_clk_reg, h_tick, v_tick, v_count_reg<span class="br0">&#41;</span><br />
<span class="kw1">begin</span><br />
<span class="kw1">if</span> pix_clk_reg <span class="sy0">=</span> &#8216;1&#8242; <span class="kw1">and</span> h_tick <span class="sy0">=</span> &#8216;1&#8242; <span class="kw1">then</span><br />
<span class="kw1">if</span> <span class="br0">&#40;</span>v_tick <span class="sy0">=</span> &#8216;1&#8242;<span class="br0">&#41;</span> <span class="kw1">then</span><br />
v_count_next &amp;lt<span class="sy0">;=</span> <span class="br0">&#40;</span><span class="kw1">others</span> <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> &#8216;0&#8242;<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">else</span><br />
v_count_next &amp;lt<span class="sy0">;=</span> v_count_reg + <span class="nu0">1</span><span class="sy0">;</span><br />
<span class="kw1">end</span> <span class="kw1">if</span><span class="sy0">;</span><br />
<span class="kw1">else</span><br />
v_count_next &amp;lt<span class="sy0">;=</span> v_count_reg<span class="sy0">;</span><br />
<span class="kw1">end</span> <span class="kw1">if</span><span class="sy0">;</span><br />
<span class="kw1">end</span> <span class="kw1">process</span> v_counter<span class="sy0">;</span></p>
<p><span class="co1">&#8211; pixel clock signal</span><br />
pix_clk &amp;lt<span class="sy0">;=</span> pix_clk_reg<span class="sy0">;</span></p>
<p><span class="co1">&#8211; blank signal</span><br />
blank &amp;lt<span class="sy0">;=</span> blank_reg<span class="sy0">;</span></p>
<p><span class="co1">&#8211; generate horizontal sync signal</span><br />
hs &amp;lt<span class="sy0">;=</span> h_sync_reg<span class="sy0">;</span><br />
<span class="co1">&#8211; generate vertical sync signal</span><br />
vs &amp;lt<span class="sy0">;=</span> v_sync_reg<span class="sy0">;</span></p>
<p><span class="co1">&#8211; output pixel counter signals</span><br />
pix_x &amp;lt<span class="sy0">;=</span> h_count_reg<span class="sy0">;</span><br />
pix_y &amp;lt<span class="sy0">;=</span> v_count_reg<span class="sy0">;</span></p>
<p><span class="kw1">end</span> Behavioral<span class="sy0">;</span></div>
</div>
<p>Proces <em>update</em> odpowiada za przypisywanie nowych wartości do wszystkich rejestrów, jakie zostały użyte w implementacji. Dzięki temu mamy pełną synchronizację wewnątrz bloku generatora VGA i możliwość pracy całego FPGA z wysoką częstotliwością taktowania. Zegar jest uzyskany poprzez negowanie &#8220;samego siebie&#8221; (linia 56) z częstotliwością zegara, co w rezultacie owocuje przebiegiem o częstotliwości 25Mhz. Proces <em>h_count</em> odpowiada za aktualizację wartości licznika synchronizacji poziomej, dla wartości mniejszych niż 800 następuje zwiększenie wartości licznika o 1, dla wartości 800 następuje wyzerowanie licznika. Podobnie funkcjonuje proces <em>v_count</em> tyle że on jest synchronizowany przejściem do nowej linii. Sygnał blank ma wartość &#8216;0&#8242; gdy aktualnie wyświetlany piksel należy do obszaru aktywnego (linia 59). Sygnały <em>hs</em> i <em>vs</em> są generowane zgodnie z &#8220;przepisem&#8221; podanym wcześniej (linie 66 i 68).</p>
<p><strong>Test generatora</strong></p>
<p>Aby przetestować generator należałoby spróbować wyświetlić jakikolwiek obraz na monitorze. Najprostszym sposobem jest wygenerowanie tzw. <em>xor pattern</em>, tzn takiego obrazu, gdzie kolor każdego piksela ma wartość obliczoną jako <em>xor</em> jego współrzędnej x oraz y. Przykładowy plik testowy wygląda więc następująco:</p>
<div class="codesnip-container" >
<div class="vhdl codesnip" style="font-family:monospace;"><span class="kw1">library</span> <span class="kw2">IEEE</span><span class="sy0">;</span><br />
<span class="kw1">use</span> <span class="kw2">IEEE</span>.<span class="kw2">STD_LOGIC_1164</span>.<span class="kw1">ALL</span><span class="sy0">;</span><br />
<span class="kw1">use</span> <span class="kw2">IEEE</span>.<span class="kw2">STD_LOGIC_ARITH</span>.<span class="kw1">ALL</span><span class="sy0">;</span><br />
<span class="kw1">use</span> <span class="kw2">IEEE</span>.STD_LOGIC_UNSIGNED.<span class="kw1">ALL</span><span class="sy0">;</span><br />
<span class="kw1">entity</span> test <span class="kw1">is</span><br />
<span class="kw1">port</span><span class="br0">&#40;</span> clk <span class="sy0">:</span> <span class="kw1">in</span> <span class="kw2">std_logic</span><span class="sy0">;</span></p>
<p>vga_hs, vga_vs <span class="sy0">:</span> <span class="kw1">out</span> <span class="kw2">std_logic</span><span class="sy0">;</span><br />
vga_rgb <span class="sy0">:</span> <span class="kw1">out</span> <span class="kw2">std_logic_vector</span><span class="br0">&#40;</span>7 <span class="kw1">downto</span> 0<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">end</span> test<span class="sy0">;</span></p>
<p><span class="kw1">architecture</span> Behavioral <span class="kw1">of</span> test <span class="kw1">is</span><br />
<span class="kw1">signal</span> pix_x, pix_y <span class="sy0">:</span> <span class="kw2">std_logic_vector</span><span class="br0">&#40;</span>9 <span class="kw1">downto</span> 0<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw1">signal</span> blank <span class="sy0">:</span> <span class="kw2">std_logic</span><span class="sy0">;</span><br />
<span class="kw1">begin</span></p>
<p>vga_gen <span class="sy0">:</span> <span class="kw1">entity</span> vga_640_gen<br />
<span class="kw1">port</span> <span class="kw1">map</span><span class="br0">&#40;</span>clk <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> clk, rst <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> ‘0′,<br />
pix_x <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> pix_x, pix_y <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> pix_y,<br />
hs <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> vga_hs, vs <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> vga_vs, blank <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> blank, pix_clk <span class="sy0">=</span>&amp;gt<span class="sy0">;</span> <span class="kw1">open</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>vga_rgb &amp;lt<span class="sy0">;=</span> pix_x<span class="br0">&#40;</span>7 <span class="kw1">downto</span> 0<span class="br0">&#41;</span> <span class="kw1">xor</span> pix_y<span class="br0">&#40;</span>7 <span class="kw1">downto</span> 0<span class="br0">&#41;</span> <span class="kw1">when</span> blank <span class="sy0">=</span> ‘0′ <span class="kw1">else</span> x<span class="st0">&quot;00&quot;</span><span class="sy0">;</span></p>
<p><span class="kw1">end</span> Behavioral<span class="sy0">;</span></div>
</div>
<p>Warto zauważyć, że sygnały wyjściowe <em>vga_rgb</em> powinny mieć wartość zera logicznego w momencie, gdy plamka znajduje się poza aktywnym obszarem wyświetlania (w tym celu z generatora wyprowadzono sygnał <em>blank</em>). Jeśli tego nie zrobimy, to niektóre monitory zaczynają wariować, obraz jest przesunięty i słychać syczenie i gwizdy (:. Kod wgrany do FPGA, znajdującego się na płytce Nexys 2, daje takie oto efekty:</p>
<p><a href="http://truly-integrated.net/wp-content/uploads/2009/08/monitor.jpg"><img class="aligncenter size-medium wp-image-205" title="monitor" src="http://truly-integrated.net/wp-content/uploads/2009/08/monitor-468x570.jpg" alt="monitor" width="468" height="570" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://truly-integrated.net/2009/08/generator-sygnalow-vga-w-vhdl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
