名称:四层电梯控制DE1-SoC开发板verilog(代码在文末下载)
软件:Quartus II
语言:Verilog
代码功能:
4层电梯
设计一个4层楼高的电梯自动控制系统,要求实现:
(1)电梯运行规则:当电梯处于上升模式时,只响应比电梯所在位置高的上楼请求信号,由下而上逐个执行,直到最后一个上楼请求执行完毕;如果高层有下楼请求,则直接升到由下楼请求的最高层,然后进入下降模式。当电梯处于下降模式时则与上升模式相反;
(2)电梯初始状态为一层状态。
(3)每层电梯入口处设有上下请求开关,电梯内设有顾客到达层次的停站请求开关;
(4)设有电梯入口处设有位置指示装置及电梯运行模式(上升或下降)指示装置;
(5)电梯到达有停站请求的楼层,电梯门打开,开门指示灯亮,开门4秒后,电梯门关闭(开门指示灯灭)。若按下电梯内开门按钮,则电梯一直处于开门状态,若按下电梯内关门按钮,则电梯立即关门。电梯继续进行,直至执行完最后一个请求信号后停留在当前层;
(6)能记忆电梯内外所有请求,并按照电梯运行规则按顺序响应,每个请求信号保留至执行后消除。
本代码已在DE1-SoC开发板验证,其他开发板可以修改管脚适配,开发板如下:
演示视频:
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
982