基于74LS85与74LS192的1-9层电梯控制系统设计 简介《高楼电梯自动控制系统》是一份面向数字逻辑与EDA课程设计学习者的完整文档围绕1—9层电梯运行控制展开适合需要完成课程设计、理解组合逻辑与时序逻辑实现思路的学生参考。压缩包内含1个doc文件大小约719KB主要承载设计报告正文便于集中查阅任务要求、方案论证与实验记录。文档围绕楼层输入与当前楼层比较、电机正反转、楼层显示及方向指示等环节给出74LS85数值比较器、74LS192可逆计数器、七段译码显示系统等器件的应用说明并包含模块划分、逻辑图、引脚功能与真值表、调试总结等内容可帮助读者梳理从编码输入、数值比较到计数显示的完整设计链路也可作为撰写报告和复盘实验过程的参考。目前已有1307人学习适合数字逻辑课程设计及EDA入门实践者。1. 九层楼、两个数字、三盏灯这套电梯控制系统的边界在哪去年带课程设计一个学生拿着仿真波形图问我电梯明明能跑为什么验收时不让他过。我看了一眼波形楼层计数在 9 层还在往上加一路翻到 0 再绕回 9。这就是「高楼电梯自动控制系统」这类题目最典型的陷阱——能跑不等于对逻辑自洽不等于工程闭环。这套 1-9 层电梯方案要解决的其实是一个非常收敛的问题把乘客输入的 A 数和电梯当前的 B 数比出大小再把这个大小关系变成电机的正转、反转、停机三种动作同时让楼层数字和方向指示灯跟着走。它面向的是数字逻辑课程设计、EDA 入门实践这一类场景要求用 74LS85、74LS192、七段译码驱动加编码器这样的中小规模芯片把整条链路搭出来而不是写一段单片机程序把问题绕过去。适合谁适合需要在两三周内交出一份「有原理图、有仿真、能上板、讲得清」的完整方案的人。2. 需求拆解与器件选型把五条验收要求翻译成可测的电气指标课程设计题目给的要求通常只有五六行但那五六行里藏着的每一个词最后都要落到一根引脚上。很多方案写到一半推不动不是电路不会画而是需求没拆干净——「电梯往返于 1-9 层」这句话至少包含四层信息楼层编码的位宽、计数的上下边界、越界时的行为、以及开门条件和停机条件是不是同一个信号。2.1 五条基本要求如何落到端口和电平上把原始任务逐条翻译成可测量的东西是整份方案能不能验收的第一道关口。我一般会做一张对照表左边写题目原话右边写端口名、电平定义和测量方法中间不留任何模糊地带。题目要求落地端口/信号电平与判定标准往返 1-9 层floor_cur[3:0]BCD 码 0001~1001其余编码视为非法态目标楼层手动输入并显示floor_aim[3:0]、A 数码管拨码开关或按键编码后送 74LS48显示十进制当前楼层自动显示B 数码管由 74LS192 的 Q0~Q3 直接驱动AB 上升up_en、lamp1up_en1lamp1 亮其余灯灭AB 下降dn_en、lamp3dn_en1lamp3 亮其余灯灭AB 停机开门door_open、lamp2两路使能同时为 0lamp2 亮各层门外呼叫hall_call[9:1]每个开关对应一层按下即把该层编码写入 floor_aim各层门外方向指示dir_led_up/down由 up_en、dn_en 直接驱动安装在各层门框上这张表的作用不是好看而是让「验收时到底测什么」提前定死。比如「各层门外应有使电梯上升或下降到乘客所在楼层的控制开关」翻译过来就是九个独立按键每个按键按下时把对应楼层的 BCD 码锁进 floor_aim并且这个写入动作不能覆盖正在运行的指令——否则电梯跑到一半被人按了别的楼层就会直接改向。通常的做法是加一个请求锁存用「运行中禁止改写」或者「就近响应」两种策略之一课程设计里选前者更简单也更好讲。同时要注意AB 这个条件在真实电梯里有歧义是「目标层等于当前层」还是「目标层已经到达」如果只在 AB 时输出开门信号那么电梯停在 5 层、乘客在 5 层按了 5 层门应该开但如果电梯从 3 层出发去 5 层中途经过 4 层时 A≠B门不开这是对的。所以 AB 可以作为开门条件的唯一判据但必须保证 B 在运行过程中是稳定单调变化的不能因为计数抖动出现瞬间 AB 造成误开门。还有一处容易被忽略题目说「输出使三相电机正转的时序信号」。三相电机的正反转本质是相序交换课程设计里通常不真的去驱动电机而是用三路方波模拟 U、V、W 三相正转时相序 U→V→W反转时 U→W→V。如果实验室只给指示灯那就退化成 up_en / dn_en 两路互锁信号。这一点要在方案里写清楚否则验收老师一问「你的时序信号在哪」就答不上来。2.2 四片核心器件的职责边界与替代取舍题目指定的器件是 74LS85、74LS192、七段译码显示系统、十进制至二进制编码器。这四类器件各有各的脾气选型阶段就要把边界划清楚不要指望某一颗芯片兼职干两件事。74LS85 是四位数值比较器负责 A 和 B 的大小判决。它的关键特性是带级联输入 IAB、IAB、IAB单片比较四位时必须把这三个端子处理成 IAB0、IAB0、IAB1否则输出会一直卡在「小于」。这是很多人第一次用 74LS85 时出现的障碍我在第 5 章会专门讲。74LS192 是十进制可逆计数器双时钟结构CPU 上升沿加计数、CPD 上升沿减计数MR 异步清零、PL 异步预置低有效。它的输出是 BCD 码正好可以直接送七段译码省掉一次进制转换。用它做楼层计数是这道题最省事的选择因为它天然按 0-9 循环而楼层范围恰好是 1-9边界处理只需在 0 和 9 两个点上做门控。七段译码显示系统由译码驱动器加共阴极数码管组成。共阴极数码管要求译码器输出高电平点亮笔画配套的就是高电平有效的 BCD-七段译码器。要注意这类译码器一般带 LT、RBI、BI/RBO 三个控制端做静态显示时 LT 和 RBI 都要接高电平BI/RBO 悬空或接高否则会出现全灭或全亮。十进制至二进制编码器负责把九个门外呼叫按键压成四位 BCD。这里有个坑普通编码器不允许同时按下两个键否则输出是未定义态。工程上的做法是换优先编码器或者在最前面加一层按键互锁。课程设计里如果只要求单键操作普通编码器也能过但方案里最好写一句「实际电梯需要优先编码」这句话在答辩时很加分。替代方案要不要考虑我的建议是核心链路坚持用指定器件辅助功能可以用门电路补齐。比如上下限保护、使能互锁这些逻辑用几片 74LS00、74LS08 搭出来比硬塞进 74LS192 更清楚原理图也更易读。全套用一片 CPLD 确实更简洁但那就偏离了「掌握中小规模逻辑电路设计方法」的教学目标验收时反而容易被追问。3. 总体架构设计输入通道、比较判决、计数执行三段式分模块设计再联调是这类系统唯一靠谱的推进方式。整机可以切成三段输入与显示通道负责把人的操作变成 BCD 码并显示出来比较判决模块负责算出电梯该往哪走计数执行模块负责让 B 数真的动起来并把方向和到达状态反馈给指示灯。三段之间只通过明确的信号线连接任何一段单独拿出来都能用信号发生器测通。3.1 楼层输入与七段显示的通道设计输入通道有两个来源轿厢内的目标楼层选择和每层门外的呼叫开关。两者在电气上可以并联到同一个编码网络但必须加一个选择开关或者优先级门避免同时写入造成编码冲突。我的做法是让门外呼叫经过一个九输入或门产生「有呼叫」标志轿厢内输入经过一个「内选有效」开关两者用二选一的数据选择器切换同一时刻只有一路能写进 floor_aim 锁存器。编码环节要区分两种实现。如果用的是拨码开关直接输出 BCD那编码器其实是「人眼编码」——开关上标着 1 到 9输出就是 0001 到 1001硬件上只需要一个九档拨盘加二极管隔离。如果用的是九个独立按键就必须有真正的编码器把独热码压成 BCD。这两种做法在报告里要写明白因为验收老师会问「你的编码器在哪」如果答案是拨码开关那就要承认这是简化处理。显示环节是双通道的A 数显示和 B 数显示各占一组译码器加数码管。两组的接线完全一样都是 BCD 输入、七段输出、共阴极接法唯一区别是 A 数的输入来自锁存器B 数的输入来自计数器输出。这里可以做一个小优化如果数码管数量紧张可以用一个二选一让两组数字分时复用同一片译码器但需要加扫描电路课程设计里不建议扫描带来的闪烁在验收现场很显眼。3.2 比较判决与三相电机时序输出比较判决模块的核心就是一片 74LS85。A 接目标楼层B 接当前楼层三个输出端分别对应 AB、AB、AB。这三个信号不能直接去驱动电机中间要过一级互锁和使能原因有二一是上电瞬间计数器和锁存器的初值不确定可能出现 AB 和 AB 同时为真的假象二是运行中如果目标楼层被改写比较结果会突变直接驱动电机会造成正反转瞬间切换。三相时序的生成如果实验室要求真的出三路方波可以用一个三位环形移位寄存器加时钟正转时移位方向为 U→V→W反转时反向移位停机时三路全部拉低。环形移位寄存器的初态要预置成 001否则上电后可能锁死在全 0。如果只做指示灯那就把 up_en、dn_en 直接接到 lamp1 和 lamp3lamp2 接 AB三盏灯的互斥由比较器输出天然保证——只要 74LS85 的级联端接对了三个输出是严格互斥的。门控这块要单独说。电梯运行中不允许反向这是安全要求也是逻辑上最容易漏的。假设电梯在 5 层目标 8 层正在上升此时有人在 3 层按了呼叫如果没有门控floor_aim 变成 3比较结果立刻从 AB 变成 AB电机瞬间反转。正确做法是加一个「运行方向锁存」一旦 up_en 有效就锁住直到 AB 停机才释放。这个锁存用一颗 D 触发器就能实现成本极低但很多方案里没有。3.3 可逆计数与门控使能计数执行模块以 74LS192 为中心。B 数就是它的 Q0~Q3 输出直接送译码显示。CPU 接上升脉冲CPD 接下降脉冲两个脉冲由 up_en、dn_en 分别与系统时钟相与得到。这样设计的好处是计数器本身不需要知道方向方向完全由上游判决决定职责单一。复位与预置要分清用途。MR 是异步清零用于上电初始化或紧急复位清完 B0但楼层是从 1 层开始的B0 是一个非法态所以上电后必须紧跟一次预置把 B 置成 0001。PL 是异步预置低有效预置数据从 P0~P3 输入可以把 B 直接设成任意楼层调试时非常有用——不用真的从 1 层一层层加上去直接把 B 预置到 9 层再测下降。上下限保护必须做在计数器和判决之间而不是靠计数器自己。74LS192 是十进制循环计数减到 0 再减会变成 9加到 9 再加会变成 0。如果不加门控电梯在 9 层继续上升就直接跳到 0 层波形上看起来像瞬移。做法很简单把 Q 输出译码出「等于 9」和「等于 1」两个信号分别封锁 CPU 和 CPD 的输入脉冲。这个保护逻辑用两片与非门就够但它决定了整套系统是不是「安全」的。提示上限保护和 AB 停机是两个独立条件不要合并。AB 是正常到达上限保护是异常兜底合并之后一旦比较器出错两个保护会同时失效。4. 关键模块实现74LS85 级联比较与 74LS192 加减计数的落地细节到这一层方案已经能画出一张完整的框图但框图离能跑的电路还差一段。这一段差在引脚上74LS85 的级联端到底接什么电平74LS192 的 PL 和 MR 谁先谁后七段译码的控制端悬空会怎样。这些细节不写清楚复现的人一定会卡住。4.1 74LS85 的单位比较与级联扩展74LS85 的比较规则是从最高位往下逐位比一旦某一位分出大小就立即出结果不再看低位。这个「提前退出」的特性意味着它的三个输出是组合逻辑没有时钟参与输入一变输出立刻变。用的时候要记住单片比较四位时级联输入必须显式接成 IAB0、IAB0、IAB1也就是把「低位相等」这个前提固定为真。用 Verilog 描述这段行为可以写得更清楚// 74LS85 四位数值比较器行为模型 // 关键点级联输入 gt_i / lt_i / eq_i 必须显式给出单片使用时 // 接成 gt_i0, lt_i0, eq_i1表示更低位完全相等 module cmp_74ls85 ( input wire [3:0] a, // A 数目标楼层 BCD input wire [3:0] b, // B 数当前楼层 BCD input wire gt_i, // 级联输入 IAB input wire lt_i, // 级联输入 IAB input wire eq_i, // 级联输入 IAB output reg gt_o, // 输出 AB output reg lt_o, // 输出 AB output reg eq_o // 输出 AB ); always (*) begin if (a b) begin gt_o 1b1; lt_o 1b0; eq_o 1b0; // 高位已分出大小 end else if (a b) begin gt_o 1b0; lt_o 1b1; eq_o 1b0; end else begin gt_o gt_i; lt_o lt_i; eq_o eq_i; // 四位全等才看级联输入 end end endmodule这段模型里最要紧的是最后一个分支只有 a 和 b 四位完全相等时输出才透传级联输入。如果级联端悬空TTL 输入悬空等效于高电平eq_i 会被读成 1、gt_i 和 lt_i 也会被读成 1三个输出同时为 1互斥性就没了。所以原理图上必须把这三个脚明确接地或接电源不能图省事留空。九层楼只需要比较 1 到 9四位二进制足够单片就够用。但如果以后要扩到 16 层以上就要级联低位片的 gt_o、lt_o、eq_o 接到高位片的 gt_i、lt_i、eq_i最高位片的级联输入再按单片规则置位。级联顺序不能反低位片必须接在级联链的末端反了之后比较结果会以高位为准但低位信息丢失。还有一处细节楼层 BCD 码里 0000 是非法值1010 到 1111 也是非法值。74LS85 不认识 BCD它只按二进制比。如果 B 因为干扰跳到 1010十进制 10比较结果仍然「正确」但显示会乱码。所以在计数器输出到比较器之间通常加一级合法性检测非法码时强制把 up_en 和 dn_en 都拉低让电梯停在原地等复位。4.2 74LS192 的加减计数、复位与预置74LS192 的引脚功能表里有两个时钟CPU 加计数、CPD 减计数都是上升沿触发。这里有个反直觉的地方——不计数的那一路时钟必须保持高电平否则芯片内部逻辑会误动作。很多人把不用的 CPD 接地结果加计数怎么都不动查半天以为是芯片坏了。下面这段是计数控制的核心逻辑把判决结果、上下限保护和脉冲生成揉在一起// 电梯方向判决与计数脉冲生成 // floor_aim / floor_cur 均为 4 位 BCD有效范围 1~9 module elevator_ctrl ( input wire clk, // 系统时钟用于生成计数脉冲 input wire rst_n, // 低电平复位对应 74LS192 的 MR input wire [3:0] floor_aim, // A 数目标楼层 input wire [3:0] floor_cur, // B 数当前楼层 output reg up_en, // 加计数使能驱动 CPU output reg dn_en, // 减计数使能驱动 CPD output reg door_open // AB 时开门停机 ); // 上限 9 层、下限 1 层的边界保护 wire at_top (floor_cur 4d9); wire at_bottom (floor_cur 4d1); always (posedge clk or negedge rst_n) begin if (!rst_n) begin up_en 1b0; dn_en 1b0; door_open 1b1; end else if (floor_aim floor_cur !at_top) begin up_en 1b1; dn_en 1b0; door_open 1b0; // 上升已到 9 层则封锁 end else if (floor_aim floor_cur !at_bottom) begin up_en 1b0; dn_en 1b1; door_open 1b0; // 下降已到 1 层则封锁 end else begin up_en 1b0; dn_en 1b0; door_open 1b1; // 相等或越界停机开门 end end endmodule参数说明floor_aim 和 floor_cur 都是四位 BCD范围 0001 到 1001其余编码按非法态处理up_en 和 dn_en 严格互斥任何时候不会同时为 1door_open 在停机时为高可以直接驱动开门指示或门锁继电器。at_top 和 at_bottom 两个边界信号是关键它们把「比较结果」和「物理可达性」分开了——AB 只说明方向能不能走还要看有没有撞到边界。映射回 74LS192 的硬件接法up_en 与时钟相与后接 CPUdn_en 与时钟相与后接 CPD两者都无效时 CPU 和 CPD 都保持高电平注意是保持高不是拉低。MR 接系统复位上电时拉低清零。PL 接一个「预置请求」信号预置数据 P0~P3 从一个四位拨码开关来调试时可以把 B 直接设成任意楼层。TCU 和 TCD 是进位和借位输出在本题里可以用来做「到达 9 层」和「到达 1 层」的检测比额外译码省一片门电路。这里有个时序上的坑MR 和 PL 都是异步的如果复位信号和预置信号同时有效芯片内部谁优先取决于器件工艺数据手册里虽然给了真值表但实际波形上可能出现短暂的中间态。稳妥的做法是复位和预置在时间上错开复位结束后至少等一个时钟周期再给预置。4.3 七段译码与 lamp 状态灯的点亮逻辑七段译码这块硬件上是 BCD 进、七段出软件模型里可以写成一个查找表。共阴极数码管的 a 到 g 段是高电平点亮所以译码输出 1 表示亮。// BCD 到七段共阴极译码输出高电平点亮 // 位序 {a,b,c,d,e,f,g}非法输入统一显示横杠 function [6:0] bcd2seg; input [3:0] bcd; case (bcd) 4d0: bcd2seg 7b1111110; 4d1: bcd2seg 7b0110000; 4d2: bcd2seg 7b1101101; 4d3: bcd2seg 7b1111001; 4d4: bcd2seg 7b0110011; 4d5: bcd2seg 7b1011011; 4d6: bcd2seg 7b1011111; 4d7: bcd2seg 7b1110000; 4d8: bcd2seg 7b1111111; 4d9: bcd2seg 7b1111011; default: bcd2seg 7b0000001; // 非法码显示中间横杠 endcase endfunction这段表看起来平淡但 default 分支是必须的。楼层计数器在干扰下可能跳到 1010 到 1111如果没有 default综合工具会生成锁存器上板后显示会保持上一次的值看起来像「卡住」。用横杠显示非法码验收时一眼就能看出系统进了异常态比显示乱码强。三盏状态灯 lamp1、lamp2、lamp3 的点亮逻辑直接来自比较器lamp1 接 ABlamp2 接 ABlamp3 接 AB。但要加一个使能让灯在系统复位期间全灭避免上电瞬间三灯同亮吓人。每层门外还要有方向指示这个不能简单并联到 lamp1 和 lamp3因为门外指示要区分「本层有上升请求」和「本层有下降请求」通常的做法是把 hall_call 分成上行呼叫和下行呼叫两组各自与 up_en、dn_en 相与后点亮对应楼层的门框灯。4.4 用 EDA 走完仿真到下载的闭环课程设计的目的里明确写了要掌握 EDA 工具的全流程设计输入、编译、软件仿真、下载、硬件仿真。这五步里最容易跳过的是软件仿真最容易出问题的是硬件仿真。设计输入阶段原理图输入和 HDL 输入选一种就行。原理图更贴近 74 系列芯片的接线直觉适合答辩时指着图讲HDL 更省事改参数不用重画。我的建议是主体用原理图把比较判决这一段用 HDL 写成一个模块再封装进去两边的好处都占到。软件仿真要覆盖四种工况AB 上升、AB 下降、AB 停机、以及边界工况9 层再上升、1 层再下降。前三种是题目要求第四种是加分项。仿真波形要导出成图片放进报告图上标出关键跳变点不要只贴一张密密麻麻的波形了事。下载到 FPGA 或 CPLD 之后硬件仿真要注意引脚分配。七段数码管的段选和位选如果分配到同一组 IO刷新时会互相干扰按键输入如果没加上拉TTL 悬空会读成高电平看起来像「一直按着」。这些不是逻辑问题是电气问题但表现出来都是逻辑错误排查的时候要先用万用表量电平再看波形。注意EDA 工具的综合报告里如果出现 latch inferred 的警告一律当成错误处理。组合逻辑里漏写 else 分支在仿真里看不出来上板后就是随机保持。5. 避坑与常见问题仿真通过、上板翻车的五个典型现象课程设计的时间大头从来不在画图在排查。下面这五个现象是我见过出现频率最高的每一个都能让人耗掉一整个下午。现象一数码管显示 0电梯不动比较器三个输出全是高。原因74LS85 的级联输入 IAB、IAB、IAB 悬空TTL 悬空按高电平读导致三个输出同时有效互锁逻辑被破坏。解决把 IAB 和 IAB 直接接地IAB 接 VCC三个脚一个都不能省。改完之后如果显示还是 0就去看 74LS192 的 MR 是不是被复位电路拉低了。现象二电梯在 9 层继续上升数字跳到 0 再往上加。原因只做了 AB 判决没做上限保护。74LS192 是十进制循环计数9 加 1 自然回 0比较器看到 B0A 仍然大于 B于是继续加。解决从 Q 输出译出「等于 9」与 up_en 相与后封锁 CPU 脉冲同理译出「等于 1」封锁 CPD。这个保护要放在计数脉冲生成这一级不能放在比较器后面否则比较结果虽然被改了计数器已经收到脉冲。现象三按下目标楼层方向灯立刻亮但电梯原地不动波形上 CPU 没有脉冲。原因74LS192 的 CPD 被接地了。双时钟计数器要求不用的那一路时钟保持高电平接地会让内部逻辑认为一直有下降沿芯片处于非法状态。解决CPD 通过上拉电阻接 VCC实际脉冲由 up_en 与时钟相与后从 CPU 输入。现象四运行中有人按了反方向楼层电梯瞬间反向电机发出异响。原因floor_aim 被直接改写比较结果突变没有运行方向锁存。解决加一个 D 触发器锁住当前方向AB 时释放。这一级锁存同时也挡住了「运行中改目标」的问题逻辑上等价于真实电梯的「顺向截梯」简化版。现象五仿真完全正确下载到板子上数码管缺段、按键不灵。原因引脚分配时把段选和位选分到了同一组 IO或者按键输入没加上拉。FPGA 的 IO 默认状态不一定是高阻未定义的输入会读到随机值。解决按键一律加上拉电阻或使能内部上拉段选和位选分到不同 bank分配完引脚后用万用表逐脚量一遍静态电平再上电跑。6. 验收与答辩十分钟把一台 9 层电梯讲清楚验收现场的时间通常只有十分钟左右老师不会让你从头讲原理他要看的是三样东西功能对不对、边界的处理有没有想过、出了问题能不能定位。所以答辩的结构应该反过来排——先演示再讲边界最后讲一处你踩过的坑。演示环节不要贪多选四条路径就够了从 1 层到 9 层全程上升看 B 数递增、lamp1 亮、到 9 层后 lamp2 亮且不再上升从 9 层到 1 层全程下降看 lamp3 亮、到 1 层后停住在当前层按当前层看门开指示在运行中途按反方向楼层看方向锁存是否生效。这四条路径覆盖了题目五条要求的全部而且最后一条能直接证明你考虑过真实场景。讲边界的时候把「9 层不再加、1 层不再减」这句话放在最前面。这是整套方案里最能体现工程思维的地方因为它不在题目要求里是额外补的。可以顺手把上限保护的波形图投出来指着那个被封锁的脉冲说「这里如果没有门控计数就会回绕」。老师通常会顺着这个往下问而这个问题你答得出来。再准备一张故障对照表现场被问到「如果这里坏了怎么查」的时候直接拿出来现象先查什么判定依据三灯同亮74LS85 级联端电平三个输出应严格互斥数字回绕上下限门控是否生效9 层时 CPU 应无脉冲方向不翻转方向锁存是否卡死AB 后锁存应复位显示缺段译码器 LT/RBI 电平静态显示时应为高按键连击输入有无上拉与消抖空按时应为稳定高电平最后留一分钟讲一处真实的翻车。我那次的教训是仿真里一切正常上板后电梯在 9 层来回抖动查了两个小时才发现是上限保护信号从计数器输出取而计数器输出在跳变瞬间有竞争冒险毛刺被当成了有效边沿。后来在保护信号后面加了一级 RC 延时才稳住。从那以后我每次做组合逻辑的状态判决都强制走一遍「毛刺会不会被下游当边沿」的检查不管仿真波形多干净。这套 1-9 层电梯的方案本身不复杂四片芯片、三条信号链、一个边界保护但它把数字逻辑课程里最核心的几件事串起来了组合逻辑的互斥、时序逻辑的使能、边界条件的兜底、以及从仿真到硬件的落差。把这份完整方案拿去改楼层数、改显示方式、改电机模型都可以骨架不用动。希望帮到你。本文还有配套的精品资源点击获取