Układy cyfrowe i systemu wbudowane 2
Dokumentacja projektowa
Prow.: dr inż. Jarosław Sugier
Spis Treści :
Opis zadania projektowego 3
Opis układu (zawartość zestawu) 3
Port VGA 3
Generator sygnału prostokątnego 50MHz 4
Konfigurowalna pamięć SRAM 4
Oprogramowanie 5
Funkcjonalność 5
Schemat ogólny układu 5
Opisy poszczególnych modułów 6
RomAccess 6
VGA 7
RomBlock 10
Testy i symulacje 12
Testy empiryczne 12
Możliwe ulepszenia 12
Projekt nasz ma realizować komunikację między układem FPGA Spartan 3E firmy Xilinx, a monitorem VGA z wykorzystaniem pamięci blokowej ROM. Do połączenia użyliśmy dostępnego kabla analogowego VGA.
Rys1: kabel łączący monitor VGA z płytką Spartan 3E
Źródło: http://audio.blogbiznes.pl/2008/11/12/kable-przewody-konektory
Zestaw, który był do dyspozycji na potrzeby niniejszego projektu, miał następujące elementy wykorzystywane w projekcie:
Rys2: schemat logiczny portu VGA płytki Spartan 3E
Źródło: Spartan-3E Starter Kit Board User Guide
15-pinowy port , gdzie
Rys3: Oscylator 50MHz (IC17)
Dzięki narzędziu The Xilinx CORE Generator użyliśmy pamięci SRAM przekonfigurowanej na pamięć jednoportową ROM.
Do implementacji projektu użyto oprogramowania Xilinx ISE w wersji 13.1, natomiast
symulacje działania układu przeprowadzane były w połączonym z nim funkcjonalnie
programie ModelSim.
Układ ma budowę modularną, złożony jest z szeregu połączonych modułów, z których
większość jest opisana w języku VHDL.
Po zaprogramowaniu i włączeniu układu w pamięci blokowej ROM zostaje umieszczony plik o rozszerzeniu coe, zawierającym tablice zer i jedynek, gdzie zero oznacza piksel zgaszony, a jedynka piksel zapalony. Tablica ma rozmiar 64x64, co w efekcie dawało nam obrazek 64x64 pikseli. Pamięć ROM wysyła do modułu VGA po jednym bicie (0 lub 1), który zostaje wyświetlony na monitorze VGA.
W efekcie na ekranie wyświetla się obrazek w wielkości 64x64, wycentrowany przez moduł VGA.
Jak widać na powyższym schemacie, układ składa się z trzech modułów. Całość ma łącznie tylko jedno wejście odpowiadające za zegar oraz trzy wyjścia: dwa z nich odpowiadają za sygnał szerokości i wysokości VGA, jedno (magistralowe, które dzieli się na trzy) odpowiada za kolory czerwony, zielony i niebieski.
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity RomAccess is
Port ( x : in STD_LOGIC_VECTOR (9 downto 0);
y : in STD_LOGIC_VECTOR (9 downto 0);
RGB : out STD_LOGIC_VECTOR (2 downto 0);
data : in STD_LOGIC_VECTOR (0 downto 0);
addr : out STD_LOGIC_VECTOR (11 downto 0));
end RomAccess;
architecture Behavioral of RomAccess is
constant x_pic : integer := 64;
constant y_pic : integer := 64;
constant x_screen : integer := 800;
constant y_screen : integer := 600;
constant x_offset : integer := (x_screen - x_pic)/2;
constant y_offset : integer := (y_screen - y_pic)/2;
signal q_x, q_y : std_logic_vector(9 downto 0);
signal ok_x, ok_y : std_logic;
begin
q_x <= x - x_offset+1;
q_y <= y - y_offset;
ok_x <= '1' when x >= x_offset and x < x_offset+x_pic else '0';
ok_y <= '1' when y >= y_offset and y < y_offset+y_pic else '0';
addr <= q_y(5 downto 0) & q_x(5 downto 0);
RGB <= "000" when ok_x = '0' or ok_y = '0' else ( not data) & data & data;
end Behavioral;
Przyjęliśmy, że będziemy wyświetlać obrazek 64x64 pośrodku ekranu o przyjętej przez nas rozdzielczości 800x600. Odpowiadają za to zmienne x_pic i y_pic oraz x_screen i y_screen. Dodatkowo wyznaczamy współrzędne kwadratu 64x64 znajdującego się pośrodku ekranu. Moduł przelicza współrzędne aktualnie wyświetlane na współrzędne obrazka oraz sprawdza, czy aktualnie znajdujemy się w granicach środkowego kwadratu ekranu, więc czy wyświetlić obraz czy nie. Następnie na podstawie wyliczonych współrzędnych obrazka wskazujemy adres w pamięci, oznaczony jako wektor 11-bitowy addr. W tym module również definiujem...
niobe666