Układy cyfrowe i systemu wbudowane 2.docx

(1014 KB) Pobierz

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

 

 

Opis zadania projektowego

 

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.

 


kabelvga.jpg

 

 

 

 

 

 

 

Rys1: kabel łączący monitor VGA z płytką Spartan 3E

Źródło: http://audio.blogbiznes.pl/2008/11/12/kable-przewody-konektory

 

 

 

 

 

Opis układu (zawartość zestawu)

 

Zestaw, który był do dyspozycji na potrzeby niniejszego projektu, miał następujące elementy wykorzystywane w projekcie:

 


vga.bmp
Port VGA

 

 

 

 

 

 

 

Rys2: schemat logiczny portu VGA płytki Spartan 3E

Źródło: Spartan-3E Starter Kit Board User Guide

 

 

 

 



15-pinowy port , gdzie

 

 

 

 

 

 

 

 

Generator sygnału prostokątnego 50MHz


clock.bmp

 

 

 

 

Rys3: Oscylator 50MHz (IC17)

Źródło: Spartan-3E Starter Kit Board User Guide

 

 

 

 

Konfigurowalna pamięć SRAM

 

Dzięki narzędziu The Xilinx CORE Generator użyliśmy pamięci SRAM przekonfigurowanej na pamięć jednoportową ROM.

 

 

 

 

 

 

 

 

 

Oprogramowanie

 

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.

 

Funkcjonalność

 

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.

 

Schemat ogólny układu


schemat.jpg

 

 

 

 

 

 

 

 

 

 

 

 

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.

 

Opisy poszczególnych modułów

 

RomAccess

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...

Zgłoś jeśli naruszono regulamin