Digitální obvody Doc. Ing. Lukáš Fujcik, Ph.D.
Stavové automaty enkódování Proces, který rozhoduje kolik paměťových prvků bude využito v paměťové části. Binární enkódování je nejpoužívanější. j počet stavů počet KO typu D enkódovací kombinace 1 1 0 a 1 2až4 2 00,01,10 a 11 5 až 8 3 000,001,010,011, 100,101,110,111 9 až 16 4 0000 1111 17 až 32 5 00000 11111 33 až 64 6 000000 111111
Stavové automaty Enkódování stavových automatů Existuje několik typu enkódování binární, twohot, one-hot a další Stav Binární One-hot Two-hot state0 000 00000001 00011 state1 001 00000010 00101 state2 010 00000100 01001 state3 011 00001000 10001 state4 100 00010000 00110 state5 101 00100000 01010 state6 110 01000000 10010 state7 111 10000000 01100
Stavové automaty Enkódování stavových automatů Defaultní nastavení - binární styl enkódování Binárního enkódování Výhoda - nejmenší počet KO, 2 N stavů Nevýhoda - vyžaduje více doplňkové logiky, je pomalejší Pro ASIC One-hot enkódování Výhoda nevyžaduje velké množství doplňkové logiky (téměř žádná á logika posuvný registr), je rychlejší než binární enkódování Nevýhoda největší množství KO, pro každý stav vyžaduje 1 KO Pro FPGA Two-hot enkódování Kompromis mezi binárním a one-hot stylem Pomocí N KO je možné vytvořit N(N-1)/2 stavů
Stavové automaty Definování enkódování stavových automatů type STATE_TYPE is (S1, S2, S3, S4, S5, S6); attribute ENUM_ENCODING: ENCODING: STRING; attribute ENUM_ENCODING of STATE_TYPE:type is "0000 0100 1000 1001 1010 1011"; signal present_state, next_state: STATE_TYPE;
Stavové automaty nevyužité stavy Ne vždy jsou všechny stavy využity Binární enkódování - např. 6stavů => 2 3-6=2, 2 stavy nevyužity One-hot enkódování např. 6 stavů => 2 6-6=58, 58 stavů nevyužito Může vzniknout problém, že se systém vlivem šumu, vnějších okolností dostane do nevyužitého stavu a už se nikdy nedostane z tohoto t stavu nepřípustné!!!! Stavový automat s ošetřením nevyužitých stavů se nazývá bezpečný stavový automat (Safe Finite-State-Machine) Návrh bezpečného stavového automatu Je potřeba přejít z nevyužitého stavu do definovaného stavu a definovat všechny výstupní signály v nevyužitém stavu when others => next_state <= st0; vystup1 <= ; vystup2 <= ; Jelikož typ state je výčtový, pak může být s tímto popisem v některých návrhových systémech problém Řešení použít jiný popis stavového automatu
Stavové automaty nevyužité stavy Jiný popis stavového automatu explicitně definované signály present_state a next_state Architecture constant idle : std_logic_vector(3 downto 0):="0000"; 0000 constant write: std_logic_vector(3 downto 0):="0100"; constant readl: std_logic_vector(3 downto 0):="1000"; constant idle : std_logic_vector(3 downto 0):="1001"; constant write: std_logic_vector(3 downto 0):="1010"; constant readl: std_logic_vector(3 downto 0):="1011"; signal present_state, next_state : std_logic_vector(3 downto 0); Begin Tímto zápisem je rovněž explicitně určen způsob enkódování stavového automatu
Stavové automaty synchronní výstupy Někdy bývá problém s výstupní logikou G výstupní hazardy nutná synchronizace Dva možné způsoby řešení 1) Zpoždění o jeden hodinový takt navíc 2) Bez výstupního zpoždění
Příklad: Nápojový automat Vlastnosti: 1) Blokové schéma nápojového automatu je zobrazeno na obrázku. 2) Po vhození částky 5 korun dojde vydání kávy 3) Automat vrací mince koruny a dvoukoruny j_in vstup: koruna d_in vstup: dvoukoruna p_in vstup: pětikoruna kava_out signalizace, že má být káva vydána j_out signalizace, že má být koruna vrácena d_out signalizace, že má být dvoukoruna vrácena Možnosti realizace: 1) Diskrétní dig. součástky ruční odvození vycházející z metodiky stavových automatů, obtížnější řešení, jedná se o komplexnější obvod 2) Obvod CPLD nebo FPGA popis systému stavovým automatem, realizace v návrhovém systému ISE WebPack v jazyce VHDL do obvodu CPLD nebo FPGA (návrhový systém má v sobě zabudované minimalizační a optimalizační algoritmy)
Příklad: nápojový automat na kávu Bezpečný stavový automat nápojového automatu d_in=1 d_in=1 d_in=1 d_in=1 st0 j_in=1 kava_out=0 j_out=0 d_out=0 p_in=1 st1 kava a_out=0 j_out=0 d_out=0 st2 st3 j_in=1 kava_ out=0 j_in=1 kava_ out=0 j_in=1 j_out=0 j_out=0 d_out=0 d_out=0 p_in=1 p_in=1 p_in=1 p_in=1 st4 kava_ out=0 j_out=0 d_out=0 j_in=1 st5 kava_out=1 j_out=0 d_out=0 st6 st7 st8 st9 st10...st15 kava_out=1 j_ out=1 d_out=0 kava_out=1 j_ out=0 d_out=1 kava_out=0 j_ out=1 d_out=0 kava_out=0 j_ out=0 d_out=1 kava_out=0 j_out=0 d_out=0 d_in=1 Kolik vstupů by měla kombinační logika F v případě ručního návrhu?
Příklad: nápojový automat na kávu VHDL popis nápojového automatu: entity automat is Port ( clk, rst: in STD_LOGIC; -- vstup j_in : in STD_LOGIC; -- vstup d_in : in STD_LOGIC; -- vstup p_in : in STD_LOGIC; -- vstup kava_out: out STD_LOGIC; -- vystup j_out : out STD_LOGIC; -- vystup d_out : out STD_LOGIC); -- vystup end automat; architecture Behavioral of automat is type state is (st0, st1, st2, st3, st4, st5, st6, st7, st8, st9); signal present_state, next_state : state; begin -- sekvencni cast stavoveho automatu process (clk, rst) begin if rst='1' then present_state <= st0; elsif rising_edge(clk) then present_state t t <= next_state; t t end process; Programovatelné logické obvody
Příklad: nápojový automat na kávu --kombinacni cast F a G stavoveho automatu (budici signaly pro klopne obvody) process (present_state, j_in, d_in, p_in) begin case present_state is when st0 => kava_out <= '0'; -- kava neni vydana j_out <= '0'; -- koruna neni vracena d_out <= '0'; -- dvojkoruna neni vracena if (j_in='1') then next_state <= st1; elsif (d_in='1') then next_state <= st2; elsif (p_in='1') then next_state <= st5; when st1 => else next_state <= st0; -- prechod do stavu st0 kava_out <= '0'; -- kava neni vydana j_out <= '0'; -- koruna neni vracena d_out <= '0'; -- dvojkoruna neni vracena if (j_in='1') then next_state <= st2; elsif (d_in='1') then next_state <= st3; elsif (p_in='1') then next_state t t <= st6; else next_state <= st1; -- prechod do stavu st1 Programovatelné logické obvody
Příklad: nápojový automat na kávu when st2 => kava_out <= '0'; -- kava neni vydana j_out <= '0'; -- koruna neni vracena d_out <= '0'; -- dvojkoruna neni vracena if (j_in='1') then next_state <= st3; elsif (d_in='1') then next_state <= st4; elsif (p_in='1') then next_state <= st7; when st3 => else next_state <= st2; -- prechod do stavu st2 kava_out <= '0'; -- kava neni vydana j_out <= '0'; -- koruna neni vracena d_out <= '0'; -- dvojkoruna neni vracena if (j_in='1') then next_state <= st4; elsif (d_in='1') then next_state <= st5; elsif (p_in='1') then next_state t t <= st8; else next_state <= st3; -- prechod do stavu st3
Příklad: nápojový automat na kávu when st4 => kava_out <= '0'; -- kava neni vydana j_out <= '0'; -- koruna neni vracena d_out <= '0'; -- dvojkoruna neni vracena if (j_ in='1') then next_ state <= st5; elsif (d_in='1') then next_state <= st6; elsif (p_in='1') then next_state <= st9; else next_state <= st4; -- prechod do stavu st4 when st5 => kava_out <= '1'; -- kava je vydana j_out <= '0'; -- koruna neni vracena d_ out <= '0'; -- dvojkoruna neni vracena next_state <= st0; -- prechod do stavu st0 when st6 => kava_out <= '1'; -- kava je vydana j_ out <= '1'; -- koruna je vracena d_out <= '0'; -- dvojkoruna neni vracena next_state <= st0; -- prechod do stavu st0 when st7 => kava_ out <= '1'; -- kava je vydana j_out <= '0'; -- koruna neni vracena d_out <= '1'; -- dvojkoruna je vracena next_state <= st0; -- prechod do stavu st0
Příklad: nápojový automat na kávu end case; end process; end Behavioral; when st8 => kava_out <= '0'; -- kava neni vydana j_out <= '1'; -- koruna je vracena d_out <= '0'; -- dvojkoruna neni vracena next_state <= st7; -- prechod do stavu st7 when st9 => kava_out <= '0'; -- kava neni vydana j_out <= '0'; -- koruna neni vracena d_out <= '1'; -- dvojkoruna je vracena next_state <= st7; -- prechod do stavu st7 when others => -- osetreni nevyuzitych stavu kava_out <= '0'; -- kava neni vydana j_out <= '0'; -- koruna neni vracena d_out <= '0'; -- dvojkoruna je vracena next_state <= st0; -- prechod do stavu st0
Příklad: nápojový automat na kávu end case; end process; end Behavioral; when st8 => kava_out <= '0'; -- kava neni vydana j_out <= '1'; -- koruna je vracena d_out <= '0'; -- dvojkoruna neni vracena next_state <= st7; -- prechod do stavu st7 when st9 => kava_out <= '0'; -- kava neni vydana j_out <= '0'; -- koruna neni vracena d_out <= '1'; -- dvojkoruna je vracena next_state <= st7; -- prechod do stavu st7 when others => -- osetreni nevyuzitych stavu kava_out <= '0'; -- kava neni vydana j_out <= '0'; -- koruna neni vracena d_out <= '0'; -- dvojkoruna je vracena next_state <= st0; -- prechod do stavu st0
Příklad: Nápojový automat Obvody CPLD, FPGA, jazyk VHDL y j y - Simulace
Příklad: Signalizace na křižovatce Vlastnosti: 1) Blokové schéma křižovatky je zobrazeno na obrázku. 2) Po dobu 8 sekund svítí červenáá na semaforu 1 azelená na semaforu 2. 3) Oranžová svítí po dobu 2 sekund na obou semaforech. 4) Po dobu 8 sekund svítí zelená na semaforu 1 a červená na semaforu 2. 5) Hodinový kmitočet clk=1 Hz. semafor 2 aut o auto semafor 1 Možnosti realizace: 1) Diskrétní dig. součástky ruční návrh vycházející z metodiky stavových automatů, obtížnější řešení, jedná se o komplexnější obvod 2) Obvod CPLD nebo FPGA popis systému stavovým automatem, realizace v návrhovém systému ISE WebPack v jazyce VHDL do obvodu CPLD nebo FPGA (návrhový systém má v sobě zabudované minimalizační a optimalizační algoritmy)
Příklad: Signalizace na křižovatce Proces, který rozhoduje kolik paměťových prvků bude využito v paměťové části.
Příklad: Signalizace na křižovatce Blok časovač slouží k odpočítání příslušného časového intervalu. V našem případě máme dva časové intervaly: 8 sekund v digitální itál binární reprezentaci se jedná o číslo l 111 2 sekundy v digitální binární reprezentaci se jedná o číslo 001 Výstupy z časovače budou představovat vstupy do kombinační logiky F stavového automatu a budou ovlivňovat ň následující í stav. Výstupy z časovače č bude 3-bitové číslo l V a rozdělíme jej j na V2, V1 a V0. Blok N generuje signál EN, který povolí, že vstup X (binární hodnota 000) se přepíše na výstup V. Signál EN bude závislý jak na hodnotě předcházejícího stavu stavového automatu, tak i na aktuální hodnotě časovače. Pokud dojde k dosažení požadovaného časového intervalu (8 sekund nebo 2 sekundy) a časový interval bude korespondovat se současným stavem stavového automatu, tak bude výstup EN=1 současný vstupy výstup stav V2 V1 V0 EN? 0 0 1 1? 1 1 1 1 ostatní kombinace 0
Příklad: Signalizace na křižovatce Návrh 3-bitového časovače/čítače
V 001 Příklad: Signalizace na křižovatce Stavový diagram signalizace na křižovatce V=111 (time=8s) V=001 (time me=2s) V 001 V=001 (time=2s) V=111 (time=8s)
Příklad: Signalizace na křižovatce Pravdivostní tabulka stavů
Příklad: Signalizace na křižovatce Návrh kombinačního bloku N vstupy výstup současný stav současný stav V2 V1 V0 EN Q1 Q0 st0 0 0 0 0 1 1 st1 0 1 1 1 1 1 st2 1 0 0 0 1 1 st3 1 1 1 1 1 1 - ostatní kombinace 0 EN = ( Q 0 V 2 V 1 V 0) + ( Q 0 V 2 V 1 V 0) = = ( Q0 V 2 V1 V 0) ( Q0 V 2 V1 V 0)
Příklad: Signalizace na křižovatce Stavový diagram signalizace na křižovatce EN=0 st1 01 EN=0 st0 00 r1=0,y1=1,g1=0 1,g1 0 r2=0,y2=1,g2=0 EN=1 (time=2s) EN=1 (time=8s) r1=1,y1=0,g1=0 r2=0,y2=0,g2=1 st0 11 EN=1 (time=8s) EN=1 (time=2s) st2 10 r1=0,y1=1,g1=0 1,g1 0 r2=0,y2=1,g2=0 EN=0 r1=0,y1=0,g1=1 r2=1,y2=0,g2=0 EN=0
Příklad: Signalizace na křižovatce Návrh bloku kombinačního bloku F vstupy výstupy ýt současný následují stav EN cí stav Q1 Q0 D1 D0 st0 0 0 1 0 1 st1 st1 0 1 1 1 0 st2 st2 1 0 1 1 1 st3 st3 1 1 1 0 0 st0 st0 0 0 0 0 0 st0 st1 0 1 0 0 1 st1 současný stav následující stav st2 1 0 0 1 0 st2 st3 1 1 0 1 1 st3 D1 = Q1 Q0 + Q1 EN + Q1 Q0 EN = Q1 Q0 Q1 EN Q1 Q0 EN D0 = Q0 EN + Q0 EN = Q0 EN Q0 EN
Příklad: Signalizace na křižovatce Návrh bloku kombinačního bloku G Současný stav Vstupy Současný stav Výstupy semafor 1 semafor 2 Q1 Q0 r1 y1 g1 r2 y2 g2 st0 0 0 0 1 0 0 1 0 st1 0 1 1 0 0 0 0 1 st2 1 0 0 1 0 0 1 0 st3 1 1 0 0 1 1 0 0 y1=y2 y2, r1=g2 a g1=r2 y 1 = Q0 0 r 1 = Q1 Q0 = Q1 + Q0 g 1 = Q1 Q0 = Q1 + Q0
Příklad: Signalizace na křižovatce VHDL popis signalizace (stavový automat): entity digi_top is Port ( clk, rst : in STD_LOGIC; r1,r2,y1,y2,g1,g2 : out STD_LOGIC); end digi_top; architecture Behavioral of automat is type state IS (st0, st1, st2, st3); signal present_state, next_state : state; CONSTANT time1 : std_logic_vector(2 downto 0) := "001"; CONSTANT time2 : std_logic_vector(2 downto 0) := "101"; signal count_reg, count_int : std_logic_vector(2 downto 0); signal en : std_logic; begin -- pametova cast stavoveho automatu a citace process (clk,rst) begin if (rst='1') then present_state <= st0; -- pocatecni stav po resetu count_reg <= "000"; -- vynulovani citace elsif (clk'event and clk='1') then -- detekce nabezne hrany present_state t t <= next_state; t t count_reg <= count_int; end process; Programovatelné logické obvody
Příklad: Signalizace na křižovatce -- kombinacni cast F citace count_int <= "000" when en='1' else count_reg+1; -- kombinacni blok N en<='1' when ((present_state=st0 and count_reg=time1) or (present_state=st1 state=st1 and count_reg =time2) or (present_state=st2 and count_reg=time1) or (present_state=st3 and count_reg=time2)) else '0'; -- kombinacni cast F a G stavoveho automatu process (present_state,en) begin case present_state is when st0 => next_state <= st0; r1<='0'; r2<='0'; y1<='1'; y2<='1'; g1<='0'; g2<='0'; if en='1' then when st1 => next_state <= st1; next_state <= st1; r1<='1'; 1 r2<='0'; y1<='0'; y2<='0'; g1<='0'; g2<='1'; if en='1' then next_state <= st2;
Příklad: Signalizace na křižovatce when st2 => next_state <= st2; r1<='0'; r2<='0'; y1<='1'; y2<='1'; g1<='0'; g2<='0'; if en='1' then next_state <= st3; when st3 => next_state <= st3; r1<='0'; r2<='1'; y1<='0'; y2<='0'; g1<='1'; g2<='0'; if en='1' then next_state <= st0; end case; end process; end Behavioral;
Příklad: Signalizace na křižovatce Stavový diagram signalizace na křižovatce st1 01 st0 00 r1=0,y1=1,g1=0,g r2=0,y2=1,g2=0 timer=2 q_reg=timer) q_reg=timer) r1=1,y1=0,g1=0 r2=0,y2=0,g2=1 timer=8 st0 11 r1=0,y1=0,g1=1 r2=1,y2=0,g2=0 timer=8 q_reg=time mer) q_reg=timer) st2 10 r1=0,y1=1,g1=0,g r2=0,y2=1,g2=0 timer=2
Příklad: Signalizace na křižovatce VHDL popis signalizace (lepší způsob zápisu): entity digi_top is Port ( clk, rst : in STD_LOGIC; r1,r2,y1,y2,g1,g2 : out STD_LOGIC); end digi_top; architecture Behavioral of automat is type state IS (st0, st1, st2, st3); signal present_state, next_state : state; CONSTANT time1 : std_logic_vector(2 downto 0) := "001"; CONSTANT time2 : std_logic_vector(2 downto 0) := "101"; signal count_reg, count_int : std_logic_vector(2 downto 0); signal timer : std_logic_vector(2 downto 0); begin -- pametova cast stavoveho automatu a citace process (clk,rst) begin if (rst='1') then present_state <= st0; -- pocatecni stav po resetu count_reg <= "000"; -- vynulovani citace elsif (clk'event and clk='1') then -- detekce nabezne hrany present_state t t <= next_state; t t count_reg <= count_int; end process; Programovatelné logické obvody
Příklad: Signalizace na křižovatce -- kombinacni cast F a G stavoveho automatu a citace process (present_state,count_reg) state reg) begin case present_state is when st0 => next_state <= st0; timer <=time1; r1<='0'; r2<='0'; y1<='1'; y2<='1'; g1<='0'; g2<='0'; if count_reg=timer then next_state <= st1; count_int <= "000"; else count_int <= count_reg+1; when st1 => next_state <= st1; timer <=time2; r1<='1'; 1 r2<='0'; y1<='0'; y2<='0'; g1<='0'; g2<='1'; if count_reg=timer then next_state <= st2; count_int <= "000"; else count_int <= count_reg+1;
Příklad: Signalizace na křižovatce when st2 => next_state <= st2; timer <=time1; r1<='0'; r2<='0'; y1<='1'; y2<='1'; g1<='0'; g2<='0'; if count_reg=timer then next_state <= st3; count_int <= "000"; else count_int <= count_reg+1; when st3 => next_state <= st3; timer <=time2; r1<='0'; r2<='1'; y1<='0'; y2<='0'; g1<='1'; 1 g2<='0'; if count_reg=timer then next_state <= st0; count_int <= "000"; else count_int <= count_reg+1; end case; end process; end Behavioral;
Ošetření zákmitů na tlačítku obvodové schéma V cc in =1 main_clk clk gnd Q N load shift_in clk D 0 D 1 D 2 D 3 shift_out out dělička kmitočtu 2 N posuvný registr
Ukázka parametrizované paměti RAM VHDL entity ram is GENERIC (x : integer := 32; y : integer :=4); port( clk,wr,rd : in std_logic; AddrWr,AddrRd : in std_logic_vector(y-1 downto 0); DataWr : in std_logic_vector(x vector(x-1 downto 0); DataRd : out std_logic_vector(x-1 downto 0)); end ram; architecture Behavioral of ram is type RamType is array(0 to (2**y)-1) of std_logic_vector(x-1 downto 0); signal Ram: RamType; begin process(clk) is begin if rising_edge(clk) then if WR='1' then Ram(conv _ integer(addrwr))<= DataWr; if RD='1' then DataRd <= Ram(conv_integer(AddrRd)); end process; end Behavioral;