• 方案介绍
  • 附件下载
  • 相关推荐
申请入驻 产业图谱

四层电梯控制DE1-SoC开发板verilog 4层电梯

05/21 10:43
982
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1-231101154029232.doc

共1个文件

名称:四层电梯控制DE1-SoC开发板verilog(代码在文末下载)

软件:Quartus II

语言:Verilog

代码功能:

4层电梯

设计一个4层楼高的电梯自动控制系统,要求实现:

(1)电梯运行规则:当电梯处于上升模式时,只响应比电梯所在位置高的上楼请求信号,由下而上逐个执行,直到最后一个上楼请求执行完毕;如果高层有下楼请求,则直接升到由下楼请求的最高层,然后进入下降模式。当电梯处于下降模式时则与上升模式相反;

(2)电梯初始状态为一层状态。

(3)每层电梯入口处设有上下请求开关,电梯内设有顾客到达层次的停站请求开关;

(4)设有电梯入口处设有位置指示装置及电梯运行模式(上升或下降)指示装置;

(5)电梯到达有停站请求的楼层,电梯门打开,开门指示灯亮,开门4秒后,电梯门关闭(开门指示灯灭)。若按下电梯内开门按钮,则电梯一直处于开门状态,若按下电梯内关门按钮,则电梯立即关门。电梯继续进行,直至执行完最后一个请求信号后停留在当前层;

(6)能记忆电梯内外所有请求,并按照电梯运行规则按顺序响应,每个请求信号保留至执行后消除。

本代码已在DE1-SoC开发板验证,其他开发板可以修改管脚适配,开发板如下:

电梯.png

演示视频:

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

设计文档:

1. 工程文件

2. 程序文件

3. 程序编译

4. 管脚分配

5. RTL图

6. Testbench

7. 仿真图

图1

图2

图3

点击链接获取代码文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=237

  • 1-231101154029232.doc
    下载

相关推荐