-c wc. Pre- Next state Out- Vi ser att tillstånden är redan sorterade i grupper med olika utsignaler,

Save this PDF as:
 WORD  PNG  TXT  JPG

Storlek: px
Starta visningen från sidan:

Download "-c wc. Pre- Next state Out- Vi ser att tillstånden är redan sorterade i grupper med olika utsignaler,"

Transkript

1 9.17 Vi översätter beskrivningen till ett flödesdiagram, Figur E9.17a -c -c z=1 E A z=1 E A z=0 z=0 z=0 D z=0 D Figur E9.17a Flödesdiagram B z=0 B z=0 C z=0 C z=0 som vi i sin tur översätter till en flödestabell, Figur E9.17b. sent put Pre- Next state Out- Vi ser att tillstånden är redan sorterade i grupper med olika utsignaler, state z A A* B D - 0 bara tillstånd E har avvikande utsignal. Vi ser också att vi kan vi har B A B* - C 0 inga tillstånd med stabila tillstånd C - B D C* 0 och don t care-tillstånd i samma positioner. Vad vi kan göra är att se om D A - D* E 0 E A E* D E* 1 vi kan slå ihop några rader utan att Figur E9.17b Flödestabell deras innehåll kommer i konflikt med varandra. Ur flödestabellen så får vi sammanfogningsdiagrammet (merging diagram) i Figur E9.17c och kan slå samman tillstånd A, B och C. Figur E9.17c Sammanfogningsdiagram Sida 1

2 Vi får den reducerade flödestabellen i Figur E9.17d Vi ger de olika vägarna till stabila tillstånd nummer och får Figur E9.17e. Från denna tabell kan vi rita translationsgraf, Figur E9.17f Figur E9.17d Flödestabell Present Next state Output state z A A* A* D A* 0 D A - D* E 0 E A E* D E* 1 Present Next state Output state z A 1* 2* 4 3* 0 D 1-4* 6 0 E 1 5* 4 6* 1 Figur E9.17e Reducerad flödestabell Tre tillstånd bör vi kunna koda med hjälp av två tillståndsvariabler. Vi ser dock att vi har övergångar mellan alla tillstånd vilket betyder att vi inte har någon hasardfri tillståndskodning där bara en variabel i taget får slå om. Låt oss se om vi kan ändra flödestabellen utan att ändr funktionen. Det ser ut att vara enklast att göra något åt den övergång som sker bara i en situation, dvs övergången rån E till A. Vi kan göra så att vi låter övergången från E i stället gå till D och då detta inte är ett stabilt tillstånd så går vi direkt över till tillstånd A som vi önskar. Vi får den nya translationsgrafen, Figur E9.17g ochden nya flödestabellen, Figur E9.17h Figur E9.17f Translationsgraf Figur E9.17g Translationsgraf Sida 2

3 Låt oss ge tillstånden kodning. Då vi har två tilståndsbitar så har vi fyra koder att välja bland men vi kan inte välja fritt eftersom vi måste undvika övergångarna 01, 10 och 00, 11. Låt oss välja kodningarna 00, 01 och 10 med 00 i mitten dvs i tillstånd D. Vi får flödestabellen Figur E9.17i Present Next state Output state z A A* A* D A* 0 D A - D* E 0 E D E* D E* 1 Figur E9.17d Flödestabell Present state Next state Output y 1 y 0 Y 1 Y 0 Y 1 Y 0 Y 1 Y 0 Y 1 Y 0 z Figur E9.17i Reducerad flödestabell med tilståndskodning Här får vi vara försiktig Present Next state Output så att inte don t care state positionen ställer till något om vi optimerar fel. Vi definierar denna y 1 y 0 Y 1 Y 0 Y 1 Y 0 Y 1 Y 0 Y 1 Y 0 z position genom att låta tillståndsmaskinen stanna i sitt tillstånd om vi får detta villkor. Vi Figur E9.17i Reducerad flödestabell med tilståndskodning fr flödestabellen i Figur E9.17j. Vi använder Karnaughdiagram för att ta fram våra logiska uttryck Figur E9.17k Karnaughdiagram för Y 1 Figur E9.17l Karnaughdiagram för Y 0 Sida 3

4 Y 1 = c y1 y0 + w c y0 Y 0 = c y1 y0 + w y1 y0 + w y1 y0 z = y 1 Figur E9.17m Karnaughdiagram för z Och vi får kopplingen i Figur E9.17m Figur E9.17n Realiserad koppling Sida 4

5 Vi kan också tänka oss att använda oss av en Mealymodell vilket betyder att vi har möjlighet att slå samman tillstånd med olika utsignal. Låt oss se på vår flödestabell, Figur E9.17b som vi upprepar i Figur E9.17o. Vi ser att vi för en Mealymodell har några fler möjligheter som inte fanns i Mooremodellen. Vi får sammanfogningsdiagrammet i Figur E9.17p där vi ser att vi förutom att slå samman tillstånden A, B och C även kan slå samman tillstånden D och E. Vilket gör att vi bara får två tillstånd men vår reducerade flödestabell måste kompletteras med kollumner som indikerar att utsignalen styrs av insignalerna och inte bara i vilket tillstånd vi befinner oss. Output Present Next state state z A A* B D - 0 B A B* - C 0 C - B D C* 0 D A - D* E 0 E A E* D E* 1 Figur E9.17o Flödestabell Present Next state Output z state A A* A* D A* D A D* D* D Figur E9.17p Sammanfogningsdiagram Vi får den reducerade flödestabellen Figur E9.17q. Då det bara återstår två tillstånd så innebär detta att vi klarar oss med ett enda logiskt uttryck för att beskriva tillståndet och dessutom behöver vi ett logiskt villkor för vår utsignal. Vi skriver om den reducerade tillståndstabellen och tillståndskodar genom att ersätta A och D med logiska värden, Figur E9.17q Figur E9.17q reducerad flödestabell Present Next state, Y Output z state, y * 0* 1 0* * 1* Tabell E9.17r Reducerad flödestabell med tillståndskodning Vi kan bestämma de logiska uttrycken med hjälp av Karnaughdiagram Sida 5

6 Figur E9.17s Karnaughdiagram för Y Figur E9.17t Karnaughdiagram för z Y = w c + w y + c y z = c y Vi får kopplingen i Figur E9.17t Låt oss skriva VHDL-kod för de fyre tillståndsnmaskinerna. Koden kan skrivas som en beteendemässig eller en strukturell modell. I det första fallet beskriver vi funktionen medan vi i det andra fallet beskriver logiken. Vi får först för den beteendemässiga Mooremaskinen -- ex9_17_moore_beh.vhdl LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ex9_17_moore_beh IS PORT(Resetn,w,c:IN STD_LOGIC; z :OUT STD_LOGIC); END ex9_17_moore_beh; ARCHITECTURE arch_ex9_17_moore_beh OF ex9_17_moore_beh IS TYPE state_type IS (A,D,E); SIGNAL state:state_type; PROCESS(w,c,Resetn) Sida 6

7 IF Resetn='0' THEN state <= A; CASE state IS IF (w='1' AND c='0') THEN state <= D; state <= A; WHEN D => IF (w='0' AND c = '0') THEN state <= A; ELSIF (w='1' AND c = '1') THEN state <= E; state <= D; WHEN E => IF (w='0' AND c = '0') THEN state <= A; ELSIF (w='1' AND c = '0') THEN state <= D; state <= E; END CASE; PROCESS(state) CASE state IS z <= '0'; WHEN D => z <= '0'; WHEN E => z <= '1'; END CASE; END arch_ex9_17_moore_beh; och för den beteendemässiga Mealymaskinen får vi Sida 7

8 -- ex8_17_mealy_beh.vhdl LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ex9_17_mealy_beh IS PORT(Resetn,w,c:IN STD_LOGIC; z :OUT STD_LOGIC); END ex9_17_mealy; ARCHITECTURE arch_ex9_17_mealy_beh OF ex9_17_mealy_beh IS TYPE state_type IS (A,B); SIGNAL state:state_type; PROCESS(w,c,Resetn) IF Resetn='0' THEN state <= A; CASE state IS IF (w='1' AND c='0') THEN state <= B; state <= A; WHEN B => IF (w='0' AND c = '0') THEN state <= A; state <= B; END CASE; PROCESS(state,w,c) CASE state IS z <= '0'; WHEN B => IF c='1' THEN z <= '1'; z <= '0'; Sida 8

9 END CASE; END arch_ex9_17_mealy_beh; och vi skriver en do-fil för simulering i Modelsim. Vi kan använda samma simuleringsfil för bådea beteendemässiga modeller -- ex9_17_moore_or_mealy_beh.do restart -f -nowave view signals wave add wave Resetn w c state z force c 0 0, 1 50ns -repeat 100ns force c 0 force Resetn 0 run 225ns force Resetn 1 force w 1 run 500ns run 200ns force w 1 run 250ns run 200ns Låt oss nu skriva VHDL-kod för den strukturella Mooremaskinen -- ex9_17_moore_struct.vhdl LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ex9_17_moore_struct IS PORT(Resetn,w,c:IN STD_LOGIC; z :OUT STD_LOGIC); END ex9_17_moore_struct; ARCHITECTURE arch_ex9_17_moore_struct OF ex9_17_moore_struct IS SIGNAL Y_signal:std_logic_vector(1 DOWNTO 0); Y_signal(1) <= '0' WHEN resetn = '0' (w AND c AND NOT(Y_signal(0))) OR (c AND Y_signal(1) AND NOT(Y_signal(0))); Y_signal(0) <= '0' WHEN resetn = '0' (c AND NOT(Y_signal(1)) AND Sida 9

10 Y_signal(0)) OR (NOT(w) AND NOT(Y_signal(1)) AND Y_signal(0)) OR (NOT(w) AND NOT(Y_signal(1)) AND NOT(Y_signal(0))); z <= Y_signal(1); END arch_ex9_17_moore_struct; Och vi får för den strukturella Mealymodellen -- ex9_17_mealy_struct.vhdl LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ex9_17_mealy_struct IS PORT(Resetn,w,c:IN STD_LOGIC; z :OUT STD_LOGIC); END ex9_17_mealy_struct; ARCHITECTURE arch_ex9_17_mealy_struct OF ex9_17_mealy_struct IS SIGNAL Y_signal:std_logic; Y_signal <= '0' WHEN resetn = '0' (w AND NOT(c)) OR (w AND Y_signal) OR (c AND Y_signal); z <= c AND Y_signal; END arch_ex9_17_mealy_struct; Vi kan använda samma do-fil för att simulera de tcå strukturella modellerna även om Y_signal i det ena fallet är en vektor och i det andra en enda signal -- ex9_17_moore_or_mealy_struct.do restart -f -nowave view signals wave add wave Resetn w c Y_signal z force c 0 0, 1 50ns -repeat 100ns force c 0 force Resetn 0 run 225ns force Resetn 1 force w 1 run 500ns run 200ns Sida 10

11 force w 1 run 250ns run 200ns Vi kan också lägga in de fyra tillståndsmaskinerna i samma VHDL-fil för att kunna jämföra utsignalerna men då måste vi göra några små ändringar för att skilja de två tillståndsmaskinerna åt. Vi måste införa olika signalnamn. Vi får -- ex9_17.vhdl LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY ex9_17 IS PORT(Resetn,w,c:IN STD_LOGIC; z_moore_beh,z_mealy_beh,z_moore_struct, z_mealy_struct:out STD_LOGIC); END ex9_17; ARCHITECTURE arch_ex9_17 OF ex9_17 IS -- Moore beteende TYPE state_moore_beh_type IS (A,D,E); SIGNAL state_moore_beh:state_moore_beh_type; TYPE state_mealy_beh_type IS (A,B); -- Mealy beteende SIGNAL state_mealy_beh:state_mealy_beh_type; -- Moore struct SIGNAL Y_Moore_struct:std_logic_vector(1 DOWNTO 0); -- Mealy struct SIGNAL Y_Mealy_struct:std_logic; Moore_beteende_process: PROCESS(w,c,Resetn) IF Resetn='0' THEN state_moore_beh <= A; CASE state_moore_beh IS IF (w='1' AND c='0') THEN state_moore_beh <= D; state_moore_beh <= A; WHEN D => IF (w='0' AND c = '0') THEN Sida 11

12 state_moore_beh <= A; ELSIF (w='1' AND c = '1') THEN state_moore_beh <= E; state_moore_beh <= D; WHEN E => IF (w='0' AND c = '0') THEN state_moore_beh <= A; ELSIF (w='1' AND c = '0') THEN state_moore_beh <= D; state_moore_beh <= E; END CASE; z_moore_beteende_process: PROCESS(state_Moore_beh) CASE state_moore_beh IS z_moore_beh <= '0'; WHEN D => z_moore_beh <= '0'; WHEN E => z_moore_beh <= '1'; END CASE; Mealy_beteende_process: PROCESS(w,c,Resetn) IF Resetn='0' THEN state_mealy_beh <= A; CASE state_mealy_beh IS IF (w='1' AND c='0') THEN state_mealy_beh <= B; state_mealy_beh <= A; WHEN B => IF (w='0' AND c = '0') THEN state_mealy_beh <= A; Sida 12

13 state_mealy_beh <= B; END CASE; z_mealy_beteende_process: PROCESS(state_Mealy_beh,w,c) CASE state_mealy_beh IS z_mealy_beh <= '0'; WHEN B => IF c='1' THEN z_mealy_beh <= '1'; z_mealy_beh <= '0'; END CASE; --Moore struct Y_Moore_struct(1) <= '0' WHEN resetn = '0' (w AND c AND NOT(Y_Moore_struct(0))) OR (c AND Y_Moore_struct(1) AND NOT(Y_Moore_struct(0))); Y_Moore_struct(0) <= '0' WHEN resetn = '0' (w AND c AND Y_Moore_struct(0)) OR (c AND NOT(Y_Moore_struct(1)) AND Y_Moore_struct(0)) OR (NOT(w) AND NOT(c) AND NOT(Y_Moore_struct(1))); z_moore_struct <= Y_Moore_struct(1); --Mealy struct Y_Mealy_struct <= '0' WHEN resetn = '0' (w AND NOT(c)) OR (w AND Y_Mealy_struct) OR (c AND Y_Mealy_struct); z_mealy_struct <= c AND Y_Mealy_struct; END arch_ex9_17; Vi får också göra några små ändringar i do-filen -- ex9_17.do Sida 13

14 restart -f -nowave view signals wave add wave Resetn w c state_moore_beh state_mealy_beh Y_Moore_struct Y_Mealy_struct z_moore_beh z_mealy_beh z_moore_struct z_mealy_struct force c 0 0, 1 50ns -repeat 100ns force c 0 force Resetn 0 run 225ns force Resetn 1 force w 1 run 500ns run 200ns force w 1 run 250ns run 200ns Då vi simulerar filen så kommer vi att se att vi inte får exakt samma tidsförlopp i de fyra fallen Sida 14