名稱:VIVADO三層電梯控制器VHDL代碼ego1開發(fā)板(代碼在文末下載)
軟件:VIVADO
語言:VHDL
代碼功能:
3層電梯控制:
(1)電梯運行規(guī)則:當(dāng)電梯處于上升模式時,只響應(yīng)比電梯所在位置高的上樓請求信號,由下而上逐個執(zhí)行,直到最后一個上樓請求執(zhí)行完畢;如果高層有下樓請求,則直接升到由下樓請求的最高層,然后進(jìn)入下降模式。當(dāng)電梯處于下降模式時則與上升模式相反;
(2)電梯初始狀態(tài)為一層狀態(tài)。
(3)每層電梯入口處設(shè)有上下請求開關(guān),電梯內(nèi)設(shè)有顧客到達(dá)層次的停站請求開關(guān);
(4)設(shè)有電梯入口處設(shè)有位置指示裝置及電梯運行模式(上升或下降)指示裝置;
(5)電梯到達(dá)有停站請求的樓層,電梯門打開,開門指示燈亮,開門3秒后,電梯門關(guān)閉(開門指示燈滅)。若按下電梯內(nèi)開門按鈕,則電梯一直處于開門狀態(tài),若按下電梯內(nèi)關(guān)門按鈕,則電梯立即關(guān)門。電梯繼續(xù)進(jìn)行,直至執(zhí)行完最后一個請求信號后停留在當(dāng)前層;
(6)能記憶電梯內(nèi)外所有請求,并按照電梯運行規(guī)則按順序響應(yīng),每個請求信號保留至執(zhí)行后消除。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
本代碼已在ego1開發(fā)板驗證,開發(fā)板如下,其他開發(fā)板可以修改管腳適配:
演示視頻:
設(shè)計文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. 管腳分配
5. testbench文件
6. 仿真圖
部分代碼展示:
--?三層電梯控制模塊? library?ieee; use?ieee.std_logic_1164.all; entity?lift_ctrl?is port( ?clk:in?std_logic;--1KHz ?up1,up2,down2,down3:in?std_logic;--梯外按鍵, ?floor1,floor2,floor3:in?std_logic;--梯內(nèi)按鍵, ?????led1,led2,led3:out?std_logic;--梯內(nèi)目的樓層,高電平有效 ?????door:out?std_logic;--開門 ?floor_num:?out?std_logic_vector(2?downto?0)--樓層 ?); end?entity?lift_ctrl; architecture?behave?of?lift_ctrl?is type?stateTYPE?is(c1,c2,c3,open_door); begin --電梯控制進(jìn)程 ??process(clk) ??variable?up,down,goal:std_logic_vector(3?downto?1):="000"; ??variable?storey:std_logic_vector(2?downto?0):="000"; ??variable?mo,x,y,z:std_logic:='0';--mo控制方向,低電平表示上 ??variable?clk_cnt,time_cnt:integer:=0; ??variable?state:stateTYPE:=c1; ??begin ????if?clk'event?and?clk='1'?then ??????if?up1='1'?then?up(1):='1';--按鍵低電平有效,信號存入up ??????end?if; ??????if?up2='1'?then?up(2):='1';--按鍵低電平有效,信號存入up ??????end?if; ??????if?down3='1'?then?down(3):='1';--按鍵低電平有效,信號存入down ??????end?if; ??????if?down2='1'?then?down(2):='1';--按鍵低電平有效,信號存入down ??????end?if; ??????if?floor1='1'?then?goal(1):='1';--按鍵低電平有效,信號存入goal ??????end?if; ??????if?floor2='1'?then?goal(2):='1';--按鍵低電平有效,信號存入goal ??????end?if; ??????if?floor3='1'?then?goal(3):='1';--按鍵低電平有效,信號存入goal ??????end?if; ??????if?clk_cnt<1000?then?clk_cnt:=clk_cnt+1;--計數(shù) ??????else case?state?is when?c1=>--1樓 ??storey:="001"; ??if?up="000"?or?down="000"?or?goal="000"?then?storey:="001";--沒有輸入,保持1樓 ??end?if; ??????????????if?goal(1)='1'?or?up(1)='1'?then--1樓按鍵按下 ????????????????state:=open_door;--開門 ????????????????goal(1):='0';up(1):='0';--清信號 ??????????????elsif?up(2)='1'?or?goal(2)='1'?then--2樓上按鍵按下 ????????????????state:=c2;--2樓 ??????????????elsif?down(3)='1'?or?goal(3)='1'?then--3樓按鍵按下 ????????????????state:=c2;--先上2樓 ????????????????x:='1';--標(biāo)志位 ??????????????elsif?down(2)='1'?then---2樓下按鍵按下 ????????????????state:=c2;--上2樓 ????????????????mo:='1';--目的是下 ??????????????end?if; --????end?if; when?c2=> ??storey:="010";--2樓 ??if?mo='0'?then--目的是上 if?goal(2)='1'?or?up(2)='1'?then--目的地是2樓 state:=open_door;goal(2):='0';up(2):='0';--開門,清數(shù)據(jù) elsif?down(3)='1'?or?goal(3)='1'?or?x='1'?then--目的是3樓 state:=c3;x:='0';--上三樓,清標(biāo)志 elsif?down(2)='1'?or?up(1)='1'?or?goal(1)='1'?then--目的是1樓 mo:='1';--目的是下 end?if; ??else--目的是下 if?goal(2)='1'?or?down(2)='1'?then--目的地是2樓 state:=open_door;goal(2):='0';down(2):='0';--開門,清數(shù)據(jù) elsif?up(1)='1'?or?goal(1)='1'?or?y='1'?then--目的是1樓 state:=c1;y:='0';--去1樓,清標(biāo)志 elsif?up(2)='1'?or?down(3)='1'?or?goal(3)='1'?then--目的是3樓 mo:='0';--目的是上 end?if; ??end?if; when?c3=>--3樓
點擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=317