【正文】
C。 f2upbutton:IN STD_LOGIC。 f2dnbutton:IN STD_LOGIC。 f3upbutton:IN STD_LOGIC。 f3dnbutton:IN STD_LOGIC。 f4dnbutton:IN STD_LOGIC。 fuplight:BUFFER STD_LOGIC_VECTOR(4 DOWNTO 1)。 fdnlight:BUFFER STD_LOGIC_VECTOR(4 DOWNTO 1)。 stop1button,stop2button,stop3button,stop4button:IN STD_LOGIC。 stoplight:BUFFER STD_LOGIC_VECTOR(4 DOWNTO 1)。 position:BUFFER INTEGER RANGE 1 TO 4。 doorlight:OUT STD_LOGIC。 udsig:BUFFER STD_LOGIC)。 27 END fourfilft。 ARCHITECTURE art OF fourfilft IS TYPE lift_stata IS (stopon1,dooropen,doorclose,doorwait1,doorwait2,doorwait3,doorwait4,up,down,stop)。 表達狀態(tài)機的 10 個狀態(tài) SIGNAL mylift:lift_stata。 確定 mylift 取值為 lift_stata 的 10 個狀態(tài) SIGNAL clearup:STD_LOGIC。 SIGNAL cleardn:STD_LOGIC。 BEGIN ctrlift:PROCESS(reset,liftclk) VARIABLE pos:INTEGER RANGE 4 DOWNTO 1。 BEGIN IF reset=39。139。 THEN mylift=stopon1。 clearup=39。039。 cleardn=39。039。 ELSE IF liftclk39。EVENT AND liftclk=39。139。 THEN CASE mylift IS WHEN stopon1=doorlight=39。139。 position=1。pos:=1。 mylift=doorwait1。 WHEN doorwait1=mylift=doorwait2。 WHEN doorwait2=clearup=39。039。 cleardn=39。039。 mylift=doorwait3。 WHEN doorwait3=mylift=doorwait4。 WHEN doorwait4=mylift=doorclose。 WHEN doorclose=doorlight=39。039。 28 IF udsig=39。039。 THEN IF position=4 THEN IF stoplight=0000AND fuplight=0000 AND fdnlight=0000 THEN udsig=39。139。 mylift=doorclose。 ELSE udsig=39。139。mylift=down。clearup=39。139。 END IF。 ELSIF position=3 THEN IF stoplight=0000 AND fuplight=0000 and fdnlight=0000 THEN udsig=39。039。 mylift=doorclose。 ELSIF stoplight(4)=39。139。 OR fdnlight(4)=39。139。 THEN udsig=39。039。 mylift=up。clearup=39。139。 ELSE udsig=39。139。mylift=down。clearup=39。139。 END IF。 ELSIF position=2 THEN IF stoplight=0000 AND fuplight=0000 AND fdnlight=0000 THEN udsig=39。039。mylift=doorclose。 ELSIF (stoplight(3)=39。139。 OR fuplight(3)=39。139。) THEN udsig=39。039。mylift=up。clearup=39。139。 ELSIF (stoplight(4)=39。139。 OR fdnlight(4)=39。139。) THEN udsig=39。039。mylift=up。clearup=39。139。 ELSIF 29 (fdnlight(3)=39。139。) THEN udsig=39。039。mylift=up。clearup=39。139。 ELSE udsig=39。139。mylift=down。clearup=39。139。 END IF。 ELSIF position=1 THEN IF stoplight=0000 AND fuplight=0000 AND fdnlight=0000 THEN udsig=39。039。mylift=doorclose。 ELSE udsig=39。039。mylift=up。clearup=39。139。 END IF。 END IF。 ELSIF udsig=39。139。 THEN IF position=1 THEN IF stoplight=0000 AND fuplight=0000 AND fdnlight=0000 THEN udsig=39。039。 mylift=doorclose。 ELSE udsig=39。039。mylift=up。cleardn=39。139。 END IF。 ELSIF position=2 THEN IF stoplight=0000 AND fuplight=0000 AND fdnlight=0000 THEN udsig=39。139。mylift=doorclose。 ELSIF stoplight(1)=39。139。 OR fuplight(1)=39。139。 THEN udsig=39。139。 mylift=down。cleardn=39。139。 30 ELSE udsig=39。039。mylift=up。clearup=39。139。 END IF。 ELSIF position=3 THEN IF stoplight=0000 AND fuplight=0000 AND fdnlight=0000 THEN udsig=39。139。mylift=doorclose。 ELSIF (stoplight(2)=39。139。 OR fdnlight(2)=39。139。) THEN udsig=39。139。mylift=down。cleardn=39。139。 ELSIF (stoplight(1)=39。139。 OR fuplight(1)=39。139。) THEN udsig=39。139。mylift=down。cleardn=39。139。 ELSIF (fuplight(2)=39。139。) THEN udsig=39。139。mylift=down。cleardn=39。139。 ELSE udsig=39。039。mylift=up。clearup=39。139。 END IF。 ELSIF position=4 THEN IF stoplight=0000 AND fuplight=0000 AND fdnlight=0000 THEN udsig=39。139。mylift=doorclose。 ELSE udsig=39。139。mylift=down。cleardn=39。139。 END IF。 END IF。 END IF。 WHEN up=position=position+1。 pos:=pos+1。 IF pos4 AND(stoplight(pos)=39。139。 OR fdnlight(pos)=39。139。) 31 THEN mylift=stop。 ELSIF pos=4 AND (stoplight(pos)=39。139。 OR fdnlight(pos)=39。139。) THEN mylift=stop。 ELSE mylift=doorclose。 END IF。 WHEN down=position=position1。 pos:=pos1。 IF pos1 AND(stoplight(pos)=39。139。 OR fuplight(pos)=39。139。) THEN mylift=stop。 ELSIF pos=1 AND (stoplight(pos)=39。139。 OR fdnlight(pos)=39。139。) THEN mylift=stop。 ELSE mylift=doorclose。 END IF。 WHEN stop=mylift=dooropen。 WHEN dooropen=doorlight=39。139。 IF udsig=39。039。 THEN IF position=3 AND(stoplight(position)=39。139。 OR fuplight(position)=39。139。)THEN clearup=39。139。 ELSE clearup=39。139。cleardn=39。139。 END IF。 ELSIF udsig=39。139。 THEN IF position=2 AND(stoplight(position)=39。139。 OR fdnlight(position)=39。139。)THEN cleardn=39。139。 ELSE clearup=39。139。cleardn=39。139。 END IF。 END IF。 mylift=doorwait1。 END CASE。 32 END IF。 END IF。 END process ctrlift。 ctrlight:PROCESS(reset,buttonclk) BEGIN IF reset=39。139。 THEN stoplight=0000。fuplight=0000。fdnlight=0000。 ELS