资讯动态

FPGA电梯控制器:三层状态机硬件设计与多时钟域实践

发布时间:2026/9/19 10:42:40 来源:尧图企业网站定制
简介本资源是北京邮电大学《数字电路与逻辑设计》课程配套的三层电梯控制器实验报告面向电子、通信、自动化等专业本科生及FPGA初学者聚焦VHDL状态机设计、Quartus II开发流程与数字系统模块化实现。报告完整涵盖设计任务、状态转移图、10状态FSM建模如stopon1、doorwait14、up/down等、分频器50MHz→1Hz、控制模块、LED/数码管/点阵显示驱动及同步复位机制并附带带详尽注释的VHDL源程序与端口说明。资源为单文件docx文档大小1.62MB内容结构清晰含系统框图、模块划分、测试用例分析及多场景运行逻辑推演如多请求优先级响应、复位恢复等便于理解状态机时序逻辑与工程落地细节。目前已有190人学习下载适合开展数字系统综合实验、课程设计复盘或EDA入门实践。1. 这不是玩具电梯而是一套完整跑在FPGA上的三层状态机控制系统北邮数电实验里这份「简易三层电梯控制器」文档表面看是学生交的Word报告实则藏着一套可综合、可烧录、可真机验证的完整VHDL工程。它不依赖任何上位机或PC通信所有逻辑——从50MHz晶振分频到1Hz节拍、从按钮消抖到10状态FSM调度、从楼层位置寄存到上升/下降/停站请求的优先级仲裁——全部固化在FPGA内部。你拿到的不是伪代码或流程图而是能直接导入Quartus II、分配引脚、编译下载到DE2-115或类似开发板上实时运行的硬件描述。它解决的核心问题是数字系统设计中最典型的时序敏感型多输入响应建模如何让一个没有操作系统、没有中断向量表、只有纯组合时序逻辑的芯片在毫秒级响应外部按钮的同时严格维持4秒开门等待、单层1秒运行、状态不可跳变等硬实时约束。适合刚学完组合逻辑、正啃状态机章节的大二学生动手复现也适合已工作3年的数字工程师回炉重看——因为里面对clearup/cleardn双路请求清除机制的设计、对udsig方向信号与position位置变量的耦合处理、以及doorwait1到doorwait4显式拆解而非用计数器隐式实现都是教科书里很少展开的实战细节。2. 状态机不是画个图就完事10个状态的物理意义与转移条件必须映射到真实时钟域2.1 为什么必须显式定义10个离散状态——避开“计数器陷阱”很多初学者会想“开门4秒”直接用一个4-bit计数器加比较器不就行了但本设计坚持将doorwait1~doorwait4拆成独立状态根本原因在于状态机输出必须与当前状态强绑定而非依赖计数器中间值。观察源码中doorlight信号的赋值when stopon1 doorlight 1; position 1; mylift doorwait1; when doorwait1 mylift doorwait2; when doorwait2 mylift doorwait3; when doorwait3 mylift doorwait4; when doorwait4 mylift doorclose;提示doorlight只在stopon1、dooropen两个状态被置高其余doorwait*状态中该信号保持前一状态值由buffer端口属性维持。这意味着LED点亮时长严格等于状态驻留时间而每个doorwait*状态恰好对应1个liftclk上升沿即1秒避免了计数器溢出判断失败导致的开门时间漂移。若改用单计数器需在每次liftclk上升沿检查COUNT 4并清零但此时doorlight的关断时机将取决于比较逻辑延迟可能在第4.2秒才生效——而FPGA布线后该延迟不可预测。显式状态分解把时序约束转化为状态转换约束由综合工具自动插入寄存器保证建立/保持时间满足。2.2 状态转移的四大物理约束条件状态转换不是凭空发生必须对应真实硬件行为。本设计中每个when ... 分支都隐含以下约束状态触发条件物理含义upudsig1 AND position3电梯处于上升模式且未达顶层必须执行上升动作downudsig0 AND position1电梯处于下降模式且未达底层必须执行下降动作stop(position2 AND (fuplight(2)1 OR fdnlight(2)1)) OR (position1 AND fuplight(1)1)当前楼层存在有效请求上升/下降/停站且电梯运动方向与请求匹配dooropenmyliftstop仅当stop状态结束后无条件进入确保开门动作与停靠动作严格解耦特别注意stop状态的判定逻辑它不检查stoplight是否为1而是检查fuplight(pos)或fdnlight(pos)——这说明停站请求stopbutton本质是“本层上升/下降请求”的镜像。例如stop2button1会同时置位stoplight(2)和fuplight(2)见ctrlight进程因此stoplight实际是冗余寄存真正驱动停靠决策的是方向性请求信号。2.3 复位信号的异步实现与同步风险规避源码中复位逻辑写为if reset1 then mylift stopon1; clearup 0; cleardn 0; elsif liftclkevent and liftclk1 then -- 正常状态转移 end if;注意这是异步复位reset直接作用于if条件不依赖liftclk边沿。虽然VHDL语法允许但在FPGA中易引发亚稳态。实际工程中应改为同步复位先用两级触发器对reset进行时钟域同步再送入状态机。本实验因时钟频率低1Hz、复位使用按键开关机械抖动大异步复位反而更可靠——按键按下时reset持续高电平远超liftclk周期亚稳态概率极低。3. 按钮请求的寄存与清除机制双路独立寄存器位置感知清除3.1 请求信号为何要分fuplight/fdnlight/stoplight三组观察端口定义fuplight, fdnlight, stoplight: buffer std_logic_vector(3 downto 1);三者均为3位向量索引1~3对应楼层。但它们的更新逻辑完全不同fuplight(i)仅由f1upbuttoni1、f2upbuttoni2置位永不自动清零fdnlight(i)仅由f2dnbuttoni2、f3dnbuttoni3置位永不自动清零stoplight(i)由stop1button~stop3button置位但会被clearup/cleardn信号强制清零这种设计实现了请求的持久化存储与位置感知清除。例如当电梯在2层开门时clearup1会执行fuplight(position) 0; -- 清除fuplight(2) stoplight(position) 0; -- 清除stoplight(2)但fdnlight(2)不受影响——因为下降请求在2层无效乘客不可能在2层按下降键去2层而fuplight(1)仍保持11层上升请求未被响应。3.2clearup/cleardn信号的生成时机与竞争规避这两个信号由主状态机在dooropen状态末尾生成when dooropen doorlight 1; if udsig1 then if position3 and (fuplight(pos)1 or stoplight(pos)1) then clearup 1; -- 上升模式下本层有上升/停站请求则清除 else clearup 1; cleardn 1; -- 否则全清防残留 end if; elsif udsig0 then if position1 and (fdnlight(pos)1 or stoplight(pos)1) then cleardn 1; -- 下降模式下本层有下降/停站请求则清除 else clearup 1; cleardn 1; end if; end if; mylift doorwait1;关键点在于clearup/cleardn在dooropen状态结束前一个时钟周期就已确定而ctrlight进程在下一个buttonclk上升沿采样它们。这确保了请求清除操作与状态机推进严格同步——当电梯离开某层时该层请求必然已被清除避免同一请求被重复响应。3.3 按钮消抖的硬件级实现buttonclk分频策略外部按钮BTN直接接入FPGA会引入毫秒级抖动。本设计用独立分频器生成buttonclktime2: process(clk) variable COUNT2: integer range 0 to 6499; begin if clkevent and clk1 then COUNT2 : COUNT2 1; if COUNT2 6499 then COUNT2 : 0; buttonclk NOT buttonclk; -- 50MHz / 6500 ≈ 7.69kHz end if; end if; end process time2;提示6500分频得到约7.69kHz采样时钟远高于按钮抖动频率通常100Hz但又不过高导致资源浪费。ctrlight进程在buttonclk上升沿采样所有按钮相当于硬件级“边沿检测延时确认”比软件延时消抖更可靠。4. 分频器与多时钟域协同50MHz到1Hz的精准链式分频4.1 为什么需要两级分频——时钟域隔离的刚性需求系统存在三个时钟域主时钟域50MHzclk驱动time1/time2计数器状态机时钟域1Hzliftclk驱动ctrlift进程电梯运行节拍按钮采样时钟域7.69kHzbuttonclk驱动ctrlight进程请求寄存若用同一分频器生成liftclk和buttonclk会导致二者相位强耦合。例如当liftclk上升沿恰好落在按钮抖动区间可能采样到错误电平。因此必须用独立计数器time1COUNT1计数至?原文缺失数值按50MHz→1Hz计算应为49999999生成liftclktime2COUNT2计数至6499生成buttonclk两者起始计数相位完全独立天然实现时钟域隔离。4.2liftclk分频系数的精确计算与代码补全原文time1进程中COUNT1上限为空白需根据50MHz→1Hz反推分频比 50,000,000 / 1 50,000,000 计数范围0 to 49,999,999 → 共50,000,000个状态补全后代码time1: process(clk) variable COUNT1: integer range 0 to 49999999; begin if clkevent and clk1 then COUNT1 : COUNT1 1; if COUNT1 49999999 then COUNT1 : 0; liftclk NOT liftclk; end if; end if; end process time1;注意COUNT1声明为variable非signal是关键。variable在进程内立即生效避免signal赋值延迟一周期导致分频误差累积。4.3 多时钟域信号交互的跨时钟域处理CDCctrlight进程输出fuplight等信号给ctrlift进程使用而前者时钟为buttonclk7.69kHz后者为liftclk1Hz。直接连接会引发亚稳态。本设计通过两级寄存器同步规避ctrlight进程输出的fuplight已是buttonclk域信号ctrlift进程在liftclk上升沿采样fuplight因liftclk频率远低于buttonclk采样时fuplight已稳定满足建立时间这是典型的慢时钟采样快时钟信号场景无需额外同步电路。若反过来快时钟采样慢时钟信号则必须用两级触发器。5. 实战验证技巧用Quartus II SignalTap抓取关键信号波形5.1 必须监控的5个信号及其物理意义在Quartus II中配置SignalTap Logic Analyzer时优先捕获以下信号按重要性排序信号名所属模块验证目标异常表现liftclktime1确认1Hz节拍是否稳定周期≈1.000s周期跳变、占空比严重失衡positionctrlift检查楼层变化是否符合预期1→2→3或3→2→1跳层1→3、停滞卡在某层udsigctrlift验证方向信号是否与运动一致udsig1时position应递增方向与运动相反doorlightctrlift开门时长是否严格4秒高电平持续4个liftclk周期高电平过短4s或过长4sfuplight(2)ctrlight按下2层上升按钮后是否置位开门后是否被clearup清除按钮按下无反应、清除不及时5.2 SignalTap配置关键参数设置# 在Quartus II SignalTap界面中 Sampling Clock: liftclk # 必须用状态机时钟否则无法对齐状态 Depth: 1024 # 足够捕获4秒以上波形4个liftclk周期 Trigger Position: 50% # 居中触发前后各512点 Trigger Condition: - Trigger on: fuplight(2) rising edge # 捕获按钮按下瞬间 - Then wait for: position 2 AND doorlight 1 # 再捕获开门时刻提示若发现doorlight高电平不足4周期检查doorwait1→doorwait4状态转移是否被意外跳过——常见原因是reset信号在测试中误触发或liftclk分频系数错误导致周期缩短。5.3 数码管显示异常的快速定位法数码管显示楼层由position信号经7段译码器驱动。若显示乱码如显示8或全灭按以下顺序排查查position值用SignalTap确认position是否在1~3范围内跳变。若为0或4说明up/down状态中positionposition1或positionposition-1语句执行异常常见于position未声明为buffer导致读写冲突查译码逻辑确认.vhd文件中是否有dout1输出赋值原文未给出需自行补充。标准共阴极译码process(position) begin case position is when 1 dout1 0000001; -- 1 when 2 dout1 1001111; -- 2 when 3 dout1 1000111; -- 3 when others dout1 1111111; -- 灭 end case; end process;查choose选通信号choose控制哪一位数码管点亮。若choose未正确循环如始终为000001则只亮第一位。需检查choose是否由独立计数器驱动且频率足够高100Hz避免闪烁。验证时可临时将position强制赋值为2观察数码管是否稳定显示2。若仍异常则问题必在译码或驱动电路。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价