Altera Quartus II Opis niektórych komponentów dostarczanych razem ze środowiskiem Opracował: mgr inż. Leszek Ciopiński Spis treści Opis wybranych zagadnień obsługi środowiska Altera Quartus II:...1 Magistrale:... 1 Tworzenie symbolu z pliku...2 Wybór głównego układu projektowanej struktury...3 Język VHDL:... 3 Uwagi do wykorzystania języka VHDL w programie Altera Quartus...4 Wybrane układy z biblioteki standardowej... 4 Busmux... 4 lpm_add_sub...4 lpm_mult...8 Bramka NAND:... 10 Bramka XOR:... 10 Przerzutnik typu D:... 11 Przydatne funkcje i moduły w języku VHDL...12 Opis wybranych zagadnień obsługi środowiska Altera Quartus II: Magistrale: Program Quartus II umożliwia tworzenie magistral. Magistrale są to grupy przewodów łączące wejścia i wyjścia różnych układów. Ich stosowanie powoduje większą wygodę projektowania, gdy potrzebne jest np. przesłanie liczby ośmiobitowej z jednego układu do innego. W celu utworzenia magistrali należy podając nazwę portu (pinu, wejścia lub wyjścia układu) podać w nawiasach kwadratowych ilu bitowa jest magistrala, np.: we[3..0]. W podanym przykładzie utworzona zostanie magistrala czterobitowa. Należy zwrócić uwagę, że słowo we jest nazwą magistrali. W nawiasach natomiast podawane są numery linii, które mają zostać wykorzystane. Umożliwia to swobodny dostęp do wybranych linii magistrali, np.: we[2..1] lub we[2]. Poniżej przedstawiono przykład utworzenia ośmiobitowej szyny i sposób dostępu do pojedynczych przewodów. Altera Quartus II Opis wybranych komponentów 1
Tworzenie symbolu z pliku Ponieważ projektując bardziej skomplikowane układy wygodniej jest pewne ich fragmenty zamykać w osobne moduły, możliwość taka występuje również w programie Quartus. W tym celu należy otworzyć i skompilować plik, z którego chcemy zrobić symbol. Następnie należy wybrać pozycję menu File Create / Update Create Symbol Files for Current File. Wyświetlone zostanie okno dialogowe z pytaniem o nazwę tworzonego symbolu. Rekomendowana jest pozostawienie domyślnej nazwy pliku. Po zaakceptowaniu nazwy wyświetlony zostanie komunikat potwierdzający utworzenie symbolu. Możliwe jest teraz jego dodanie do dowolnego pliku. Altera Quartus II Opis wybranych komponentów 2
Symbole utworzone w ramach projektu Wybór głównego układu projektowanej struktury Jeśli konieczne jest dokonanie zmiany głównego elementu układu, np. gdy projektowany był podukład, który trzeba umieścić w innym układzie w formie symbolu, należy wykonać następujące czynności: 1. Utworzyć lub dołączyć plik, który będzie nowym głównym elementem układu. 2. W oknie Project Navigator przejść do karty Files. (Jeśli okno nie jest widoczne, można je otworzyć opleceniem View Utility Windows Project Navigator) 3. Na liście plików odnaleźć odpowiedni plik. 4. Z menu kontekstowego wybrać polecenie Set as Top-Level Entity Język VHDL: Dla celów laboratoryjnych wystarczą informacje przekazane na wykładzie. Informacje o podstawach programowania w języku VHDL można również znaleźć w księgozbiorze Wikibooks pod adresem: http://pl.wikibooks.org/wiki/vhdl oraz http://en.wikibooks.org/wiki/programmable_logic/vhdl. Altera Quartus II Opis wybranych komponentów 3
Uwagi do wykorzystania języka VHDL w programie Altera Quartus Układ napisany w języku VHDL traktowany jest przez Quartus'a tak samo, jak układy wykonane w edytorze graficznym. Projekt taki można skompilować i przetestować (używamy dokładnie tych samych narzędzi, co w przypadku schematu blokowego). Dla każdego układu opisanego w języku VHDL możliwe jest również wygenerowanie symbolu, który można dołączyć do innego schematu blokowego. Aby utworzyć nowy plik VHDL należy wydać polecenie File New Designed Files VHDL File. W nowo otworzonym oknie można już dokonać opisu urządzenia. Istotne jest jednak to, że w danym pliku można umieścić dokładnie jeden opis (deklaracja i implementacja) jednego układu. Ponadto plik VHDL musi nazywać się tak samo jak opisywany układ. Niespełnienie tego warunku zakończy się błędami kompilacji. Wybrane układy z biblioteki standardowej Busmux Jest to multiplekser dokonujący wyboru jednej z dwóch magistral, którą wystawia na swoim wyjściu. Ciekawą cechą układu jest możliwość definiowania szerokości magistrali jako parametr tego elementu. Na poniższej ilustracji pokazano lokalizację układu w bibliotece i sposób jego ustawienia dla magistrali 32-bitowej. lpm_add_sub Układ ten należy do grupy MegaFunctions (dokładna lokalizacja to: megafunctions/arithmetic/lpm_add_sub). Oznacza to, że dokładne właściwości układu można dostosować w zależności od potrzeb projektanta. Po wybraniu tego układu otworzone zostanie okno MegaWizard, w którym należy dokonać wyboru języka w jakim opisany zostanie układ (proszę wybierać język VHDL) oraz miejsce i nazwę pod jaką układ ma zostać zapisany. Poniżej Altera Quartus II Opis wybranych komponentów 4
przedstawiono opis najważniejszych ustawień: Altera Quartus II Opis wybranych komponentów 5
Ilu bitowe są wejścia i wyjścia Jak ma działać układ? Tylko sumator Tylko odejmowanie Odejmowanie lub dodawanie uzależnione od wejścia sterującego Czy któreś wejście ma stałą wartość? Nie, oba wejścia mają wartości zmienne Tak, dane wejście ma stałą wartość równą i wyrażoną w systemie. Operacje na liczbach ze znakiem czy bez? Altera Quartus II Opis wybranych komponentów 6
Czy tworzyć dodatkowe wejście przeniesienia / pożyczki? Czy tworzyć dodatkowe wyjście przeniesienia / pożyczki? Czy tworzyć dodatkowe wyjście znacznika przepełnienia? Czy tworzyć potokowe wykonywanie operacji? Tak, z wynikiem po cyklach zegara. Utwórz asynchroniczne wejście zerujące. Utwórz wejście aktywujące zegar. Altera Quartus II Opis wybranych komponentów 7
lpm_mult Podobnie jak powyższy komponent, lpm_mult również jest układem, którego parametry należy skonfigurować w zależności od potrzeb projektu. Umożliwia to zastosowanie mnożarki najlepiej dostosowanego do potrzeb układu. Ponadto, jeśli dany układ FPGA zawiera komponenty wspierające budowę tego układu, zostaną one wykorzystane w zamian za standardowe komórki LUT, co pozwoli na zoptymalizowanie projektowanego układu. Na poniższych ilustracjach zostały przedstawione kolejne etapy tworzenia tego komponentu. Podajemy nazwę komponentu łącznie ze ścieżką dostępu. Można pozostawić nazwę domyślną. Altera Quartus II Opis wybranych komponentów 8
Metoda wprowadzania danych: Czy dane mają być wprowadzane poprzez dwie równoległe szyny, czy poprzez jedno wejście w sposób synchroniczny? Szerokość szyn wejściowych Czy szerokość szyny wejściowej ma być obliczona automatycznie (suma szerokości szyn wejściowych), czy ma być zdefiniowana przez projektanta? Czy druga z wartości ma być wielkością stałą, a jeśli tak, to jaką? Czy liczby są zapisane ze znakiem, czy bez znaku? Jaka ma być metoda implementacji układu? Altera Quartus II Opis wybranych komponentów 9
Czy układ ma zawierać potokowe przetwarzanie operacji? Jeśli tak, to w jakim czasie ma pojawić się odpowiedź? Jaką metodę optymalizacji wybrać? Domyślną, szybkość (jak szybko układ ma działać) czy przestrzenną (ile miejsca układ ma zajmować). Bramka NAND: Przykładowe moduły napisane w języku VHDL (źródło: http://pl.wikibooks.org/wiki/vhdl/przyk %C5%82ady_kodu): Zawartość pliku opisującego dwuwejściową bramkę NAND: library ieee; use ieee.std_logic_1164.all; entity nand2 is port ( a,b : in std_logic; c : out std_logic ); end nand2; architecture logic of nand2 is begin c <= not (a and b); end logic; Bramka XOR: Przykładowe moduły napisane w języku VHDL (źródło: http://pl.wikibooks.org/wiki/vhdl/przyk %C5%82ady_kodu ): Zawartość pliku opisującego dwu wejściową bramkę XOR: Altera Quartus II Opis wybranych komponentów 10
library ieee; use ieee.std_logic_1164.all; entity xor2 is port ( a,b : in std_logic; c : out std_logic ); end xor2; architecture behavioral of nand2 is begin c <= not (a and b); end behavioral; architecture logic of xor2 is component nand2 port ( a, b : in std_logic; c : out std_logic ); end component nand2; signal wew1,wew2,wew3 : std_logic; begin bramka1 : nand2 port map (a=>a, b=>b, c=>wew1 ); bramka2 : nand2 port map (a=>a, b=>wew1, c=>wew2 ); bramka3 : nand2 port map (a=>wew1, b=>b, c=>wew3 ); bramka4 : nand2 port map (a=>wew2, b=>wew3, c=>c ); end logic; W powyższym przykładzie należy zauważyć, że do połączenia zewnętrznego komponentu z wewnętrznymi sygnałami opisywanego modułu niezbędne jest użycie port map. Przerzutnik typu D: Przykładowe moduły napisane w języku VHDL (źródło: http://pl.wikibooks.org/wiki/vhdl/przyk %C5%82ady_kodu ): Zawartość pliku opisującego gotowy do symulacji i syntezy logicznej, przerzutnik typu D z Resetowaniem synchronicznym. library IEEE; -- dołączenie standardowej biblioteki IEEE use IEEE.STD_LOGIC_1164.all; -- dołączenie pakietu 'STD_LOGIC_1164' z biblioteki IEEE -- definiującego popularne stany logiczne entity dffr is -- opis interfejsu przerzutnika (połączeń z otoczeniem) port( CLK : in STD_LOGIC; -- wejście zegarowe RESET : in STD_LOGIC; -- wejście kasowania DIN : in STD_LOGIC; -- wejście danych DOUT : out STD_LOGIC -- wyjście danych ); Altera Quartus II Opis wybranych komponentów 11
end dffr; architecture behavior of dffr is begin dffar: process (CLK, RESET) begin if rising_edge(clk) then if RESET='1' then DOUT <= '0'; else DOUT <= DIN; end if; end if; end process; -- opis wnętrza przerzutnika (w tym przypadku -- jest to opis behawioralny) -- proces z listą czułości (sensitivity list) -- wykrywanie aktywnego zbocza zegara -- kasowanie stanem wysokim wejścia RESET -- przypisanie stałej to sygnału wyjściowego -- przypisanie stanu wejścia do sygnału wyjściowego end behavior; Przydatne funkcje i moduły w języku VHDL falling_edge() - jest przeciwieństwem rising_edge(), to znaczy, że zwraca wartość true, jeśli wykryta została zmiana stanu sygnału podanego jako parametr tej funkcji z wysokiego na niski Instrukcja case służy do wprowadzania rozejścia na różne drogi. Instrukcje tą stosuje się wyłącznie wewnątrz procesu. case kod_instrukcji is when x 00 => dodawanie; when x 01 x 10 => czekanie; when others => nieznany_kod; end case; use IEEE.STD_LOGIC_UNSIGNED.all; - biblioteka, której dodanie powoduje, że wszystkie sygnały w projektowanym module będą traktowane jako wartości całkowitoliczbowe bez znaku. Umożliwia to używanie tych sygnałów zarówno w sposób klasyczny (np. odwoływanie się do konkretnych bitów), jak i wykonywanie na nich działań arytmetycznych (używamy ich wówczas tak samo jak zwykłych zmiennych, np.: syg1 <= syg2 + syg3) Altera Quartus II Opis wybranych komponentów 12