六层电梯控制系统 Verilog Quartus
名称:六层电梯控制系统 Verilog Quartus
软件:Quartus
语言:Verilog
开发板/平台:Cyclone IV FPGA开发板
功能介绍
该工程实现一个六层电梯控制系统,支持 1~6 层轿厢内选层,以及 1~5 层上行外呼和 2~6 层下降外呼。系统对按键进行同步、边沿检测和楼层编码,分别锁存各类请求,并按照当前楼层与运行方向安排后续状态。 顶层 elevator 集成运行控制、数码管楼层显示、方向状态 LED、开门/关门指示和蜂鸣器报警。forbid、故障、超重及障碍物输入可使电梯暂停运行,适合用于 FPGA 电梯控制、有限状态机和多模块 Verilog 工程学习。运行环境
Verilog HDL,使用 Quartus 工程文件进行编译与配置,顶层模块为 elevator。工程包含 .qpf、.qsf、v4_pins.qsf 等项目与管脚分配文件,目标硬件为 Cyclone IV FPGA 开发板。设计思路
系统采用分层模块化的 Verilog 设计,将按键输入、请求锁存、运行控制、状态机、楼层译码、时钟分频和报警功能拆分实现。外部上升与下降请求分别由 up_manager、down_manager 管理,轿厢内选层请求由 st_manager 锁存;key_logic 将低有效独立按键转换为楼层编码和请求脉冲,便于复用既有请求处理接口。 顶层通过 nextgen 根据当前楼层、运行方向和三类请求生成次态,再由 statemachine 保存电梯运行状态。divider 将系统时钟转换为电梯运行所需的慢速时钟,并把禁止运行、故障、超重和障碍物条件统一纳入暂停控制。position 与 pos_decoder 配合完成楼层显示,alarm、open_led、close_led 和 led 输出用于反映报警、开关门及运行方向状态。模块结构
顶层模块为 elevator,主要由 key_logic、divider、up_manager、down_manager、st_manager、nextgen、statemachine、pos_decoder、state_decoder 和 alarm 等模块组成。key_logic 负责按键脉冲与楼层编码,三个 manager 模块负责不同来源的请求锁存和清除,nextgen 与 statemachine 完成状态转移控制。 工程同时包含 tb_elevator 测试平台,以及楼层译码、状态译码和时钟分频等配套模块。部分工程版本还集成 ap3216c_if、ap3216c 与 i2c_dri 接口模块,可结合项目目录中的源码进行扩展和学习。开发板验证
工程配套 Cyclone IV FPGA 开发板的管脚约束与分配文件,可用于完成上板连接与验证。顶层模块提供系统时钟、复位、上下行外呼按键、轿厢内选层按键、故障、超重和障碍物输入,并输出楼层数码管、运行状态 LED、开关门指示及蜂鸣器信号。故障、超重或检测到障碍物时,系统可暂停电梯运行并配合报警逻辑进行状态提示。演示视频
提供上板演示视频和演示视频,用于观察六层电梯控制系统的按键请求、楼层运行、状态指示、开关门显示及报警输出等实际演示过程。仿真图/仿真说明/设计文档图片
配套设计文档包含工程文件说明、程序编译、RTL 图、管脚分配、传感器连接关系,以及整体仿真图和按键处理、分频器、上升请求、下降请求、轿厢内请求、次态生成、状态机、楼层译码和报警模块说明。文档图片可用于配合源码理解模块连接和控制流程。


















部分代码
以下展示顶层模块 elevator 的部分代码,完整源码请下载压缩包查看。
module elevator (
input SYSCLKOUT, // 系统时钟(例如 50MHz)
input forbid, // 禁止运行信号,高电平时电梯停止(时钟被屏蔽)
input reset, // 异步复位按键,高电平有效
input [4:0] up_key_n, // 楼层外部上升请求按键,低电平表示按下,对应 1~5 层
input [4:0] down_key_n, // 楼层外部下降请求按键,低电平表示按下,对应 2~6 层(1 楼无下降键)
input [5:0] in_key_n, // 轿厢内部楼层请求按键,低电平表示按下,对应 1~6 层
input fault_sw, // 故障拨码开关,高电平表示有故障
input overload_sw, // 超重拨码开关,高电平表示超重
input obstacle_sw, // 障碍物拨码开关,高电平表示检测到障碍物
output [5:0] en, // 数码管位选,固定 6'b111110(低电平选中一位)
output [6:0] pos_out, // 当前楼层显示输出到数码管
output [5:0] led, // 状态 LED 显示:上行或下行,低电平点亮
output open_led, // 开门指示 LED,低电平点亮
output close_led, // 关门指示 LED,低电平点亮
output beep // 蜂鸣器输出,报警时为方波
);
// 内部连接信号定义
wire CLKOUT; // 分频后的慢速时钟(约 0.5Hz)
wire [5:0] position; // 电梯当前位置(独热码,一位表示一层)
wire [5:0] posout; // 用于显示的楼层位置
wire [1:0] updnflag; // 电梯运行方向标志
wire [5:0] currentstate; // 电梯当前状态(由状态机输出)
wire [5:0] nextstate; // 电梯次态(由组合逻辑 nextgen 产生)
wire [2:0] count; // OPENWAIT 状态计数值
// 内部请求信号:仍然使用 6 位向量表示 1~6 楼的请求
wire [5:0] up_request; // 锁存的上升方向外呼请求
wire [5:0] down_request; // 锁存的下降方向外呼请求
wire [5:0] st_request; // 锁存的轿厢内楼层请求
// 来自按键信号处理模块的输出:
// 为了复用原有的 up_manager / down_manager / st_manager 接口,
// 将独立按键转换为“按键脉冲 + 楼层编码”的形式。
wire up_button; // 上升请求脉冲
wire down_button; // 下降请求脉冲
wire request_button; // 车内楼层请求脉冲
wire [2:0] floorsel_up; // 上升请求使用的楼层编码
wire [2:0] floorsel_down; // 下降请求使用的楼层编码
wire [2:0] floorsel_in; // 车内楼层请求使用的楼层编码
// 数码管位选:固定点亮 1 位,低电平选中
assign en = 6'b111110;
// 按键处理模块:
// 在独立按键基础上完成同步、消抖(简化为边沿检测)和楼层编码。
key_logic k1 (
.SYSCLKOUT (SYSCLKOUT),
.reset (reset),
.up_key_n (up_key_n),
.down_key_n (down_key_n),
.in_key_n (in_key_n),
.up_button (up_button),
.down_button (down_button),
.request_button(request_button),
.floorsel_up (floorsel_up),
.floorsel_down (floorsel_down),
.floorsel_in (floorsel_in)
);
// 分频器模块:
// 将高速系统时钟 SYSCLKOUT 分频得到慢速时钟 CLKOUT。
// forbid_eff 为 1 时,输出时钟被屏蔽,相当于电梯暂停运行。
// 这里将 forbid、障碍物、故障、超重四种情况统一视为“暂停”条件。
wire forbid_eff = forbid | obstacle_sw | fault_sw | overload_sw;
divider d1 (
.SYSCLKOUT (SYSCLKOUT),
.forbid (forbid_eff),
.CLKOUT (CLKOUT)
);
// 上升请求处理模块:
// 接收各楼层的上升外呼请求,并根据当前状态、方向等在适当时机清除请求
up_manager u1 (
.reset (reset),
.st_request (st_request),
.down_request (down_request),
.floorsel (floorsel_up),
.up_button (up_button),
.position (position),
.currentstate (currentstate),
.up_request (up_request),
.updnflag (updnflag)
);
// 下降请求处理模块:
// 接收各楼层的下降外呼请求,并根据当前状态、方向等在适当时机清除请求
down_manager d2 (
.reset (reset),
.st_request (st_request),
.up_request (up_request),
.floorsel (floorsel_down),
.down_button (down_button),
.position (position),
.currentstate (currentstate),
.down_request (down_request),
.updnflag (updnflag)
);
// 轿厢内楼层请求处理模块:
// 根据车内楼层请求按键 in_key_n 的“按下沿”编码为 floorsel_in,
// 锁存车内请求,当电梯在某层开门时自动清除该层请求
st_manager s1 (
.reset (reset),
.floorsel (floorsel_in),
.request_button (request_button),
.position (position),
.currentstate (currentstate),
.st_request (st_request)
);
// 次态生成模块:
// 根据当前状态、当前楼层位置以及三种请求信号,按照“方向优先”原则
// 计算电梯下一时刻应该处于的状态 nextstate
nextgen n1 (
.up_request (up_request),
.down_request (down_request),
.st_request (st_request),
// ... 以下代码略,完整源码请下载压缩包查看
代码文件(付费下载)
📥
付费后此处显示完整工程压缩包下载链接。
1、代码文件需要付费后才可见。
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 六层电梯控制系统 Verilog Quartus
2、支付问题请联系微信公众号客服。
3、优质Verilog/VHDL代码资源,所见即所得。
Verilog/VHDL资源下载 » 六层电梯控制系统 Verilog Quartus