Programowalne układy logiczne Worek różności jak dobrać się do gotowców w Spartanach? Szymon Acedański Marcin Peczarski Instytut Informatyki Uniwersytetu Warszawskiego 12 kwietnia 2011
Spis treści Wbudowane układy mnożące Pamięć RAM Komunikacja z komputerem przez USB Dodatek: Obsługa interfejsu VGA
Chcielibyście pomnożyć dwie liczby? 1. Wersja dla wytrwałych. Spartan 3E-100 ma 4 układy mnożące, 18-bitowe. architecture foo of bar is component MULT18X18 port ( P : out STD_LOGIC_VECTOR (35 downto 0); A : in STD_LOGIC_VECTOR (17 downto 0); B : in STD_LOGIC_VECTOR (17 downto 0)); end component; begin my_nice_multiplier : MULT18X18 port map (P => wynik, A => mnozna, B => mnoznik); end foo;
Chcielibyście pomnożyć dwie liczby? 2. Wersja intuicyjna. architecture foo of bar is signal a: unsigned(6 downto 0); signal b: unsigned(7 downto 0); signal p: unsigned(a length+b length-1 downto 0); begin p <= a * b; end foo; Potem w logach można odszukać takie teksty: Found 6x -bit multiplier for signal <sqr_out_full>. Number of MULT18X18SIOs: 2 out of 4 50%
Chcielibyście pomnożyć dwie liczby? 3. Wersja dla odważnych. Project New Source IP (Core Generator) Multiplier
Chcielibyście pomnożyć dwie liczby? 3. Wersja dla odważnych. Project New Source IP (Core Generator) Multiplier
Chcielibyście pomnożyć dwie liczby? 3. Wersja dla odważnych. Project New Source IP (Core Generator) Multiplier
Chcielibyście pomnożyć dwie liczby? 3. Wersja dla odważnych. Project New Source IP (Core Generator) Multiplier Po co ta wersja? Jawny wybór technologii realizacji układu mnożącego. Możliwość stworzenia układu synchronicznego, potokowego, o dużej maksymalnej częstotliwości taktowania (kosztem kilkucyklowych opóźnień). Możliwość wyprowadzenia jedynie części wyniku, poprawnie zaokrąglonej. A może od razu chcielibyśmy mnożyć liczby zespolone? To też przejdzie, tylko trzeba wybrać opcję Complex Multiplier z listy dostępnych IP Core ów.
Interfejs pamięci Zadanie: jak powinien wyglądać interfejs do pamięci RAM?
Interfejs pamięci Zazwyczaj mamy: A k,..., A 0 szynę adresową D n,..., D 0 trójstanową szynę danych WE sygnał zapisu (write enable) OE sygnał odczytu (output enable)
Interfejs pamięci Zazwyczaj mamy: A k,..., A 0 szynę adresową D n,..., D 0 trójstanową szynę danych WE sygnał zapisu (write enable) OE sygnał odczytu (output enable) Zasada działania: D <= memory(a) when noe = 0 else (others => Z ); if nwe = 0 then memory(a) := D; Zapis może być wyzwalany zboczem WE, lecz najczęściej jest on wyzwalany stanem niskim utrzymywanym przez czas ustalony w specyfikacji. Nie ma tutaj jawnego zegara.
Łączenie kości pamięci CE sygnał aktywacji układu (Chip Enable, Chip Select) D <= memory(a) when noe = 0 and nce = 0 else (others => Z ); if nwe = 0 and nce = 0 then memory(a) := D;
Łączenie kości pamięci CE sygnał aktywacji układu (Chip Enable, Chip Select) D <= memory(a) when noe = 0 and nce = 0 else (others => Z ); if nwe = 0 and nce = 0 then memory(a) := D; A 9...8 0 1 2 3 CE CE CE CE 256B RAM 256B RAM 256B RAM 256B RAM A 7...0, D, OE, WE A 7...0, D, OE, WE A 7...0, D, OE, WE A 7...0, D, OE, WE A 7...0, D, OE, WE
Spotykane odstępstwa Zamiast OE oraz WE jeden sygnał WR: noe <= WR; nwe <= not WR; Wówczas sterowanie odbywa się przez sygnał CE.
Spotykane odstępstwa Brak osobnej linii adresowej, za to rejestr adresu i pojedynczy sygnał A/D. Próba zapisu do pamięci podczas gdy A/D jest aktywny powoduje zapamiętanie wartości z linii danych do rejestru adresu. Wariacja nt. powyższego: zamiast A/D oraz WE mamy AStrobe oraz DStrobe, powodujące (na zboczu opadającym) odpowiednio wybranie adresu do manipulacji oraz wykonanie zapisu pod bieżącym adresem. Sygnał WAIT (lub BSY, RDY ) generowany przez układ pamięci, oznaczający zakaz zmiany stanu WE względnie AStrobe oraz DStrobe.
Pamięć w FPGA Project New Source IP (Core Generator) pamięć blokowa dużo, w jednym miejscu, pamięć dwuportowa (Dual-port RAM), tzn. posiadająca dwa niezależnie taktowane interfejsy, przechowywanie danych, np. pamięć wideo, kolejki FIFO. pamięć rozproszona mało, w wielu miejscach, przechowywanie stałych, np. funkcji, macierzy przekształceń, często spotykane w filtrach cyfrowych, realizowana przez użycie niewykorzystanych kawałków kombinatorycznych w normalnych elementach (slice ach) FPGA.
Wszystko jest pamięcią Wystarczy zmienić terminologię: pamięć RAM dowolne urządzenie adres numer rejestru zapis do pamięci zmiana wartości rejestru odczyt z pamięci odczyt wartości rejestru
Wszystko jest pamięcią Wystarczy zmienić terminologię: pamięć RAM dowolne urządzenie adres numer rejestru zapis do pamięci zmiana wartości rejestru odczyt z pamięci odczyt wartości rejestru Kto pamięta szynę ISA? CLK, RST, A 23,...,0 D 15,...,0 MEMRD, MEMWR, IORD, IOWR, IORDY. A na niej: klawiatura, mysz, zegar systemowy, koprocesor matematyczny, kontroler przerwań, kontroler DMA, dysk twardy, stacje dyskietek, porty szeregowe, równoległe, karta sieciowa, graficzna, nawet VGA!
Komunikacja z komputerem entity adeptio is Port ( EppAstb: in std_logic; EppDstb: in std_logic; EppWr : in std_logic; EppDB : inout std_logic_vector(7 downto 0); EppWait: out std_logic; ); end adeptio; Do tego oczywiście potrzeba odpowiedniego pliku.ucf (do wzięcia ze strony przedmiotu lub ze strony producenta płytki) oraz programu Adept (jest też dostępne SDK).
Dodatek obsługa VGA http://www.javiervalcarce.eu/wiki/vga_video_signal_ Format_and_Timing_Specifications Mamy na płytce standardowy interfejs VGA: entity demo is Port ( hsync: out std_logic; vsync: out std_logic; vout: out std_logic_vector(7 downto 0); -- RRRGGGBB ); end demo; Zegar nie jest wyprowadzany na zewnątrz. Monitor sam musi go odzyskać z odbieranego sygnału. Dlatego też tyle trwa zanim jakieś urządzenie załapie, że dostało obraz.
Dodatek obsługa VGA Potrzebujemy jeszcze precyzyjnie dobranego zegara VGA. Dostępny na płytce jest zbyt niestabilny, ale możemy dołożyć odpowiedni układ, wkładając go w podstawkę wlutowaną na płytce. Do wygenerowania zegara 25MHz do obsługi wyświetlania w rozdzielczości 640 480 może się przydać IP Core Single DCM SP.
Demo.