【正文】
狀態(tài)。根據(jù)電梯的實際工作情況,可以把狀態(tài)機設置10個狀態(tài),分別是“電梯停留在1層”,“開門”,“關門”,“開門等待第一秒”,“開門等待第二秒”,“開門等待第三秒”,“開門等待第四秒”,“上升”,“下降”和“停止”狀態(tài)。2. 功能模塊整體結構設計 電梯控制器功能本電梯控制器分為主控制器和分控制器。主控制器的功能:(1)完成10個樓層多用戶的載客服務控制。(3)當電梯到達選擇的樓層時,電梯自動開門。(5)響應分控制器的有效請求,如果到達有請求的樓層,電梯自動開門。(2)顯示乘客的上升和下降請求。(2)電梯處于上升狀態(tài)時,有上升請求的分控制器所在樓層數(shù)大于電梯所在的樓層數(shù)。 電梯控制器設計,包括主控制器、分控制器、樓層選擇器、狀態(tài)顯示器、譯碼器和樓層顯示器。分控制器把有效的請求傳給主控的樓層數(shù)。狀態(tài)顯示器主控制器分控制器譯碼器電梯位置顯示器樓層選擇器 控制器的功能模塊圖3. 各模塊詳細設計 ①電梯控制計時模塊的源程序如下:library ieee。use 。entity counter isport(clk,reset,clr,en:in std_logic。end。beginprocess(clk,reset,clr,en)beginif(clr=39。)then temp=0。139。 elsif(en=39。)then if temp=5 then temp=temp。 end if。 end if。 q=temp。②電梯每層的分控制器源程序如下:library ieee。use 。entity layercontrol isport(clk,switch,upkey,downkey,opendoor:in std_logic。ur,dr:out std_logic。end。signal upkey_data:std_logic。signal opendoor1:std_logic。signal req_opendoor:std_logic。signal req_downr:std_logic。beginprocess(clk)begin if rising_edge(clk)thenupkey_data=upkey。opendoor2=opendoor1。 end if。req_opendoor=(opendoor1 and not(opendoor2))。039。039。039。139。039。039。139。039。139。139。039。139。 end if。ur=req_upr。 with qin select disp=0001 when 0000000001, 0010 when 0000000010, 0011 when 0000000100, 0100 when 0000001000, 0101 when 0000010000, 0110 when 0000100000, 0111 when 0001000000, 1000 when 0010000000, 1001 when 0100000000, 1010 when 1000000000, 0000 when others。end art。use 。use 。 時鐘信號 switch:in std_logic。 強制關門信號,高電平時電梯門立即關閉delay:in std_logic。 樓層選擇信號 uplift:in std_logic_vector(10 downto 1)。 電梯下降請求輸入信號 qout:out std_logic_vector(10 downto 1)。 強制開門信號end。 q:out integer range 0 to 8)。type state_type is(up,m_up,down,m_down,stop,pause)。 電梯的各種狀態(tài)signal clk1:std_logic。 4Hz時鐘信號signal req_up:std_logic。 下降請求信號signal runen:std_logic。 電梯運行復位signal stopen0:std_logic。signal stopclr:std_logic。 上升請求寄存器信號signal req_downr:std_logic_vector(10 downto 1)。 電梯當前位置信號signal uplift_data:std_logic_vector(10 downto 1)。 下降樓層數(shù)據(jù)顯示信號signal sel_data:std_logic_vector(10 downto 1)。 電梯運行時間signal opentime:integer range 0 to 8。 電梯再次開門信號signal voidreset:std_logic。p0:process(clk) variable t0:integer range 0 to 4。139。 else clk4=39。t0:=t0+1。 end if。p1:process(clk4) variable t1:integer range 0 to 3。139。 else clk1=39。t1:=t1+1。 end if。p2:process(switch,clk,uplift,downlift) begin if rising_edge(