Wydział Elektryczny
Katedra Automatyki i Elektroniki
ĆWICZENIE Nr 7 (2h)
Obsługa urzą dzenia peryferyjnego z uż yciem pamię ci w VHDL.
Instrukcja do zajęć laboratoryjnych z przedmiotu
„Synteza układów cyfrowych”
studia niestacjonarne, II stopnia, semestr 2
EZ2B200013
Opracował:
dr inż. Łukasz Sajewski
Białystok 2012
1
1. Cel i zakres ćwiczenia
Celem ćwiczenia jest implementacja i inicjacja bloków pamięci w strukturach programowalnych stosowanych do obsługi urządzeń peryferyjnych.
2. Wyświetlacz matrycowy
Jako urządzenie peryferyjne posłuży wyświetlacz matrycowy (64 punktowy) wraz z płytką połączeniową i zasilaczem oraz zestaw przełączników dostępny na płycie DE1.
Rys. 1. Widok ogólny oraz schemat elektryczny wyświetlacza matrycowego 2
Wspomniany wyświetlacz podłączany jest do układu DE1 poprzez jeden z dwóch 40-pinowych portów rozszerzających oznaczonych jako GPIO_0 lub GPIO_1. Wyświetlacz posiada dwa zestawy diod LED – czerwone oraz zielone, w związku z tym do pełnego sterowania wymagane jest użycie 32 pinów. Do sterowania diodami LED zielonymi wykorzystywane są piny GPIO[0..15], natomiast do sterowania diodami LED czerwonymi wykorzystywane są piny GPIO[16..31]. Liczba pinów wynika z budowy wyświetlacza, który posiada 8 kolumn (C1 – C8) i 8 wierszy (R1 – R8), przy czym wiersze odpowiadają nieparzystym numerom pinów portu GPIO, natomiast kolumny odpowiadają parzystym numerom pinów portu GPIO.
Do zaświecenia wszystkich diod czerwonych (diody zielone zgaszone) wystarczy proste połączenie pinów do zasilania oraz do masy.
Rys. 2. Schemat prostego połączenia wyświetlacza matrycowego
W ramach zadania obsługi statycznej wyświetlacza należy przygotować program który w dwóch przeciwnych rogach wyświetlacza zapala jedną diodę czerwoną i jedną diodę zieloną.
W tym celu:
1. Utwórz nowy projekt.
2. Napisz program w VHDL opisujący projektowany układ.
3. Przypisz połączenia portu GPIO.
4. Dokonaj kompilacji projektu.
5. Zaprogramuj FPGA.
6. Podłącz wyświetlacz do płyty DE1 oraz do zasilania 3.3V i przetestuj pracę układu obserwując wyświetlacz.
3. Pamięć w środowisku Quartus II
W systemach cyfrowych często konieczne jest zapewnienie pewnej ilości pamięci niezbędnej do wykonania założonego zadania. Jeżeli system jest implementowany w technologii FPGA to istnieje możliwość implementacji pamięci (ROM lub RAM) używając zasobów pamięciowych zawartych w układzie FPGA.
Rys. 3. Schemat ogólny bloku asynchronicznej pamięci RAM
3
Rys. 4. Schemat ogólny bloku synchronicznej pamięci RAM
Pamięć (ROM lub RAM) w układach FPGA, można zainicjalizować na różne sposoby.
Poprzez użycie biblioteki LPM bloków programowalnych, bądź też przez użycie własnego kodu opisującego blok pamięci w środowisku VHDL.
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY memory_1 IS
PORT(clk: IN STD_LOGIC;
adres: IN INTEGER RANGE 0 TO 7;
dane: OUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY;
ARCHITECTURE Prosta OF memory_1 IS
TYPE blok_pamieci IS ARRAY(0 TO 7) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
CONSTANT rom: blok_pamieci := ("00000001",
"00000010",
"00000100",
"00001000",
"00010000",
"00100000",
"01000000",
"10000000");
BEGIN
dane <= rom(adres);
END;
List. 1. Listing odpowiadający pamięci asynchronicznej ROM 8 x 8
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY memory_2 IS
PORT(clk, oe, we: IN STD_LOGIC ;
adres: IN INTEGER RANGE 0 TO 15;
dane: INOUT STD_LOGIC_VECTOR(7 DOWNTO 0));
END ENTITY;
ARCHITECTURE Prosta OF memory_2 IS
4
TYPE blok_pamieci IS ARRAY(0 TO 15) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
PROCESS(clk)
VARIABLE ram: blok_pamieci;
BEGIN
dane <= (OTHERS => 'Z');
IF oe = '0' THEN
dane <= ram(adres);
ELSIF we = '0' THEN
ram(adres) := dane;
END IF;
END PROCESS;
END;
List. 2. Listing odpowiadający pamięci synchronicznej RAM 16 x 8
W ramach zadania treningowego zaimplementować dowolny blok pamięci i przetestować jego działanie podłączając odpowiednie sygnały wejściowe (z wykorzystaniem przełączników dostępnych na płycie DE1) i wyjściowych (diody LED). W tym celu:
1. Utwórz nowy projekt.
2. Napisz program w VHDL opisujący projektowany układ.
3. Przypisz połączenia.
4. Dokonaj kompilacji projektu.
5. Zaprogramuj FPGA.
6. Przetestuj pracę układu.
4. Obsługa wyświetlacza matrycowego z wykorzystaniem pamięci ROM
Obsługa wyświetlacza matrycowego w sposób dynamiczny sprowadza się do cyklicznego odczytu pamięci i przekazywaniu danych w niej zapisanych (w postaci zer i jedynek) na port do którego dołączone jest urządzenie. Schemat poglądowy układu obsługi dynamicznej wyświetlacza matrycowego dany jest poniżej.
lpm_counter1
up counter
Zegar
INPUT
cloc m
k odulus 50000000
VCC
lpm_counter0
q[25..0]
up counter
cout
clock
modulus 8
inst3
q[3..0]
inst2
memory
clk
dane1[7..0]
OUTPUT
Wiersze_wy swietlacza
adres[3..0]
dane2[7..0]
OUTPUT
Kolumny _wy swietlacza
inst
Rys. 5. Schemat układu obsługi wyświetlacza na bazie pamięci ROM
Sygnał Zegar jest sygnałem prostokątnym generowanym przez jeden z trzech kwarców dostępnych na płycie DE1 (24MHz, 27MHz, 50MHz). Licznik lpm_counter1 spełnia rolę 5
dzielnika częstotliwości. Licznik lpm_countr0 spełnia rolę układu adresującego pamięć.
Częstotliwość odczytu pamięci wyznacza sygnał cout z licznika lpm_counter1. Do poprawnego wyświetlania (bez efektu mrugania wyświetlanego znaku lub niewyraźnego wyświetlania) konieczne jest uzyskanie częstotliwości odczytu około 500Hz. Blok pamięci memory zawiera predefiniowane dane związane z wyświetlanym znakiem jaki mamy zaobserwować na wyświetlaczu. Blok pamięci posiada dwa wyjścia sterujące odpowiednio wierszami i kolumnami wyświetlacza. W jednym takcie zegara na wyjściu pamięci pojawia się 8-bitowe słowo sterujące wierszem i 8-bitowe słowo sterujące kolumną. Stan niski na jednym z bitów słowa sterującego wybiera które pole wyświetlacza matrycowego zostanie zaświecone. Powtarzanie operacji z częstotliwością około 500Hz da w efekcie możliwość wyświetlenia dowolnego znaku złożonego z 64 punktów wyświetlacza matrycowego.
W ramach zadania zaimplementować układ, który na wyświetlaczu matrycowym wyświetla zdefiniowany znak (np. „→”). W tym celu:
1. Utwórz nowy projekt.
2. Posługując się schematem z Rys.5. napisz program w VHDL z użyciem pamięci opisujący projektowany układ.
3. Przypisz połączenia portu GPIO.
4. Dokonaj kompilacji projektu.
5. Zaprogramuj FPGA.
6. Przetestuj pracę układu.
ENTITY memory IS
PORT(clk: IN STD_LOGIC;
adres: IN INTEGER RANGE 0 TO 7;
wyj: OUT STD_LOGIC_VECTOR(15 DOWNTO 0));
END ENTITY;
ARCHITECTURE Behaviour OF memory IS
TYPE blok_pamieci IS ARRAY(0 TO 7) OF STD_LOGIC_VECTOR(7 DOWNTO 0);
CONSTANT rom1: blok_pamieci := ("00000001",
"00000010",
"00000100",
"00001000",
"00010000",
"00100000",
"01000000",
"10000000"); --wybiera kolejne wiersze wyś wietlacza
CONSTANT rom2: blok_pamieci := ("11000110", --litera H
"11000110",
"11000110",
"11111110",
"11111110",
"11000110",
"11000110",
"11000110"); --sekwencja do wyś wietlenia
BEGIN
SIGNAL in1, in2: STD_LOGIC_VECTOR(7 DOWNTO 0);
PROCESS(clk)
in2 <= NOT rom1(adres);
in1 <= NOT rom2(adres);
END PROCESS;
6
wyj<=in1(7)&in2(7)&in1(6)&in2(6)&in1(5)&in2(5)&in1(4)&in2(4)&in1(3)&in2(3)
&in1(2)&in2(2)&in1(1)&in2(1)&in1(0)&in2(0);
END;
List. 3. Listing realizujący wyświetlanie litery H
z użyciem dwóch bloków pamięci ROM 8 x 8
5. Rozbudowana obsługa wyświetlacza matrycowego
Punkt 4 przewiduje wyświetlanie jednego znaku na wyświetlaczu matrycowym. W
zadaniu tym należy rozbudować program z wcześniejszego punktu w taki sposób, by można było na wyświetlaczu uzyskać kolejne litery napisu HELLO przełączane przyciskiem KEY.
lpm_counter0
up counter
clock modulus 100000
memory _e
obw_wy j
lpm_counter1
T
C
U
q[17..0]
up counter
C
P
clk
dane1[7..0]
in1[7..0]
output[15..0]
V
IN
cout
clock
modulus 8
st[1..0]
dane2[7..0]
in2[7..0]
inst
q[2..0]
adres[2..0]
inst1
inst7
inst3
lpm_counter2
T
VCC
U
up counter
PT
key [0]
INPUT
U
VCC
clock
0
q[1..0]
O
5
T
_
U
k
inst8
P
c
T
lo
U
c
O
]6
..11
]
[31
..0
_
5
io
[1
p
1
g
_iopg
Rys. 6. Schemat przykładowego rozwiązania
6. Sprawozdanie
Sprawozdanie z zajęć laboratoryjnych powiano zawierać:
1. Opis słowny zadania do realizacji
2. Założenia realizowanego zadania
3. Procedurę projektową
4. Listingi gotowych programów
5. Weryfikację działania układu
6. Uwagi i wnioski
Literatura:
1. Barski M., Jędruch W.: Układy cyfrowe, podstawy projektowania i opisu w ję zyku VHDL, Wydawnictwo Politechniki Gdańskiej, 2007.
2. Łuba T.: Synteza układów cyfrowych, WKiŁ, Warszawa, 2004.
3. Mano M.M., Kime Ch.R.: Podstawy projektowania układów logicznych i komputerów, NT, Warszawa 2007.
4. Skahill K.: Ję zyk VHDL Projektowanie programowalnych układów logicznych, WNT, Warszawa, 2001.
Zamieszczone w instrukcji zrzuty ekranowe oraz zdjęcia pochodzą z materiałów firmowych dostarczonych przez firmę Altera.
7