名稱(chēng):四層電梯控制DE1-SoC開(kāi)發(fā)板verilog(代碼在文末下載)
軟件:Quartus II
語(yǔ)言:Verilog
代碼功能:
4層電梯
設(shè)計(jì)一個(gè)4層樓高的電梯自動(dòng)控制系統(tǒng),要求實(shí)現(xiàn):
(1)電梯運(yùn)行規(guī)則:當(dāng)電梯處于上升模式時(shí),只響應(yīng)比電梯所在位置高的上樓請(qǐng)求信號(hào),由下而上逐個(gè)執(zhí)行,直到最后一個(gè)上樓請(qǐng)求執(zhí)行完畢;如果高層有下樓請(qǐng)求,則直接升到由下樓請(qǐng)求的最高層,然后進(jìn)入下降模式。當(dāng)電梯處于下降模式時(shí)則與上升模式相反;
(2)電梯初始狀態(tài)為一層狀態(tài)。
(3)每層電梯入口處設(shè)有上下請(qǐng)求開(kāi)關(guān),電梯內(nèi)設(shè)有顧客到達(dá)層次的停站請(qǐng)求開(kāi)關(guān);
(4)設(shè)有電梯入口處設(shè)有位置指示裝置及電梯運(yùn)行模式(上升或下降)指示裝置;
(5)電梯到達(dá)有停站請(qǐng)求的樓層,電梯門(mén)打開(kāi),開(kāi)門(mén)指示燈亮,開(kāi)門(mén)4秒后,電梯門(mén)關(guān)閉(開(kāi)門(mén)指示燈滅)。若按下電梯內(nèi)開(kāi)門(mén)按鈕,則電梯一直處于開(kāi)門(mén)狀態(tài),若按下電梯內(nèi)關(guān)門(mén)按鈕,則電梯立即關(guān)門(mén)。電梯繼續(xù)進(jìn)行,直至執(zhí)行完最后一個(gè)請(qǐng)求信號(hào)后停留在當(dāng)前層;
(6)能記憶電梯內(nèi)外所有請(qǐng)求,并按照電梯運(yùn)行規(guī)則按順序響應(yīng),每個(gè)請(qǐng)求信號(hào)保留至執(zhí)行后消除。
本代碼已在DE1-SoC開(kāi)發(fā)板驗(yàn)證,其他開(kāi)發(fā)板可以修改管腳適配,開(kāi)發(fā)板如下:
演示視頻:
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
部分代碼展示:
`timescale?1ns?/?1ps //控制樓層 module?floorControl(clk,reset,openDoor,closeDoor,C1U,C2D,C2U,C3D,C3U,C4D,G1,G2,G3,G4,MoveCountDone,MoveCountEn,door,dir,state,resetButtons);? ????input?clk,reset,openDoor,closeDoor,C1U,C2D,C2U,C3D,C3U,C4D,G1,G2,G3,G4,MoveCountDone; ????output?reg?MoveCountEn,door,dir; ????output?reg?[2:0]?state; ????output?reg?[9:0]?resetButtons;?//{C1U,C2D,C2U,C3D,C3U,C4D,G1,G2,G3,G4} ???? ? ????//for?dir?(direction) ????parameter?DOWN?=?1'b0; ????parameter?UP?=?1'b1; ???? ????//for?state ????parameter?FLOOR1?=?3'b000; ????parameter?FLOOR1to2?=?3'b001; ????parameter?FLOOR2?=?3'b010; ????parameter?FLOOR2to3?=?3'b011; ????parameter?FLOOR3?=?3'b100; ????parameter?FLOOR3to4?=?3'b101; ????parameter?FLOOR4?=?3'b110; ???? ????//timing?is?a?bit?of?an?issue?so?maybe?have?a?slowclock?module?to?control?the?always?block? ????//wire?slowishclk; //slowishClock?sc1(clk,reset,slowishclk); ????always?@(posedge?clk)?begin ????if?(reset)begin ????????MoveCountEn?<=?0; ????????door?<=?0; ????????dir?<=?UP; ????????state?<=?FLOOR1; ????????resetButtons?<=?0; ????end ???? ????if?(~reset?&?openDoor?&?((state==FLOOR1)?|?(state==FLOOR2)?|?(state==FLOOR3)?|?(state==FLOOR4)))begin?//we?are?stopped?and?there?is?a?door?open?command?(sensor?or?timer?not?done) ????????MoveCountEn?<=?0; ????????door?<=?1; ????end ???? ????if?(~reset?&?~openDoor?&?closeDoor?&?((state==FLOOR1)?|?(state==FLOOR2)?|?(state==FLOOR3)?|?(state==FLOOR4)))begin?//someone?wants?to?close?the?door,?or?the?timer?has?finished ????????MoveCountEn?<=?0; ????????door?<=?0; ????end ???? ????//UP?logic?when?stopped ????//floor1 ????if?(~reset?&?~openDoor?&?~door?&?dir==UP?&?state==FLOOR1?&?(C1U|G1))begin ????????MoveCountEn?<=?0; ????????door?<=?1; ????????dir?<=?UP; ????????state?<=?FLOOR1; ????end? ????if?(~reset?&?~openDoor?&?~door?&?dir==UP?&?state==FLOOR1?&?~C1U?&?~G1?&?(C2D|C2U|C3D|C3U|C4D|G2|G3|G4))begin ????????MoveCountEn?<=?1; ????????door?<=?0; ????????dir?<=?UP; ????????state?<=?FLOOR1to2; ????end ???? ????//floor2? ????if?(~reset?&?~openDoor?&?~door?&?(dir==UP)?&?state==FLOOR2?&?~C2D?&?(C2U|G2))begin ????????MoveCountEn?<=?0; ????????door?<=?1; ????????dir?<=?UP; ????????state?<=?FLOOR2; ????end? ????if?(~reset?&?~openDoor?&?~door?&?(dir==UP)?&?state==FLOOR2?&?~C2U?&?~G2?&?(C3D|C3U|C4D|G3|G4))begin ????????MoveCountEn?<=?1; ????????door?<=?0; ????????dir?<=?UP; ????????state?<=?FLOOR2to3; ????end???? ????if?(~reset?&?~openDoor?&?~door?&?(dir==UP)?&?state==FLOOR2?&?C2D?&?~C2U?&?~C3D?&?~C3U?&?~C4D?&?~G2?&?~G3?&?~G4?)begin ????????MoveCountEn?<=?0; ????????door?<=?1; ????????dir?<=?DOWN; ????????state?<=?FLOOR2; ????end? ????if?(~reset?&?~openDoor?&?~door?&?(dir==UP)?&?state==FLOOR2?&?~C2D?&?~C2U?&?~C3D?&?~C3U?&??~C4D?&?~G2?&?~G3?&?~G4?&?(C1U|G1))begin ????????MoveCountEn?<=?1; ????????door?<=?0; ????????dir?<=?DOWN; ????????state?<=?FLOOR1to2; ????end
設(shè)計(jì)文檔:
1. 工程文件
2. 程序文件
3. 程序編譯
4. 管腳分配
5. RTL圖
6. Testbench
7. 仿真圖
圖1
圖2
圖3
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=237