Projektowanie hierarchiczne Mariusz Rawski

Podobne dokumenty
Projektowanie hierarchiczne Mariusz Rawski

Projektowanie złożonych układów cyfrowych

Specyfika projektowania Mariusz Rawski

Projektowanie automatów z użyciem VHDL

Projekt prostego procesora

Układy reprogramowalne i SoC Język VHDL (część 4)

Systemy Czasu Rzeczywistego FPGA

Systemy Czasu Rzeczywistego FPGA

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

Cyfrowe przetwarzanie sygnałów Mariusz Rawski

Altera Quartus II. Opis niektórych komponentów dostarczanych razem ze środowiskiem. Opracował: mgr inż. Leszek Ciopiński

Synteza strukturalna Mariusz Rawski

WOJSKOWA AKADEMIA TECHNICZNA im. Jarosława Dąbrowskiego LABORATORIUM UKŁADÓW PROGRAMOWALNYCH I SPECJALIZOWANYCH

PUCY Kolos 2: Reloaded

Realizacja algorytmu wyznaczania wyrazów ciągu w języku VHDL z zastosowaniem podziału projektu na moduły: FSM i Data Path.

Modelowanie złożonych układów cyfrowych (1)

VHDL. Zebrał i opracował R.Walkowiak PTC wykład 2013/2014

Systemy Czasu Rzeczywistego FPGA

Projektowanie Urządzeń Cyfrowych

Układy Cyfrowe laboratorium

Laboratorium 10 Temat: Zaawansowane jednostki testowe. Operacje na plikach. Funkcje.

LABORATORIUM TECHNIKA CYFROWA. Pamięci. Rev.1.35

Realizacja logiki kombinacyjnej Mariusz Rawski

Sposoby projektowania systemów w cyfrowych

Projektowanie układów kryptograficznych Mariusz Rawski

Technika cyfrowa projekt: Sumator 4 bitowy równoległy

1. ISE WebPack i VHDL Xilinx ISE Design Suite 10.1 VHDL Tworzenie projektu Project Navigator Xilinx ISE Design Suite 10.1 File

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki. ĆWICZENIE Nr 4 (3h) Przerzutniki, zatrzaski i rejestry w VHDL

Synteza strukturalna

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

Implementacja algorytmu szyfrującego

Programowalne układy logiczne

Krótkie wprowadzenie do ModelSim i Quartus2

Aby w pełni przetestować układ o trzech wejściach IN_0, IN_1 i IN_2 chcemy wygenerować wszystkie możliwe kombinacje sygnałów wejściowych.

XC4000: LUT jako ROM Układy Cyfrowe i Systemy Wbudowane 2 Układy FPGA cz. 2 ROM32X1 VHDL inference example ROM 16x2b type

Programowalne układy logiczne

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja do ćwiczeń laboratoryjnych z przedmiotu: SYNTEZA UKŁADÓW CYFROWYCH ES2D100005

Języki opisu sprzętu VHDL Mariusz Rawski

Metoda Newtona przyjmuje następujące założenia dla funkcji :

Programowalne układy logiczne

Podstawy techniki cyfrowej zima 2017 Rafał Walkowiak Synteza strukturalna wyższego poziomu

mgr inż. Maciej Rudek opracował: dr inż. Daniel Kopiec

DOKUMENTACJA PROJEKTU

Podstawy techniki cyfrowej zima 2015 Rafał Walkowiak

1.Wprowadzenie do projektowania układów sekwencyjnych synchronicznych

Układy reprogramowalne i SoC Implementacja w układach FPGA

Projektowanie w VHDL

Ćwiczenie 1 VHDL - Licznik 4-bitowy.

Instrukcje sekwencyjne

THE HARDWARE IMPLMENTATION OF THE PS/2 PROTOCOL ON SPARTAN 3 FPGA DEVICE IMPLEMENTACJA SPRZĘTOWA PROTOKOŁU PS/2 W UKLADZIE FPGA SPARTAN 3

Systemy Czasu Rzeczywistego FPGA

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki. Automaty stanów

Programowalne Układy Cyfrowe Laboratorium

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja do ćwiczeń laboratoryjnych z przedmiotu: PROGRAMOWALNE STRUKTURY LOGICZNE

Ćw. 7: Układy sekwencyjne

Układy reprogramowalne i SoC Specjalizowane moduły FPGA

Programowanie Układów Logicznych kod kursu: ETD6203 W dr inż. Daniel Kopiec. Pamięć w układach programowalnych

MMfpga01. MMfpga11. Instrukcja konfiguracji środowiska, przykładowy projekt oraz programowanie układu

Elementy języka VHDL. obiekty typy danych atrybuty pakiety i biblioteki instrukcje współbieżne instrukcje sekwencyjne. PUE-w3 1

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki

KURS Hexcalcul (2) Implementacja kalkulatora kodu BCD na Hex w układzie programowalnym

CZ1. Optymalizacja funkcji przełączających

AHDL - Język opisu projektu. Podstawowe struktury języka. Komentarz rozpoczyna znak i kończy znak %. SUBDESIGN

WPROWADZENIE Mikrosterownik mikrokontrolery

Układy sekwencyjne. Podstawowe informacje o układach cyfrowych i przerzutnikach (rodzaje, sposoby wyzwalania).

Sławomir Kulesza. Projektowanie automatów asynchronicznych

Elementy struktur cyfrowych. Magistrale, układy iterowane w przestrzeni i w czasie, wprowadzanie i wyprowadzanie danych.

Asynchroniczne statyczne układy sekwencyjne

Podstawowe moduły układów cyfrowych układy sekwencyjne cz.2 Projektowanie automatów. Rafał Walkowiak Wersja /2015

LABORATORIUM OPTOELEKTRONIKA I SENSORYKA Oprogramowanie bariery podczerwieni w układzie CPLD

Projektowanie Scalonych Systemów Wbudowanych VERILOG

Tranzystor JFET i MOSFET zas. działania

Układy Cyfrowe projekt. Korekcja jasności obrazów w 24-bitowym formacie BMP z użyciem funkcji gamma. Opis głównych modułów sprzętowych

Implementacja algorytmu DES

LABORATORIUM ELEKTRONIKA Projektowanie koderów, transkoderów i dekoderów w języku VHDL

1. Synteza układów opisanych w języku VHDL Xilinx ISE Design Suite 10.1 VHDL 2. Obsługa przetwornika CA Project Add source...

Sumatory H D L. dr inŝ. Paweł Tomaszewicz Instytut Telekomunikacji Politechnika Warszawska

Laboratorium przedmiotu Technika Cyfrowa

Układy reprogramowalne i SoC Testbenches. Symulacja sterowana zdarzeniami.

Układy reprogramowalne i SoC Język VHDL (część 3)

Programowanie Układów Logicznych kod kursu: ETD6203. Komunikacja z układami cyfrowymi W dr inż. Daniel Kopiec

Układy FPGA w przykładach, część 2

Spis treści 1. Wstęp 2. Ćwiczenia laboratoryjne LPM

UKŁADY MIKROPROGRAMOWALNE

Programowalne układy logiczne

Technika Cyfrowa. Wprowadzenie do laboratorium komputerowego część II

Projekt Koder HDB-3. Wykonali: Agnieszka Sikorska, Łukasz Kokosza EiTI Politechnika Warszawska Warszawa Projekt UCYF Koder HDB-3

Systemy wbudowane. Układy programowalne

Układy logiczne układy cyfrowe

Układy reprogramowalne i SoC Język VHDL (część 2)

Pojedyncze wartości zadeklarowanego typu Ustawiane przed rozpoczęciem symulacji bez moŝliwości

VHLD Very High Speed Integrated Circuit (VHSIC) Hardware Description Language (VHDL)

Elementy struktur cyfrowych. Magistrale, układy iterowane w przestrzeni i w czasie, wprowadzanie i wyprowadzanie danych.

VHDL cz.1. Rafał Walkowiak IIn PP Wer

Przykładowe pytania z części PSPICE. 1. Podaj zasady tworzenia pliku symulacyjnego. 2. Czy składnia PSPICE jest czuła na wielkość liter? 3.

Politechnika Białostocka Wydział Elektryczny Katedra Automatyki i Elektroniki. ĆWICZENIE Nr 8 (3h) Implementacja pamięci ROM w FPGA

Bramki logiczne Podstawowe składniki wszystkich układów logicznych

Technika Mikroprocesorowa

Układy asynchroniczne

Bezpieczeństwo informacji oparte o kryptografię kwantową

Transkrypt:

CAD Projektowanie hierarchiczne rawski@tele.pw.edu.pl http://rawski.zpt.tele.pw.edu.pl/

Zamek elektroniczny: Elektroniczny zamek kod 4 cyfrowy kod wprowadzony z klawiatury ready sygnalizacja gotowości pracy, rozpoczęcie wprowadzania kodu zmienia ten sygnał na nieaktywny open sygnał otwarcia zamka Wprowadzenie poprawnego kodu otwiera zamek na określony czas Sterowanie klawiaturą numeryczna 1 2 3 A 4 5 6 B 7 8 9 C * 0 # D open ready

Elektroniczny zamek schemat blokowy Kontroler klawiatury: podaje sygnał naciśnięcia klawisza podaje kod naciśniętego klawisza Wykrywanie sekwencji: analizuje kody klawiszy i wykrywa sekwencje kodową otwierającą zamek Układ czasowy: odmierza określony czas po otwarciu zamka i wysyła sygnał zamknięcia zamka 1 2 3 A 4 5 6 B 7 8 9 C * 0 # D Kontroler klawiatury kod klawisza naciśnięty zamknij Wykrywanie sekwencji Układ czasowy otwarty open ready

Kontroler klawiatury: Kontroler klawiatury podanie sygnału aktywnego na linie kolejnych wierszy sprawdzanie linii kolumn w celu wykrycia sygnału aktywnego pochodzącego ze zwarcia styków klawisza col[ ] 1 2 3 A 4 5 6 B 7 8 9 C * 0 # D row[ ] Kontroler klawiatury key key_pulse

Kontroler klawiatury schemat blokowy Kontroler klawiatury: licznik generuje liczby 4 bitowe, 2 najstarsze bity sterują dekoderem, wystawiając sygnał aktywny na kolejne linie wierszy klawiatury 2 młodsze bity sterują multiplekserem przeglądając kolejne linie kolumn klawiatury wystąpienie na wyjściu multipleksera sygnału aktywnego sygnalizuje naciśnięcie klawisza zatrzymuje licznik kodem klawisza jest wartość licznika może się okazać konieczne przekodowanie col[ ] 1 2 3 A 4 5 6 B row[ ] q[1..0] q[3..0] key 7 8 9 C * 0 # D q[3..2] q[3..0] Licznik 4-bit stop key_pulse

Sterownik klawiatury problemy Naciśnięcie dwóch klawiszy jednocześnie może doprowadzić do zwarcia wyjść row[] co może spowodować uszkodzenie układu Naciśnięcie klawisza wywołuje drgania styków, które generują sygnał prostokątny mogący zaburzać pracę układu

Problem 1 koncepcja Rozwiązanie polega na zastosowaniu buforów izolujących na wyjściach row[] Do tego celu nadają się bramki trójstanowe TRI umożliwiają one galwaniczną izolacje wyjść nieaktywnych Zmieniona zostanie koncepcja realizacji klawiatura będzie skanowana stanem niskim VCC col[ ] 1 2 3 A 4 5 6 B row[ ] q[1..0] q[3..0] key 7 8 9 C * 0 # D q[3..2] q[3..0] Licznik 4-bit stop key_pulse

Problem 1 realizacja architecture data_flow of kb_ctrl_pckg_tri is signal key_pulse_i : std_logic; signal q_i : std_logic_vector(3 downto 0); begin signal tri_buf_oe : std_logic_vector(3 downto 0); kb_cnt : cnt_4 port map( rst => rst, clk => clk, ena => key_pulse_i, value => q_i ); kb_mux : mux_2x4 port map( q_i(1 downto 0), col, key_pulse_i ); Sygnały sterujące buforami trójstanowymi Ponieważ skanowanie odbywa się logicznym 0 zmiana koncepcji licznik zatrzymywany jest gdy key_pulse_i = 0 wyjście key_pulse jest zanegowanym sygnałem key_pulse_i kb_dec : dec_2x4 port map( a => q_i(3 downto 2), o => tri_buf_oe ); row(0) <= '0' when tri_buf_oe(0) = '1' else 'Z'; row(1) <= '0' when tri_buf_oe(1) = '1' else 'Z'; row(2) <= '0' when tri_buf_oe(2) = '1' else 'Z'; row(3) <= '0' when tri_buf_oe(3) = '1' else 'Z'; Wyjścia row(i) sterowane są przez bufory trójstanowe q <= q_i; key_pulse <= not key_pulse_i; end data_flow;

Problem 1 działanie Naciśnięcie klawisza row = 0, col = 2 Skanowanie wiersz row(0) stanem niskim, Pozostałe wiersze stan wysokiej impedancji

Problem 2 koncepcja Naciśnięcie klawisza wywołuje drgania styków, które generują sygnał prostokątny mogący zaburzać pracę układu. W celu usunięcia tego problemu należy zastosować moduł usuwający niepożądane drgania. Można to zrobić projektując układ akceptujący sygnał trwający dostatecznie długo.

Problem 2 rozwiązanie library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity debounce is port( clk : in std_logic; in_sig : in std_logic; pulse : out std_logic ); end debounce; architecture data_flow of debounce is signal counter : unsigned(7 downto 0); constant all_ones : unsigned(7 downto 0) := (others =>'1'); constant pulse_value : unsigned(7 downto 0) := (0 => '0', others => '1'); begin process(clk) begin if in_sig = '0' then counter <= (others => '0'); elsif rising_edge(clk) then if counter /= all_ones then counter <= counter + 1; else counter <= counter; end if; end if; end process; pulse <= '1' when (counter = pulse_value) else '0'; end data_flow; Na wejściu in_sig pojawia się sygnał z drgających styków przełącznika. Na wyjściu pulse pojawi się wartość 1 na czas jednego okresu zegara, tylko wtedy gdy sygnał wejściowy będzie stabilny przez dostatecznie długi czas. Stała reprezentująca wektor samych jedynek (MAX) Stała reprezentująca wektor z jednym zerem na najmłodszym bicie (MAX 1) Licznik jest zerowany ilekroć sygnał wejściowy jest równy 0. W czasie, gdy sygnał wejściowy jest równy 1 liczni odlicza do maksymalnej wartości i się zatrzymuje. Na wyjściu pojawia się 1, gdy licznik doliczy do wartości MAX - 1

Problem 2 działanie Zbyt krótkie sygnały nie są akceptowane Tylko dostatecznie długi sygnały są akceptowane Częstotliwość zegara taktującego moduł filtrujący drgania powinien być odpowiednio dobrany

Problem 2 realizacja library ieee; architecture data_flow of kb_ctrl_pckg_tri_deb is signal key_pulse_i : std_logic; signal q_i : std_logic_vector(3 downto 0); signal tri_buf_oe : std_logic_vector(3 downto 0); component debounce is port( clk : in std_logic; in_sig : in std_logic; pulse : out std_logic ); end component; Deklaracja komponentu można umieścić w pakiecie begin row(0) <= '0' when tri_buf_oe(0) = '1' else 'Z'; row(1) <= '0' when tri_buf_oe(1) = '1' else 'Z'; row(2) <= '0' when tri_buf_oe(2) = '1' else 'Z'; row(3) <= '0' when tri_buf_oe(3) = '1' else 'Z'; kb_debounce : debounce port map( clk => clk, in_sig => not key_pulse_i, pulse => key_pulse ); Wpięcie modułu filtrującego drgania pomiędzy sygnał key_pulse_i a wyjście key_pulse q <= q_i; end data_flow;

Sterownik klawiatury - wyniki Zbyt krótkie naciśnięcie (drganie) nie jest akceptowane Tylko dostatecznie długie naciśnięcie jest akceptowane Fitter Summary Top-level Entity Name kb_ctrl_pckg_tri_deb Family Stratix Device EP1S10B672C6 Total logic elements 23 / 10,570 ( < 1 % ) Total pins 15 / 346 ( 4 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Total DLLs 0 / 2 ( 0 % ) Fitter Resource Utilization by Entity Compilation Hierarchy Node Logic Cells LC Registers kb_ctrl_pckg_tri_deb 23 (0) 12 cnt_n:kb_cnt 5 (5) 4 debounce:kb_debounce 12 (12) 8 dec_2x4:kb_dec 4 (4) 0 mux_2x4:kb_mux 2 (2) 0

Wykrywanie sekwencji Wykrywanie sekwencji: analizuje kody klawiszy i wykrywa sekwencje kodową otwierającą zamek sekwencja kodowa oznaczona jako P1 P2 P3 P4! P1! P2! P3! P4 P1 P2 P3 ready S1 S2 S3 open P4

library ieee; use ieee.std_logic_1164.all; Wykrywanie sekwencji realizacja (1) entity sequence_search is port( clk : in std_logic; close : in std_logic; valid : in std_logic; code : in std_logic_vector(3 downto 0); ready : out std_logic; unlock : out std_logic ); end; Interfejs układu: close sygnał zamknięcia zamka valid sygnał naciśnięcia klawisza code numer klawisza redy sygnał gotowości unlock sygnał otwarcia zamka architecture data_flow of sequence_search is constant P1 : std_logic_vector(3 downto 0) := "0100"; constant P2 : std_logic_vector(3 downto 0) := "1000"; constant P3 : std_logic_vector(3 downto 0) := "1100"; constant P4 : std_logic_vector(3 downto 0) := "0100"; type STATE_TYPE is (s_ready, s1, s2, s3, s_unlock); signal state_reg, state_next : STATE_TYPE; begin process (clk, close) begin if (close = '1') then state_reg <= s_ready; elsif rising_edge(clk) then state_reg <= state_next; end if; end process; Stałe opisujące kod otwarcia zamka Stany automatu Sygnał close działa jak reset. Wprowadza automat w stan początkowy zamyka zamek.

Wykrywanie sekwencji realizacja (2) process (state_reg, valid, code) begin ready <= '0'; unlock <= '0'; case state_reg is when s_ready => ready <= '1'; if (valid = '1') then if (code = P1) then state_next <= s1; else state_next <= s_ready; end if; else state_next <= s_ready; end if; when s1 => if (valid = '1') then if (code = P2) then state_next <= s2; else state_next <= s_ready; end if; else state_next <= s1; end if; Domyślne wartości sygnałów wyjściowych Zmiana stanu następuje tylko wtedy, gdy wejście valid jest aktywne zaznaczając, że kod klawisza podany do automatu jest kodem naciśniętego klawisza Po wejściu do stanu s_unlock automat otwiera zamek i pozostaje w tym stanie do momentu, gdy sygnał close nie zresetuje automatu zaykając zamek when s2 => if (valid = '1') then if (code = P3) then state_next <= s3; else state_next <= s_ready; end if; else state_next <= s2; end if; when s3 => if (valid = '1') then if (code = P4) then state_next <= s_unlock; else state_next <= s_ready; end if; else state_next <= s3; end if; when s_unlock => unlock <= '1'; state_next <= s_unlock; end case; end process; end data_flow;

Wykrywanie sekwencji - wyniki Kody skanowanych klawiszy Klawisz naciśnięty Zamek otwarty Zamknięcie zamka Fitter Summary Top-level Entity Name sequence_search Family Stratix Device EP1S10B672C6 Total logic elements 11 / 10,570 ( < 1 % ) Total pins 9 / 346 ( 3 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Total DLLs 0 / 2 ( 0 % )

Wykrywanie sekwencji problemy Automat ten pozwala na bardzo łatwe złamanie kodu zamka Automat po podaniu cyfry, która nie występuje w kodzie wraca do stanu początkowego Wystarczy niewielka liczba prób, aby odgadnąć kod! P1! P2! P3! P4 P1 P2 P3 ready S1 S2 S3 open P4

Wykrywanie sekwencji wersja bezpieczniejsza (1) Wystarczy wprowadzić niewielkie modyfikacje do grafu automatu, aby znacznie utrudnić złamanie kodu w3 w2 w5! P1 w1! P2 w4! P3 w6! P4 P1 P2 P3 ready S1 S2 S3 open P4

Wykrywanie sekwencji wersja bezpieczniejsza (2) architecture data_flow of sequence_search is type STATE_TYPE is (s_ready, s1, s2, s3, w1, w2, w3, w4, w5, w6, s_unlock); signal state_reg, state_next : STATE_TYPE; begin process (state_reg, valid, code) begin ready <= '0'; unlock <= '0'; case state_reg is when s_ready => ready <= '1'; if (valid = '1') then if (code = P1) then state_next <= s1; else state_next <= w1; end if; else state_next <= s_ready; end if; when s1 => if (valid = '1') then if (code = P2) then state_next <= s2; else state_next <= w4; end if; else state_next <= s1; end if; Nowe stany automatu Gdy kod klawisza nie jest prawidłowy przechodzimy do dodatkowych stanów zamiast do stanu s_ready when s2 => if (valid = '1') then if (code = P3) then state_next <= s3; else state_next <= w6; end if; else state_next <= s2; end if; when s3 => if (valid = '1') then if (code = P4) then state_next <= s_unlock; else state_next <= s_ready; end if; else state_next <= s3; end if;

Wykrywanie sekwencji - wyniki Błędny kod Stany wczytujące kolejne kody Fitter Summary Top-level Entity Name sequence_search Family Stratix Device EP1S10B672C6 Total logic elements 13 / 10,570 ( < 1 % ) Total pins 9 / 346 ( 3 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Total DLLs 0 / 2 ( 0 % )

Wykrywanie sekwencji kodowanie when w1 => library ieee; use ieee.std_logic_1164.all; entity sequence_search_modif_cod is port( clk : in std_logic; close : in std_logic; valid : in std_logic; code : in std_logic_vector(3 downto 0); ready : out std_logic; unlock : out std_logic ); end sequence_search_modif_cod; architecture data_flow of sequence_search_modif_cod is constant P1: std_logic_vector(3 downto 0) := "0100"; constant P2: std_logic_vector(3 downto 0) := "1000"; constant P3: std_logic_vector(3 downto 0) := "1100"; constant P4: std_logic_vector(3 downto 0) := "0100"; Narzucenie kodowania użytkownika. Kodowanie kolejnymi kodami NKB. Fitter Summary Top-level Entity Name Family Device sequence_search_modif_cod Stratix EP1S10B672C6 Total logic elements 20 / 10,570 ( < 1 % ) Total pins 9 / 346 ( 3 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Total DLLs 0 / 2 ( 0 % ) constant s_ready : std_logic_vector(3 downto 0) := "0000"; constant s1 : std_logic_vector(3 downto 0) := "0001"; constant s2 : std_logic_vector(3 downto 0) := "0010"; constant s3 : std_logic_vector(3 downto 0) := "0011"; constant w1 : std_logic_vector(3 downto 0) := "0100"; constant w2 : std_logic_vector(3 downto 0) := "0101"; constant w3 : std_logic_vector(3 downto 0) := "0110"; constant w4 : std_logic_vector(3 downto 0) := "0111"; constant w5 : std_logic_vector(3 downto 0) := "1000"; constant w6 : std_logic_vector(3 downto 0) := "1001"; constant s_unlock : std_logic_vector(3 downto 0) := "1010"; signal state_reg, state_next : std_logic_vector(3 downto 0);

Wykrywanie sekwencji minimalizacja stanów Automat ten nie jest automatem minimalnym S\key OK. WRONG READY OPEN Stany identyczne można zastąpić jednym stanem np. n1 ready s1 w1 1 0 s1 s2 w4 0 0 s2 s3 w5 0 0 s3 open ready 0 0 open open open 0 1 w1 w2 w2 0 0 w2 w3 w3 0 0 w3 ready ready 0 0 w4 w5 w5 0 0 w5 ready ready 0 0 w6 ready ready 0 0 Jeśli stany w3, w5 i w6 zostaną zastąpione stanem n1 to stany w2 i w4 też będą identyczne można zastąpić jednym stanem np. n2

Wykrywanie sekwencji minimalizacja stanów Automat ten jest automatem minimalnym S\key OK. WRONG READY OPEN ready s1 w1 1 0 s1 s2 n2 0 0 s2 s3 n1 0 0 s3 open ready 0 0 open open open 0 1 w1 w2 w2 0 0 n2 n1 n1 0 0 w1 n2 n1 n1 ready ready 0 0 ready S1 S2 S3 ready! P1! P2! P3 P1 P2 P3! P4 open P4 25

Automat minimalny wyniki Fitter Summary Top-level Entity Name sequence_search_min Family Stratix Device EP1S10B672C6 Total logic elements 14 / 10,570 ( < 1 % ) Total pins 9 / 346 ( 3 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Total DLLs 0 / 2 ( 0 % ) Liczba komórek się zwiększyła pomimo mniejszej liczby stanów. Dowodzi to, że realizacja automatów jest złożonym procesem i trudno jest podać optymalny sposób postępowania.

Automat minimalny kodowanie library ieee; use ieee.std_logic_1164.all; entity sequence_search_modif_cod is port( clk : in std_logic; close : in std_logic; valid : in std_logic; code : in std_logic_vector(3 downto 0); ready : out std_logic; unlock : out std_logic ); end sequence_search_modif_cod; architecture data_flow of sequence_search_modif_cod is constant P1: std_logic_vector(3 downto 0) := "0100"; constant P2: std_logic_vector(3 downto 0) := "1000"; constant P3: std_logic_vector(3 downto 0) := "1100"; constant P4: std_logic_vector(3 downto 0) := "0100"; Narzucenie kodowania użytkownika dla automatu zminimalizowanego. Kodowanie kolejnymi kodami NKB. Fitter Summary Top-level Entity Name Family Device sequence_search_min_cod Stratix EP1S10B672C6 Total logic elements 13 / 10,570 ( < 1 % ) Total pins 9 / 346 ( 3 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Total DLLs 0 / 2 ( 0 % ) constant s_ready : std_logic_vector(2 downto 0) := "000"; constant s1 : std_logic_vector(2 downto 0) := "001"; constant s2 : std_logic_vector(2 downto 0) := "010"; constant s3 : std_logic_vector(2 downto 0) := "011"; constant w1 : std_logic_vector(2 downto 0) := "100"; constant n1 : std_logic_vector(2 downto 0) := "101"; constant n2 : std_logic_vector(2 downto 0) := "110"; constant s_unlock : std_logic_vector(2 downto 0) := "111"; signal state_reg, state_next : std_logic_vector(3 downto 0);

Kodowanie stanów Encoding Type: One-Hot State Machine - sequence_search_min state_reg Name q7 q6 q5 q4 q3 q2 q1 q0 state_reg.s_ready 0 0 0 0 0 0 0 0 state_reg.s1 0 0 0 0 0 0 1 1 state_reg.s2 0 0 0 0 0 1 0 1 state_reg.s3 0 0 0 0 1 0 0 1 state_reg.w1 0 0 0 1 0 0 0 1 state_reg.n1 0 0 1 0 0 0 0 1 state_reg.n2 0 1 0 0 0 0 0 1 state_reg.s_unlock 1 0 0 0 0 0 0 1 Fitter Summary Top-level Entity Name sequence_search_min Family Stratix Device EP1S10B672C6 Total logic elements 14 / 10,570 ( < 1 % ) Total pins 9 / 346 ( 3 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Total DLLs 0 / 2 ( 0 % ) Encoding Type: Custom State Machine - sequence_search_min_cod state_reg Name q2 q1 q0 state_reg.s_ready 0 0 0 state_reg.s1 0 0 1 state_reg.s2 0 1 0 state_reg.s3 0 1 1 state_reg.w1 1 0 0 state_reg.n1 1 0 1 state_reg.n2 1 1 0 state_reg.s_unlock 1 1 1 Fitter Summary Top-level Entity Name sequence_search_min_cod Family Stratix Device EP1S10B672C6 Total logic elements 13 / 10,570 ( < 1 % ) Total pins 9 / 346 ( 3 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Total DLLs 0 / 2 ( 0 % )

Zaawansowane metody syntezy logicznej Metoda minimalizacji stanów automatu pozwoliła zrealizować układ przy wykorzystaniu mniejszej ilości zasobów struktury programowalnej bez straty szybkości działania, nawet ją zwiększając. Jednakże istnieją inne, bardziej zaawansowane algorytmy syntezy logicznej umożliwiające realizację projektu w taki sposób, aby jak najlepiej wykorzystać cechy struktury programowalnej, w której ten projekt zostanie umieszczony. Dekompozycja funkcjonalna jest metodą syntezy logicznej szczególnie dobrze przystosowaną do realizacji funkcji w strukturach FPGA, do których zaliczają się układy z rodziny FLEX10K czy Stratix.

Wykrywanie sekwencji inne sposoby realizacji Automat można przedstawić jako rejestr oraz blok kombinacyjny funkcja generująca następne wartości rejestru i wartości wyjść. Stan automatu Wejścia Wejściami funkcji są wyjścia rejestru reprezentujące stan bieżący oraz wejścia układu Wyjściami funkcji są bity reprezentujące stan następny i wyjścia układu Funkcja wzbudzeń i wyjść automatu Rejestr

Blok kombinacyjny.i 8.o 5.ilb state_reg(2) state_reg(1) state_reg(0) valid code(3) code(2) code(1) code(0).ob state_next(2) state_next(1) state_next(0) ready open 000 0 ---- 000 10 000 1 0100 001 10 000 1-0-- 101 10 000 1 1--- 101 10 000 1 --1-101 10 000 1 ---1 101 10 001 0 ---- 001 00 001 1 1000 010 00 001 1 0--- 110 00 001 1-1-- 110 00 001 1 --1-110 00 001 1 ---1 110 00 010 0 ---- 010 00 010 1 1100 011 00 010 1 0--- 111 00 010 1-0-- 111 00 010 1 --1-111 00 010 1 ---1 111 00 011 0 ---- 011 00 011 1 1000 100 00 011 1 0--- 000 00 Stan automatu Wejścia 011 1-1-- 000 00 Funkcja 011 1 --1-000 00 wzbudzeń i 011 1 ---1 000 00 wyjść automatu 100 - ---- 100 01 101 0 ---- 101 00 101 1 ---- 110 00 Rejestr 110 0 ---- 110 00 110 1 ---- 111 00 111 0 ---- 111 00 111 1 ---- 000 00.e

Automat inne sposoby realizacji library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity sequence_search_komb is port( clk : in std_logic; close : in std_logic; valid : in std_logic; code : in std_logic_vector(3 downto 0); ready : out std_logic; unlock : out std_logic ); end sequence_search_komb; state_next in_sig Część kombinacyjna out_sig code valid architecture data_flow of sequence_search_komb is state_reg ready unlock signal in_sig : std_logic_vector(7 downto 0); signal out_sig : std_logic_vector(4 downto 0); signal state_reg, state_next : std_logic_vector(2 downto 0); begin process (clk, close) begin if (close = '1') then state_reg <= "000"; elsif rising_edge(clk) then state_reg <= state_next; end if; end process; in_sig <= (state_reg & valid & code); state_next <= out_sig(4 downto 2); ready <= out_sig(1); unlock <= out_sig(0); Sygnały dla celów podłączenia do części kombinacyjnej Opis rejestru Podłączenie do części kombinacyjnej

Automat inne sposoby realizacji out_sig <= "00010" when (std_match(in_sig,"0000----")) else "00110" when (std_match(in_sig,"00010100")) else "10110" when (std_match(in_sig,"0001-0--")) else "10110" when (std_match(in_sig,"00011---")) else "10110" when (std_match(in_sig,"0001--1-")) else "10110" when (std_match(in_sig,"0001---1")) else "00100" when (std_match(in_sig,"0010----")) else "01000" when (std_match(in_sig,"00111000")) else "11000" when (std_match(in_sig,"00110---")) else "11000" when (std_match(in_sig,"0011-1--")) else "11000" when (std_match(in_sig,"0011--1-")) else "11000" when (std_match(in_sig,"0011---1")) else "01000" when (std_match(in_sig,"0100----")) else "01100" when (std_match(in_sig,"01011100")) else "11100" when (std_match(in_sig,"01010---")) else "11100" when (std_match(in_sig,"0101-0--")) else "11100" when (std_match(in_sig,"0101--1-")) else "11100" when (std_match(in_sig,"0101---1")) else "01100" when (std_match(in_sig,"0110----")) else "10000" when (std_match(in_sig,"01110100")) else "00000" when (std_match(in_sig,"01111---")) else "00000" when (std_match(in_sig,"0111-0--")) else "00000" when (std_match(in_sig,"0111--1-")) else "00000" when (std_match(in_sig,"0111---1")) else "10001" when (std_match(in_sig,"100-----")) else "10100" when (std_match(in_sig,"1010----")) else "11000" when (std_match(in_sig,"1011----")) else "11000" when (std_match(in_sig,"1100----")) else "11100" when (std_match(in_sig,"1101----")) else "11100" when (std_match(in_sig,"1110----")) else "00000" when (std_match(in_sig,"1111----")) else "-----"; end data_flow; Opis części kombinacyjnej

Wykrywanie sekwencji - wyniki Najlepsze rozwiązanie! Fitter Summary Top-level Entity Name sequence_search_komb Family Stratix Device EP1S10F484C5 Total logic elements 8 / 10,570 ( < 1 % ) Total pins 9 / 336 ( 3 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Total DLLs 0 / 2 ( 0 % ) Dużo zależy od sposobu opisu. Wysoki poziom abstrakcji może powodować gorszą jakość realizacji

Tablica przejść-wyjść podejście drugie Stosując dodatkowe narzędzia CAD można poddać optymalizacji blok kombinacyjny i dopiero wtedy wykorzystać go w systemie CAD Należy wyniki optymalizacji zapisać w formacie akceptowalnym przez system CAD może VHDL Wykorzystane zostanie narzędzie akademickie do syntezy logicznej

Narzędzia uniwersyteckie code valid in_sig state_next out_sig state_reg ready unlock

Automat dekompozycja architecture data_flow of sequence_search_komb_dek is signal g1_2, g1_1 : std_logic; signal block1_1_in : std_logic_vector(1 to 4); signal block2_1_in : std_logic_vector(1 to 3); signal block3_1_in : std_logic_vector(1 to 4); signal block4_1_in : std_logic_vector(1 to 6); signal block4_2_in : std_logic_vector(1 to 6); signal block5_1_in : std_logic_vector(1 to 3); signal block5_2_in : std_logic_vector(1 to 3); Sygnały do połączenia bloków dekompozycji signal state_reg, state_next : std_logic_vector(2 downto 0); begin process (clk, close) begin if (close = '1') then state_reg <= "000"; elsif rising_edge(clk) then state_reg <= state_next; end if; end process; block1_1_in <= state_reg(2) & state_reg(1) & state_reg(0) & valid; block1_1: process (block1_1_in) begin case block1_1_in is when "0000" => state_next(0) <= '0'; when "0001" => state_next(0) <= '1'; when "1110" => state_next(0) <= '1'; when "1111" => state_next(0) <= '0'; when others => state_next(0) <= '0'; end case; end process block1_1; Jeden z procesów opisujących bloki dekompozycji

Wykrywanie sekwencji dekompozycja Fitter Summary Top-level Entity Name sequence_search_komb_dek Family Stratix Device EP1S10F484C5 Total logic elements 8 / 10,570 ( < 1 % ) Total pins 9 / 336 ( 3 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Total DLLs 0 / 2 ( 0 % ) Nie jest lepiej! Po co zadawać sobie trud użycia narzędzia akademickiego? Ten przykład jest niewielki. Dla większych przykładów wykorzystanie narzędzi akademickich bardzo często prowadzi do lepszych wyników

Wykorzystanie specjalizowanych bloków pamięciowych Struktury programowalne posiadają różnorodne mechanizmy pozwalające efektywniej realizować urządzenia cyfrowe. Jednym z takich mechanizmów są matryce EAB (Embedded Array Block) Mogą być wykorzystane do realizacji pamięci RAM, ROM, buforów Można przy pomocy tych bloków realizować logikę użytkownika I/O Element (IOE) IOE IOE IOE IOE Embedded Array Block IOE IOE IOE IOE IOE IOE Fast Track Interconnect IOE IOE Logic Element (LE) IOE IOE Embedded Array Block Logic Array Block (LAB) IOE IOE IOE IOE IOE IOE Logic Array

Sposób realizacji Wymagana pojemność pamięci = 2 (m+n) (n + y), gdzie m + n liczba bitów adresowych, a n + y długość słowa, zaś m liczba wejść automatu n liczba bitów kodujących stany y liczba wyjść X m n Register (m + n) ROM F y Q

Realizacja na pamięci ROM architecture data_flow of sequence_search_rom is type ROM_ARRAY is array(0 to 255) of std_logic_vector(4 downto 0); signal ROM : ROM_ARRAY := ( "00010", "00010", "00010", "00010", "00010", "00010", "00010", "00010", "00010", "00010", "00010", "00010", "00010", "00010", "00010", "00010", "11100", "11100", "11100", "11100", "11100", "11100", "11100", "11100", "00000", "00000", "00000", "00000", "00000", "00000", "00000", "00000", "00000", "00000", "00000", "00000", "00000", "00000", "00000", "00000" ) ; Deklaracja pamięci ROM signal in_sig : std_logic_vector(7 downto 0); signal out_sig : std_logic_vector(4 downto 0); signal state_reg, state_next : std_logic_vector(2 downto 0); begin process (clk) begin if rising_edge(clk) then out_sig <= ROM(to_integer(unsigned(in_sig))) ; end if; end process; Proces opisujący działanie pamięci ROM in_sig ready unlock <= (out_sig(4 downto 2) & valid & code) when close = '0' else "00000000"; <= out_sig(1); <= out_sig(0); end data_flow;

Wykrywanie sekwencji dekompozycja Wykorzystanie pamięci spowolniło układ Fitter Summary Top-level Entity Name Family Device sequence_search_rom Stratix EP1S10F484C5 Total logic elements 8 / 10,570 ( < 1 % ) Total pins 22 / 336 ( 7 % ) Total virtual pins 0 Total memory bits 1,280 / 920,448 ( < 1 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Ale zajmuje 8 komórek więc Total DLLs 0 / 2 ( 0 % ) nic nie zyskaliśmy. Znowu powodem jest to, że jest to mały przykład

Realizacja na pamięci ROM LPM library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; library lpm; use lpm.lpm_components.all; architecture data_flow of sequence_search_rom is Wykorzystanie biblioteki LPM signal in_sig : std_logic_vector(7 downto 0); signal out_sig : std_logic_vector(4 downto 0); signal state_reg, state_next : std_logic_vector(2 downto 0); begin process (clk, close) begin if (close = '1') then state_reg <= "000"; elsif rising_edge(clk) then state_reg <= state_next; end if; end process; my_rom: lpm_rom generic map ( lpm_widthad => 8, lpm_outdata => "unregistered", lpm_address_control => "unregistered", lpm_file => "my_rom.mif", -- init data lpm_width => 5) port map ( address => in_sig, q => out_sig); Tego typu pamięć może być wykorzystana tylko w niektórych układach (np. FLEX) Konkretyzacja modułu LPM_ROM i mapowanie parametrów i sygnałów in_sig <= (state_reg & valid & code); state_next <= out_sig(4 downto 2); ready <= out_sig(1); unlock <= out_sig(0); end data_flow;

Realizacja na pamięci ROM kreator komponentów

Realizacja na pamięci ROM kreator komponentów

Realizacja na pamięci ROM kreator komponentów architecture data_flow of sequence_search_rom is component rom PORT ( address : in std_logic_vector (7 downto 0); clock : in std_logic; q : out std_logic_vector (4 downto 0) ); end component; Deklaracja komponentu stworzonego z wykorzystaniemkreatora signal in_sig : std_logic_vector(7 downto 0); signal out_sig : std_logic_vector(4 downto 0); begin my_rom: rom port map ( address => in_sig, clock => clk, q => out_sig ); in_sig <= (out_sig(4 downto 2) & valid & code); ready <= out_sig(1); unlock <= out_sig(0); Konkretyzacja rom i mapowanie parametrów i sygnałów end data_flow;

Modyfikacja adresu Wykorzystanie koncepcji modyfikacji adresu pozwala projektantowi efektywnie wykorzystywać wbudowane matryce pamięciowe X x q b a A d d r e s s m o d ifie r c < b R e g is t e r ( a + c ) < (x + q ) R O M y F Q

Synteza logiczna automaty FF_MAX+PlusII FF_DEMAIN ROM AM_ROM Example Speed Speed Speed Speed LCs/Bits LCs/Bits LCs/Bits LCs/Bits [MHz] [MHz] [MHz] [MHz] DESaut 46/0 41,1 28/0 61,7 8/1792 47,8 7/896 47,1 5B6B 93/0 48,7 43/0 114,9 6/448 48,0 3) 3) count4 72/0 44,2 11/0 68,5 18/0 1) 86,2 1) 13/0 2) 90,0 2) 16/16384 4) 12/1024 39,5 1) FSM described with special AHDL construction; 2) decomposition with the minimum number of logic levels, 3) decomposition not possible; 4) not enough memory bits to implement the project

Układ odmierzania czasu library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity cnt_n is generic( WIDTH : natural := 4 ); port( rst : in std_logic; clk : in std_logic; ena : in std_logic; cout : out std_logic; value : out std_logic_vector(width - 1 downto 0) ); end cnt_n; architecture behavior of cnt_n is constant max_value : unsigned(width - 1 downto 0) := (others => '1'); signal counter : unsigned(width - 1 downto 0); begin process(rst, clk) begin if rst = '1' then counter <= (others => '0'); elsif rising_edge(clk) then if ena = '1' then counter <= counter + 1; else counter <= counter; end if; end if; end process; value <= std_logic_vector(counter); cout <= end behavior ; '1' when counter = max_value else '0'; Układ odmierzania czasu: zadaniem układu jest odmierzenie określonego czasu w celu zamknięcia zamka, wejście ena uruchamia pracę czasomierza na wyjście wystawiamy sygnał gdy odmierzony zostanie określony czas Układ zostanie zrealizowany z wykorzystaniem licznika parametryzowanego

Zamek całość Fitter Resource Utilization by Entity Compilation Hierarchy Node Logic Cells LC Registers electronic_lock 30 (0) 11 cnt_n:inst2 6 (6) 4 kb_ctrl_pckg_tri:inst1 11 (0) 4 cnt_n:kb_cnt 5 (5) 4 dec_2x4:kb_dec 4 (4) 0 mux_2x4:kb_mux 2 (2) 0 sequence_search_min_cod:inst 13 (13) 3

Zamek wyniki Naciśnięcia klawiszy Zamek otwarty Zamek zamknięty Wydaje się że wszystko działa!!! Fitter Summary Top-level Entity Name electronic_lock Family Stratix Device EP1S10B672C6 Total logic elements 30 / 10,570 ( < 1 % ) Total pins 12 / 346 ( 3 % ) Total virtual pins 0 Total memory bits 0 / 920,448 ( 0 % ) DSP block 9-bit elements 0 / 48 ( 0 % ) Total PLLs 0 / 6 ( 0 % ) Total DLLs 0 / 2 ( 0 % )

Nieprawidłowe działanie Wszystko działa? Czy aby na pewno Dlaczego przejście do stanu ready następuje już po 7 takcie zegara układ czasowy miał doliczyć do 16

Zamek całość jeszcze raz

Szpilki w układach kombinacyjnych To jest powód złego działania

Najprostszy układach kombinacyjnych Przecież to najprostszy układ jaki można wymyślić Należy to zbadać

Najprostszy układach kombinacyjnych??? Co to oznacza? Niech opóźnienie bramki AND wynosi 0,5 ns, czyli: dla sygnału a: opóźnienie sygnału a + opóźnienie AND = 9,9 ns opóźnienie sygnału a + 0,5 ns = 9,9 ns, czyli opóźnienie sygnału a = 9,4 ns dla sygnału b: opóźnienie sygnału b + opóźnienie AND = 10,4 ns opóźnienie sygnału b + 0,5 ns = 10,4 ns, czyli opóźnienie sygnału b = 9,9 ns

Najprostszy układach kombinacyjnych Różnica pomiędzy opóźnieniami na wejściach określa szerokość szpilki t 0 = 500 ns t 1 = t 0 + 9,4 ns = 509,4 ns t 2 = t 1 + 0,5 ns = 509,9 ns t 3 = t 0 + 9,9 ns = 509,9 ns t 4 = t 3 + 0,5 ns = 510,4 ns jednoczesna zmiana sygnału na wejściach a i b zmiana sygnału a dociera do bramki AND na wyjściu AND ustala się stan VCC na zmiana sygnału b dociera do bramki AND na wyjściu AND ustala się stan GND

Projektowanie logiki kombinacyjnej Nawet tak prosty projekt jak bramka AND może sprawiać kłopoty W przypadku logiki kombinacyjnej należy brać pod uwagę opóźnienia sygnałów jak i opóźnienia bramek Funkcjonalnie: na wyjściu out powinien pozostać stan GND Czasowo: pojawia się szpilka o szerokości 0,5 ns Układy należy projektować tak aby działały prawidłowo przy uwzględnieniu tych zjawisk