Programowanie Układów Logicznych kod kursu: ETD6203 Analiza układów sekwencyjnych W3 7.03.2018 mgr inż. Maciej Rudek opracował: dr inż. Daniel Kopiec
Zmiany w terminach
Plan wykładu 1 2 3 4 5 6 Ciekawostki odbiornik FPGA VHDL komponenty, powtórka wiadomości DCM w układach Spartan 3E Analiza strukturalna Porty Podsumowanie 3
Ciekawostki FBGA-WEB-SDR Szerokopasmowy odbiornik FPGA do 30 MHz, - sprawdź 225 khz!!! 4 http://websdr.ewi.utwente.nl:8901/
Komponenty, pakiety VHDL Powtarzające się fragmenty kodu VHDL są zazwyczaj opisywane w formie: komponentów, funkcji, procedur umieszczonych w pakietach, tworzących następnie bibliotekę. 6
Tworzenie komponentów: - deklaracja bezpośrednia projekt_g.vhd inverter.vhd nand_2.vhd nand_3.vhd 7
Tworzenie komponentów: - deklaracja bezpośrednia Deklaracja komponentów: COMPONENT nazwa_komponentu IS PORT ( nazwa_sygnału : tryb i rodzaj sygnału; nazwa_sygnału : tryb i rodzaj sygnału ); END COMPONENT; COMPONENT inverter IS PORT ( a : in std_logic; b : out std_logic); END COMPONENT; Użycie komponentów: etykieta: nazwa_komponentu PORT MAP (lista przypisań); komponent_1 : inverter PORT MAP (x, y); komponent_2 : nand_2 PORT MAP (x=>a, y=>b, w=>open, z=>d); 8
Tworzenie komponentów: - komponent w pakiecie use work.nazwa_pakietu.all; inverter.vhd nand_2.vhd nand_3.vhd
Opis strukturalny 10 library IEEE; use IEEE.std_logic_1164.all; entity eqcomp4 is port (a, b : in std_logic_vector(3 downto 0); equals : out std_logic); end eqcomp4; use work.gatespkg.all; architecture struct of eqcomp4 is signal x: std_logic_vector (0 to 3); begin u0: xnor port map (a(0), b(0), x(0)); u1: xnor port map (a(1), b(1), x(1)); u2: xnor port map (a(2), b(2), x(2)); u3: xnor port map (a(3), b(3), x(3)); u4: and port map (x(0), x(1), x(2), x(3), wynik); end struct; Zalety tworzenia komponentów: - dekompozycja na mniejsze fragmenty, - wielopoziomowa hierarchia, - zdefiniowanie dekompozycji logicznej, - możliwość symulowania każdego obiektu osobno.
Tworzenie komponentów Deklaracja bezpośrednia Komponent w pakiecie 11
Układy sekwencyjne Architektura układów FPGA wymusza na konstruktorach tworzenie projektów synchronicznych, co jest jedynym sposobem na zagwarantowanie ich stabilnej pracy w pełnym zakresie częstotliwości sygnałów wejściowych. 12 Zasady realizacji logiki sekwencyjnej: rejestry powinny być taktowane tym samym sygnałem, elementy pamiętające należy opisywać w oddzielnych segmentach, możliwie jak najprościej, reset asynchroniczny powinien być stosowany jedynie do inicjalizacji, do zerowania/ustawiania rejestrów w czasie pracy należy używać sygnału synchronicznego
FPGA funkcjonalnie 13 CLB w SPARTAN 3 od 1728 do 74880
14 FPGA funkcjonalnie
15 Na co zwrócić uwagę zasoby
16 Na co zwrócić uwagę zasoby
Budowa CLB SLICEM: - ulokowane w lewej części CLB, - przystosowane do implementacji funkcji logicznych, rejestrów przesuwnych, pamięci RAM SLICEL: - ulokowane w prawej części CLB, - przystosowane do implementacji tylko funkcji logicznych 17 Każda komórka CLB składa się z czterech slice-ów.
SLICEM, SLICEL Każdy SLICE posiada: dwie konfigurowalne 4-wejściowe tablice LUT (F-LUT, G-LUT), konfigurowalne przerzutniki, dwa multipleksery, konfiguracja ścieżek przesyłu danych 18
Zasoby połączeniowe Każdy CLB ma możliwość bezpośredniego korzystania z zasobów 8 sąsiadujących CLB. Wymiana danych pomiędzy CLB znajdujących się w większej odległości odbywa się za pomocą dodatkowych zasobów połączeniowych: - linie długie, łączące co szósty, najszybsze, - linie 8-krotne, łączące co trzeci CLB, - linie podwójne, komunikacją pomiędzy CLB. 19
20 Zasoby połączeniowe
Sygnały zegarowe linie globalne Układy Spartan 3 wyposażono w 8 globalnych linii do dystrybucji zegara: GCLK Dystrybucja sygnału zegarowego liniami lokalnymi wiąże się z ryzykiem zaniku synchronizacji 21
Zegar linie globalne Budowa FPGA powoduje, że elementy logiczne rozmieszczone na powierzchni struktury pomimo taktowania sygnałem zegarowym pochodzącego z jednego źródła nie są taktowane równocześnie. a) b) Dystrybucja sygnału zegarowego za pomocą: a) połączeń segmentowych, b) za pomocą linii niezależnych od lokalnych zasobów połączeniowych. 22 Niedoskonałości dystrybucji sygnałów zegarowych kompensuje układ DCM (Direct Clock Manager)
Moduł DCM Moduły DCM pozwalają na: eliminację przesunięć fazowych zegara (clock skew), wewnątrz układu FPGA lub w stosunku do elementów zewnętrznych, przesunięcie fazowe zegara o ustaloną lub regulowaną część okresu, generację zegara o częstotliwości pomnożonej przez iloraz dwóch liczb, generację zegara o współczynniku wypełnienia 50 % na podstawie zegara nie spełniającego tego warunku. 23
Moduł DCM we. syg. zegarowego pin (C9), CLK =50 MHz wy. syg. CLK 0 i 180 24 DCM składa się z czterech komponentów: Digital Frequency Synthesizer (DFS) syntezera częstotliwości, Delay Locked Loop (DLL) pętli opóźniającej, Phase Shift (PS) programowalnego przesuwnika fazy, Status Logic zespołu logiki.
DCM blok DLL 25 Sygnał wejściowy podawany jest na wejście CLKIN, wejście CLKFB służy do podania sygnału dla pętli sprzężenia zwrotnego. Dzięki temu układ DLL może monitorować jakość sygnału taktującego. Blok DLL posiada cztery wyjścia sygnałów zegarowych będących kopią sygnału CLKIN jednak przesuniętych w fazie o: 0, 90, 180, 270. Na wyjściach CLK2X oraz CLK2X180 sygnał o częstotliwości dwukrotnie większej.
DCM blok DLL Wyjście CLKDV umożliwia podział częstotliwości CLKIN f CLKDV = f CLKIN /CLKDV_DIVIDE gdzie: CLKDV_DIVIDE = 1,5; 2; 2,5,..15; 16 wsp. Wypełnienia sygnału = 50% 26 Źródło: Using Digital Clock Managers (DCMs) in Spartan-3 FPGAs http://www.xilinx.com/support/documentation/application_notes/xapp462.pdf
DCM blok DLL - zegar CLK0 CLK90 CLK180 CLK270 sygnał podstawowy sygnał przesunięty o 90 sygnał przesunięty o 180 sygnał przesunięty o 270 CLKIN CLK2X CLKDV sygnał wejściowy sygnał 2 x CLKIN sygnał CLKIN/2 27 Synteza częstotliwości i przesunięcie fazy, diagramy czasowe.
DCM blok Phase Shifter Sterowany cyfrowo przesuwnik fazy 28 PSINCDEC zwiększenie, zmniejszenie przesunięcia fazy, PSEN wejście aktywujące, PSCLK sygnał taktujący, zegarowy PSDONE stan gotowości
DCM na liniach globalnych Sposób konfiguracji układu DCM, linia zegarowa dystrybuowana linią globalną 29 Konfiguracja w projektach: - opis VHDL, - schemat element, - kreator konfiguracji (Xlinx CORE Generator) CLKIN CLKOUT Korekcja wsp. wypełnienia sygnału zegarowego CLKIN
30 Xilinx CORE Generator
Multiplikatory układy mnożące standardowy element architektury, mnożenie dwóch 18-bitowych liczb U2, synchroniczne lub asynchroniczne, 31 Źródło: Using Embedded Multipliers in Spartan-3 FPGAs http://www.xilinx.com/support/documentation/application_notes/xapp467.pdf
Multiplikatory komponent VHDL Deklaracja komponentu MULT18X18: - po słowie kluczowym architecture jednak przed begin 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; - uchwyt instancji po słowie kluczowym begin MULT18X18_INSTANCE_NAME : MULT18X18 port map (P => user_p, A => user_a, B => user_b); 32
Pamięć BlockRAM wewnętrzna konfigurowalna pamięć SRAM, podzielona na bloki, dwuportowa, możliwy zapis, odczyt, możliwość łączenia bloków 33
Sygnały i zmienne Zastosowanie Sygnał połączenia w obwodzie Zmienna lokalna informacja, połączenia wewnętrzne Zasięg globalny lokalny, w obszarze deklaracji Zachowanie Użycie Wnioski przypisanie nie jest natychmiastowe w kodzie sekwencyjnym w pakietach, deklaracjach, architekturach sygnał generuje przerzutnik kiedy wykonywane jest do niego przypisanie na zboczu innego sygnału - podczas synchronicznego przypisania przypisanie natychmiastowe w kodzie sekwencyjnym, procesie, funkcji lub procedurze *Zmienna nie generuje przerzutnika, jeżeli jej wartość nie opuszcza procesu. Użycie <= := 34 * zmienna wygeneruje przerzutnik, gdy jest użyta przed przypisaniem do niej wartości
Zmienne zmienne mogę być deklarowane jedynie wewnątrz procesu lub podprogramu, zmienna widoczna jest tylko w procesie, w którym ją zadeklarowano lokalna inf. przypisanie wartości do zmiennej := następuję natychmiast, VARIABLE control : BIT := '0'; VARIABLE count : INTEGER RANGE 0 TO 100; VARIABLE y : STD_LOGIC_VECTOR (7 DOWNTO 0) := "10001000"; 35
Sygnały i zmienne a) b) signal temp, a : std_logic; begin p0: process (clk) is if ( clk event and clk = 1 ) then out_1 <= temp; out_2 <= a; end if; end process p0; signal temp, a : std_logic; begin p0: process (clk) is if ( clk event and clk = 1 ) then out_1 <= temp; end if; out_2 <= a; end process p0; out_1, out_2 zostaną zapamiętane out_1 zostanie zapamiętane, out_2 zostanie przepisane 36
Sygnały i zmienne 37 library IEEE; use IEEE.std_logic_1164.all; entity D_FF is port ( D, clk, reset : in std_logic; Q, Qbar : out std_logic ); end entity D_FF; architecture sig of D_FF is signal state : std_logic; begin p0: process (clk, reset) is begin if (reset = 0 ) then state <= 0 ; elsif rising_edge (clk) then state <= D; end if; end process p0; Q <= state; Qbar <= not state; end architecture sig; Przerzutnik typu D z wyjściem Q i Q Tak nie można: Qbar <= not Q - Q zadeklarowano jako out, - można użyć buffer, - lepiej jednak zapamiętać stan wewnętrzny
Sygnały i zmienne 38 library IEEE; use IEEE.std_logic_1164.all; entity D_FF is port ( D, clk, reset : in std_logic; Q, Qbar : out std_logic ); end entity D_FF; architecture sig of D_FF is signal state : std_logic; begin p0: process (clk, reset) is begin if (reset = 0 ) then state <= 0 ; elsif rising_edge (clk) then state <= D; end if; end process p0; Q <= state; Qbar <= not state; end architecture sig; library IEEE; use IEEE.std_logic_1164.all; entity D_FF is port ( D, clk, reset : in std_logic; Q, Qbar : out std_logic ); end entity D_FF; architecture var of D_FF is begin p0: process (clk, reset) is variable state : std_logic; begin if (reset = 0 ) then state := 0 ; elsif rising_edge (clk) then state := D; end if; Q <= state; Qbar <= not state; end process p0; end architecture var;
Analiza strukturalna seq: process (clk) begin if clk event and clk = 1 then b <= c; a <= b; h <= i; i <= j xor k; end if ; end process seq; Zadanie: Przeanalizujmy ile mamy tutaj przerzutników? chcą uniknąć wielu rejestrów operacja przypisania należy realizować współbieżnie (na zewnątrz procesu) 39
Gdzie ten ukryty rejestr architecture test of reg is p0: process begin wait until clk = 1 x <= 0 ; y <= 0 ; if (a = b) then x <= 1 ; end if; if (x = 1 ) then y <= 1 end if ; end process p0; end architecture test architecture test of reg is p1: process begin variable x : bit; wait until clk = 1 x := 0 ; y <= 0 ; if (a = b) then x := 1 ; end if; if (x = 1 ) then y <= 1 end if ; end process p1; end architecture test 40
Klauzula GENERIC GENERIC służy do parametryzacji kodu VHDL GENERIC (nazwa_parametru : typ_parametru := wartość); Przykład: zdefiniować parametr o nazwie n, typu INTEGER, z domyślną wartością 8: entity przykład is GENERIC (n : INTEGER := 8); PORT (...); end przykład; W entity można mieć więcej niż jeden parametr GENERIC GENERIC (n: INTEGER := 8; vector: BIT_VECTOR := "00001111"); 41
Klauzula GENERIC - użycie entity register_n is generic ( width: integer := 8); port ( clk, rst, en: in std_logic; data: in std_logic_vector (width-1 downto 0); q: out std_logic_vector (width-1 downto 0)) end register_n; Chcąc stworzyć wektor 8-elementowy konieczny jest zapis: (width 1), wektor numerowany jest od 0 do 7 co w rezultacie daje 8 pozycji 42
Porty we/wy - ogólnie 43 Tryby kierunkowe portów: In - wejście sygnału Out wyjście sygnału (bez sprzężeń) Buffer nośnik sygnału wewnątrz architektury Inout sygnał dwukierunkowy (magistrale np. DMA)
Porty we/wy złote zasady library IEEE; use IEEE.std_logic_1164.all; 44 entity port_mode is port ( a, b : in std_logic; x, y : out std_logic ); end entity port_mode; architecture data_flow of port_mode is begin x <= a and b; y <= not x; end data_flow; Error (10309): VHDL Interface Declaration error in port_mode.vhdl(13): interface object x of mode out cannot be read. Change object mode to buffer or inout. Sygnał x jest użyty do obliczenia sygnału y - z punktu widzenia VHDL jest on traktowany jako sygnał zewnętrzny wchodzący do układu, co jest niezgodne z trybem portu out Rozwiązanie? - inout, - buffer, - pomocniczy sygnał, signal tmp : std_logic;
Bufor trójstanowy Symbol bufora trójstanowego buf_tr: process (OE, DATA_IN) begin if OE = 0 then DATA_OUT <= (others => Z ); else DATA_OUT <= DATA_IN; end if ; end process buf_tr; DATA_OUT <= DATA_IN when OE = 1 else Z Bufory trójstanowe w realizacji multipleksera 2 x 1 45
Magistrale trójstanowe library IEEE; use IEEE.std_logic_1164.all; entity tri_state is generic (n : integer := 7); port ( en : in std_logic, input : in std_logic_vector (n downto 0), output : out std_logic_vector (n downto 0), end tri_state; 46 architecture data_glow of tri_state is begin output <= input when (en = 0 ) else (others => Z ) end architecture tri_state;
Sygnał z wielokrotnym nośnikiem Sygnał z wielokrotnym nośnikiem powodujący konflikt architecture drivers of ands is begin y <= a and b; y <= a and b; end drivers; Sygnał z wielokrotnym nośnikiem zwiększenie wydajności wyjścia 47 - Programy do syntezy mogą generować wielokrotne nośniki po to aby zwiększyć prąd wyjściowy.
Sztuczka z sygnałem zegarowym Zwykle nie da się zsyntezować kodów, które zawierają przypisanie do tego samego sygnały na obu zboczach zegara: p0: process (clk) is if ( clk event and clk = 1 ) then counter <= counter +1; elsif ( clk event and clk = 0 ) then counter <= counter +1; end if; end process p0; Można natomiast zastosować dwa osobne liczniki p0: process (clk) is if ( clk event and clk = 1 ) then counter _2<= counter +1; end if; end process p0; ---------------------------------------------------- p1: process (clk) is if ( clk event and clk = 0 ) then counter_1 <= counter +1; end if; end process p1; 48
Przykładowe pytania 1. Zmienne i sygnały różnice, podobieństwa 2. Klauzula GENERIC - zastosowanie 3. Wyjaśnij czym jest CLB, IOB, SLICE 4. Multiplikatory zastosowanie, zasada działania 5. Zadania modułu DCM 6. Zasada działania bloku DLL 7. Podstawowe bloki w układach FPGA 8. Zasoby połączeniowe w FPGA podział 49 9. Zastosowanie globalnych linii połączeniowych