电梯系统实现数字逻辑课程设计报告_第1页
电梯系统实现数字逻辑课程设计报告_第2页
电梯系统实现数字逻辑课程设计报告_第3页
电梯系统实现数字逻辑课程设计报告_第4页
电梯系统实现数字逻辑课程设计报告_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、华 中 科 技 大 学 课 程 设 计 报 告数字电路与逻辑设计课程设计报告题目:电梯控制器的设计与实现专 业:计算机科学与技术班 级:CS1310学 号:U201315072姓 名:郑欣电 话 件:1248471980分 组:俞晨希,郑欣完成日期:2015.09.23指导教师:赵贻竹团队成员:姓名班级学号贡献百分比实验部分完成情况(亮点、完成、基本完成、未完成、时间)总分:实验部分70% +报告30%)俞晨希 郑欣 CS1310 CS1310U201315070U201315072 50% 50%检查老师签名:目 录1 课程设计概述51.1 课设目的51.2 课设要

2、求51.3 课设任务51.4 实验环境52 基本方案设计72.1 设计需求72.2 总体结构设计82.2.1 时钟分频82.2.2 数码管显示模块92.2.3 七段译码器模块92.2.4 电梯主控制器模块102.2.5 顶层调用模块133 实验过程与调试153.1 仿真文件与曲线153.1.1 时钟分频1hz仿真153.1.2 时钟分频400hz仿真173.1.3 数码管显示模块仿真173.1.4 七段译码器模块仿真193.1.5 主控制模块仿真193.2 主要故障与调试253.2.1 故障1253.2.2 故障2253.3 模块内部图263.3.1 顶层调用模块263.3.2 主控制器模块2

3、74 总结与心得294.1 课设总结294.2 课设心得29附 录30531 课程设计概述1.1 课设目的通过硬件描述语言VHDL的编程,深入了解并掌握可编程芯片PLD的设计技术,加强学生对数字逻辑课程所学知识综合利用的能力。培养学生创造性思维能力和独立解决实际问题的能力。1.2 课设要求(1) 能够全面地应用课程中所学的基本理论和基本方法,完成从设计逻辑电路到设计简单数字系统的过渡。(2) 能力独立思考、独立查阅资料,独立设计规定的系统。(3) 能够独立地完成实施过程,包括安装、布线、测试和排除故障。1.3 课设任务(1) 制定出详细设计方案;(2) 通过Verilog HDL完成规定的设计

4、任务,然后进行编译和仿真,保证设计的正确性;(3) 生成容丝图文件,下载到Basys2开发板,通过实际线路进行验证;(4) 对复杂系统的设计采取模块化、层次化的设计方法;(5) 撰写设计报告,并对存在的问题进行分析、提出改进意见。1.4 实验环境开发环境ISE Project Navigator: ISE是使用XILINX的FPGA的必备的设计工具。目前官方提供下载的最新版本是14.4。它可以完成FPGA开发的全部流程,包括设计输入、仿真、 综合、布局布线、生成BIT文件、配置以及在线调试等,功能非常强大。ISE除了功能完整,使用方便外,它的设计性能也非常好,拿ISE 9.x来说,其设计性能比

5、其他解决方案平均快30%,它集成的时序收敛流程整合了增强性物理综合优化,提供最佳的时钟布局、更好的封装和时序收敛映射,从 而获得更高的设计性能。先进的综合和实现算法将动态功耗降低了10%。 Basys2 开发板:Basys2 开发板是一个电路设计实现平台,任何人都可以通过它来搭建一个真正的数字电路。Basys2是围绕着一个Xilinx Spartan-3E FPGA芯片和一个Atmel AT90USB USB控制器搭建的,它提供了完整、随时可以使用的硬件平台,并且它适合于从基本逻辑器件到复杂控制器件的各种主机电路。Basys2板上集成了大量的I/O设备和FPGA所需的支持电路,让用户能够构建无

6、数的设计而不需要其他器件。用户设计可以不局限于Basys2板本身,还可以通过四个标准的扩展连接口延伸到面包板、用户自定义电路或Pmod模板中。所有6针接口上的信号都受到ESD和短路保护,从而确保在任何环境中的使用寿命。Basys2开发板兼容所有版本的Xilinx ISE工具。Basys2附带一个用于供电和编程的USB下载线,所以就不需要其他供电器件或编程下载线。2 基本方案设计2.1 设计需求要求:1.输入:reset(脉冲),电源(总开关),楼层按钮(4个,开关),每一层的上下按钮(3楼和6楼的用开关,1楼和8楼的用脉冲),开关门(1个,脉冲);2.输出:楼层显示数码管,计时数码管;电梯运行

7、指示灯(电源),电梯上下指示灯,到达楼层指示灯,开关门状态指示灯3.电源开关作为电路总清零信号,初始状态为Off;拨动“电源开关”,电梯电路进入工作状态;4.初态为电梯在1楼;5.电梯可上可下,如果到达某一层需要停下,则开门后停5s,若停5s期间,按关门键,则立刻关门,否则5s后自动关门。在楼层数码管显示电梯当前所在的楼层;并用时间数码管显示倒计时;不运行时不显示时间;电梯正在上行或下行时,开关门键失效。6.电梯处于某层时,可以选择要到达的楼层,但是选择本楼层没有任何反应。选其他层时,点击启动按钮,则电梯开始运行。7.每次按reset,电梯回到1楼;8.电源打开,电源指示灯亮;9.电梯门开时,

8、开关门指示灯亮,否则,灭;10.电梯上行时,上行指示灯亮,下行指示灯灭;电梯下行时,下行指示灯亮,上行指示灯灭;11.电梯处于某层时,所在楼层的led灯亮,否则灭;12.相邻两层运行时间为9s,用一盏Led灯连续闪烁9次表示,并用时间数码管显示倒计时;13.电梯升降的规律:原则1:楼层设置优先。每个选择的楼层都要停止5秒,然后继续运行。原则2:就近原则。电梯运行时,按照就近原则来定义电梯的运行方向,例如,电梯在3楼,2楼有乘客要下楼,则电梯下行到2楼,在二楼设置楼层为1楼后,下降到1楼;原则3:先上后下。当上下楼层都有请求时,以及同一楼层既有上又有下请求时,先上后下;2.2 总体结构设计 按照

9、题目的要求,输出要有数码管显示,所以程序中应该包含数码管译码、七段译码器模块,并且开关门和楼层间上下倒计时以秒为单位,涉及相关的时钟分频模块。这些模块的设计方法比较传统,采用的就是一般通用的写法,例如时钟分频,就采用传统的一半翻转的计数技巧。当然,除开这些小的独立模块,最重要也是最难的是主控制模块。 对主模块的设计思想是采用有限状态机三段式的描述方式,最初采用过“笨方法”,也就是用枚举的做法用if 、case语句去把电梯在每一层的每种输入都考虑到每种输出,但这样会使代码相当复杂,并且出现很多很麻烦的bug,所以收集相关资料后改为三段式描述。 有限状态机三段式:使用三个always模块,一个al

10、ways模块采用同步时序描述状态转移,一个always采用组合逻辑判断状态转移条件,描述状态转移规律,另一个always模块描述状态输出(可以用组合电路输出,也可以时序电路输出)。 状态的划分,结合题目要求以及日常生活常识,可以把电梯正常运行的过程分为五个状态, 即没有请求的等待状态(WAIT),向上运行的上升状态(UP),向下运行的下降状态(DOWN),开门状态(OPENDOOR),以及关门状态(CLOSEDOOR)。三段式最关键的地方在于第二段五种状态的转移关系以及转移条件的描述,其次就是第三段状态转移的输出和相关变量的赋值。 其次还有相关的小问题值得注意与思考,例如1楼和8楼的按钮要求输

11、入为脉冲,而其他楼层的输入为开关,这个不同在代码中需要作出相关处理才能正确实现功能。这些小问题的排查也是整个程序能否成功的关键电梯系统总计包含两个时钟分频模块分别用于产生频率为1hz的系统时钟信号和一个频率为400hz的扫描时钟信号,一个数码管显示模块用于根据扫描信号和楼层计时器输出来数码管输出,一个七段译码管模块用于将四位的楼层与计时器转变为可以在数码管中输出的八位二进制数,电梯主控制器模块用于完成电梯信号处理,状态转移判定与决定输出功能,以及顶层调用模块用于完成对所有模块的联合调用和剩余细节功能。 这几个模块中,时钟分频、数码管显示还有七段译码器模块在可参考的资料以及网上都有可用的样板与思

12、想,这里借鉴到我们的程序里面。重要的在于主程序状态机中五个状态的转移关系,在下面会配图详细介绍。2.2.1 时钟分频需求:以开发板提供的50Mhz系统时钟和复位键为输出,得到1hz和400hz的时钟信号输入:clk为开发板提供的50Mhz系统时钟 reset为复位键输出:out为所要得到的1hz和400hz的时钟信号按照一半就翻转的方法,输入系统时钟,每个上升沿到来时计数一次,计数满2500次使输出翻转一次并且计数清零,这样得到的输出即为1hz;同理,对于400hz 的时钟分频,只需改为计数满62500次使输出翻转即可。 2.2.2 数码管显示模块需求:根据所提供的扫描时钟,控制四个数码管以较

13、快的速度分别显示出四个可控制的数字,每一次只有一个数码管有显示,但由于扫描时钟频率较快,所以使得在肉眼看来是数码管同时工作。输入:clk_fen为模块shizhongfenpin400hz输出的400hz的扫描信号 num2为所要显示的第一个数字 num3为所要显示的第二个数字输出:wx为判断四个数码管中哪一个工作的四位输出 out为一个数码管显示时所需要显示的四位二进制数扫描信号为时钟分频中400hz的时钟信号输出,将其与要显示的数字一起输入。在400hz的扫描信号的每个周期内四个数码管中只有一个工作,与其对应的输出wx控制四个数码管中哪一个工作并且在顶层调用模块中绑定四个数码管的引脚,输出

14、out作为七段译码器的输入来显示数字。2.2.3 七段译码器模块需求:将一个需要显示的四位二进制数转化成数码管能够显示的八位二进制笔画输入:num为需要显示的四位二进制数输出:out为对应的笔画数码管显示模块中的输出out为四位二进制数,将其作为输入。设计数字与笔画的对应关系后,即可按照输入输出相应的数码管数字。对应关系如下:4'b0000:out = 8'b00000011;4'b0001:out = 8'b10011111;4'b0010:out = 8'b00100101;4'b0011:out = 8'b00001101;

15、4'b0100:out = 8'b10011001;4'b0101:out = 8'b01001001;4'b0110:out = 8'b01000001;4'b0111:out = 8'b00011011;4'b1000:out = 8'b00000001; 4'b1001:out = 8'b00001001;4'b1111:out = 8'b11111111;2.2.4 电梯主控制器模块需求:完成电梯输入信号处理,状态转移判定与决定输出输入:cp为开发板的50Mhz系统时钟 cl

16、k为1hz的电梯系统时钟 reset为复位键 door为关门键 up_3,up_6,down_3,down_6为3,6楼的上下行请求信号 up_1,down_8为1楼的上行请求信号,8楼的下行请求信号 d1,d3,d6,d8为1,3,6,8楼的停靠请求信号输出:num_louceng为楼层输出(四位二进制表示) out_f为楼层输出(八位二进制表示),但在顶层调用模块中未用到 count_out为计时器输出(八位二进制表示),但在顶层调用模块中未用到 LiftState为当前状态输出,但在顶层调用模块中未用到 count为计时器输出(四位二进制表示) DoorFlag为开关门标志位 UpDnF

17、lag为上下行标志 pos为楼层输出(八位二进制表示),但在顶层调用模块中未用到 UpFlag为上行标志 DownFlag为下行标志大层次上的转移关系如下图所示,这部分由我搭档完成,在代码中体现在三段式第一段、第三段以及其他小的地方中。 开始初态一楼,关门,等待状态 分析输入,信号并置根据输入和当前状态判断下一状态,由当前状态决定当前输出 是电梯运行,输出,状态由当前状态转变为下一状态 否 是否复位是否关闭电源 否 是 结束 图1对于三段式第二段详细的状态转移关系,由于篇幅关系不能一一介绍,在此选了WAIT状态对于下一状态的转移关系以及转移条件来做示范,读者可以以此为例在附录源码中去了解其他状

18、态的转移情况。开始当前为WAIT状态有内部停靠请求? N Y有当前楼层上升或下降请求吗? 有当前楼层的吗转OPENDOOR Y Y有大于当前楼层上升或下降请求N N有大于当前楼层的 转UP Y Y还有任何上升或下降请求吗 N 转DOWN N Y 保留在WAIT N 图2在代码中,用八位二进制数d_all表示内部停靠请求的信号并置 ,同理,用八位二进制数up_all、down_all和pos表示外部上升、下降请求、当前位置的信息并置。通过d_all、up_all、down_all与pos的相关逻辑运算表示决策框中转移条件。2.2.5 顶层调用模块需求:完成对所有模块的联合调用和剩余细节功能)输入

19、:cp为开发板的50Mhz系统时钟 reset为复位键 door为关门键 up_3,up_6,down_3,down_6为3,6楼的上下行请求信号 up_1,down_8为1楼的上行请求信号,8楼的下行请求信号 d1,d3,d6,d8为1,3,6,8楼的停靠请求信号输出:led_1,led_3,led_6,led_8为1,3,6,8楼的停靠LED灯 led_up,led_down为上下行的指示灯 led_door为开关门指示灯 out_count为数码管显示的一个数字对应的八位笔画 out_shumaguan为扫描频率下工作的数码管引脚:NET "cp" LOC = B8;

20、 NET "d1" LOC = B4; NET "d3" LOC = K3; NET "d6" LOC = L3; NET "d8" LOC = P11; NET "door" LOC = M4; NET "down_3" LOC = E2; NET "down_6" LOC = G3; NET "down_8" LOC = G12; NET "led_1" LOC = P6; NET "led_3&quo

21、t; LOC = P7; NET "led_6" LOC = M11; NET "led_8" LOC = M5; NET "led_door" LOC = N4; NET "led_down" LOC = P4; NET "led_up" LOC = G1; NET "reset" LOC = A7; NET "up_3" LOC = N3; NET "up_6" LOC = F3; NET "up_1" LOC

22、= C11; NET "out_shumaguan0" LOC = M13; NET "out_shumaguan1" LOC = K14; NET "out_shumaguan2" LOC = J12; NET "out_shumaguan3" LOC = F12; NET "out_count6" LOC = H12; NET "out_count5" LOC = N14; NET "out_count4" LOC = N11; NET "o

23、ut_count3" LOC = P12; NET "out_count1" LOC = M12; NET "out_count0" LOC = N13; NET "out_count2" LOC = L13;3 实验过程与调试仿真由我搭档完成,由于我没有过手仿真,而是在他仿真完之后直接拿到开发板上去试验,该部分我直接摘抄过来。3.1 仿真文件与曲线3.1.1 时钟分频shizhongfenpin1hz仿真该模块有2个输入,1个输出,其中输入依次为clk,reset,输出为out,仿真文件如下所示:module test1h

24、z;/ Inputsreg clk;reg reset;/ Outputswire out;/ Instantiate the Unit Under Test (UUT)shizhongfenpin1hz uut (.clk(clk), .reset(reset), .out(out);initial begin/ Initialize Inputsclk = 0;reset = 0;/ Wait 100 ns for global reset to finish#100; #10 clk=clk;#10 clk=clk;#10 clk=clk;#10 clk=clk;#10 begin re

25、set=1;clk=clk; end#10 clk=clk;#10 clk=clk;#10 begin reset=0;clk=clk; end/ Add stimulus hereendalways #10 clk=clk; endmodule数据全部初始化为0,而后每隔10ns clk取反一次,50ns后reset=1复位,clk继续取反,20ns后reset=0,测试复位功能,仿真图如下所示。 图3可看到图中reset=1后,clk与out都重置为0,reset=0后,重新进行取反加1工作 图4 从图中可看到clk取反过程中out输出为一个1hz的信号(取反5千万次对应out一个周期),

26、符合所提要求3.1.2 时钟分频shizhongfenpin400hz仿真该模块仿真与时钟分频shizhongfenpin1hz仿真同理,不再单独说明3.1.3 数码管显示模块(shumaguan)仿真该模块有3个输入,2个输出,其中输入依次为clk_fen,num2(要显示的一个数字),num3(要显示的另一个数字),输出为wx(数码管选择),out(数码管笔画),仿真文件如下所示:module testshumaguan;/ Inputsreg clk_fen;reg 3:0 num2;reg 3:0 num3;/ Outputswire 3:0 wx;wire 7:0 out;/ Ins

27、tantiate the Unit Under Test (UUT)shumaguan uut (.clk_fen(clk_fen), .num2(num2), .num3(num3), .wx(wx), .out(out);initial begin/ Initialize Inputsclk_fen = 0;num2 = 1;num3 = 3;/ Wait 100 ns for global reset to finish#100; / Add stimulus hereend always #10 clk_fen=clk_fen; endmoduleclk_fen初始化为0,而后每隔10

28、ns clk_fen取反一次,num2初始化为1,num3初始化为3,仿真图如下所示: 图5 如图,clk_fen每隔10ns取反一次,wx3:0每在clk_fen的一个周期内以1101,1011,0111,1110的顺序不断变化,同时out7:0以10011111,00001101,11111111,11111111的顺序变化且与wx3:0相对应,在wx3:0为1101时,引脚绑定对应0的数码管工作,显示的数字对应笔画为10011111,显示出来正是数字1,同理,在wx3:0为1110时,引脚绑定对应0的数码管工作,显示的数字对应笔画为11111111,没有笔画显示(即不显示)。3.1.4

29、七段译码器模块(qiduanyimaqi)仿真该仿真包含在调用它的数码管显示模块里,故不再单独进行仿真3.1.5 主控制器模块(elevator)仿真该模块有14个输入,10个输出,输入:cp为开发板的50Mhz系统时钟 clk为1hz的电梯系统时钟 reset为复位键 door为关门键 up_3,up_6,down_3,down_6为3,6楼的上下行请求信号 up_1,down_8为1楼的上行请求信号,8楼的下行请求信号 d1,d3,d6,d8为1,3,6,8楼的停靠请求信号输出:num_louceng为楼层输出(四位二进制表示) out_f为楼层输出(八位二进制表示),但在顶层调用模块中未

30、用到 count_out为计时器输出(八位二进制表示),但在顶层调用模块中未用到 LiftState为当前状态输出,但在顶层调用模块中未用到 count为计时器输出(四位二进制表示) DoorFlag为开关门标志位 UpDnFlag为上下行标志 pos为楼层输出(八位二进制表示),但在顶层调用模块中未用到 UpFlag为上行标志 DownFlag为下行标志主控制器模块仿真,我们现在先来看一种简单的情况,即电梯从一楼来到三楼的过程,仿真代码如下:module testelevator;/ Inputsreg cp;reg clk;reg reset;reg door;reg up_1;reg u

31、p_3;reg up_6;reg down_3;reg down_6;reg down_8;reg d1;reg d3;reg d6;reg d8;/ Outputswire 3:0 num_louceng;wire 7:0 out_f;wire 7:0 count_out;wire 4:0 LiftState;wire 3:0 count;wire DoorFlag;wire 1:0 UpDnFlag;wire 7:0 pos;wire UpFlag;wire DownFlag;/ Instantiate the Unit Under Test (UUT)elevator uut (.cp(

32、cp), .clk(clk), .reset(reset), .door(door), .up_1(up_1), .up_3(up_3), .up_6(up_6), .down_3(down_3), .down_6(down_6), .down_8(down_8), .d1(d1), .d3(d3), .d6(d6), .d8(d8), .num_louceng(num_louceng), .out_f(out_f), .count_out(count_out), .LiftState(LiftState), .count(count), .DoorFlag(DoorFlag), .UpDnF

33、lag(UpDnFlag), .pos(pos), .UpFlag(UpFlag), .DownFlag(DownFlag);initial begin/ Initialize Inputscp = 0;clk = 0;reset = 0;door = 0;up_1 = 0;up_3 = 0;up_6 = 0;down_3 = 0;down_6 = 0;down_8 = 0;d1 = 0;d3 = 0;d6 = 0;d8 = 0;/ Wait 100 ns for global reset to finish#100;#15 reset=1;#15 reset=0; #40 up_3=1; #

34、1000 up_3=0;/ Add stimulus hereend always #1 cp=cp; always #10 clk=clk;endmodule 为节省时间,仿真时把开发板时钟替换为1ns翻转一次,电梯系统时钟替换为10ns翻转一次,如此替换不影响电梯运行实际功能。reset复位一次后,各输出变量皆有了初值 图6 图中out_f和count_out初值一直为Z是因为这两个输出在刚开始写代码时设定了,但后来在修改代码时不再用到这两个输出,又一直没有重新创建模块将这两个输出删掉,所以它们在图中一直显示蓝线Z,不过并不影响仿真与电梯运行。 此外,reset复位后,num_loucen

35、g(楼层的四位二进制表示)初值为0001,LiftState初值为00001,表示WAIT状态,count初值为0000,表示计时器输出为0,DoorFlag初值为0,表示门处于关闭状态,UpDnFlag初值为00,表示运行状态为静态static,pos(楼层的八位二进制表示)初值为00000001,表示电梯处于一楼,UpFlag和DownFlag初值都为0,表示电梯即不处于上行也不处于下行状态。 在up_3由0变为1后,仿真结果如图所示 图7 num_louceng(楼层的四位二进制表示)值为0010,表示电梯到达二楼,LiftState值变为00010,表示电梯现在已进入UP状态,coun

36、t值由1000不断自减减到0000再回到1000,表示计时器正在进行9秒倒计时,DoorFlag值为0,表示电梯上升期间门处于关闭状态,UpDnFlag值为01,表示运行状态为上升up,pos(楼层的八位二进制表示)值在count计时器值为0时变为00000010,表示电梯已经到达二楼,UpFlag值为1,表示运行期间电梯处于上升状态上行灯亮,DownFlag值为0,表示电梯不处于下行状态。 电梯运行一段时间后(来到三楼时) 图8 num_louceng(楼层的四位二进制表示)值为0011,表示电梯到达三楼,LiftState值由00010先变为01000,表示电梯进入OPENDOOR状态,再

37、变为10000,表示电梯进入关门状态,count值由0100不断自减减到0000再回到0100,表示计时器正在进行5秒倒计时,(回到0100是因为此时up_3仍等于1,门外仍有开门请求,所以电梯要重新开门),DoorFlag值由0变为1再变为0,表示电梯上升期间门处于关闭状态,到达三楼后门打开,5秒计时后关门,由于up_3仍为1所以继续开门再关门,UpDnFlag为01,表示运行状态标志为上升up,pos(楼层的八位二进制表示)值由00000010变为00000100,表示电梯已经到达三楼,UpFlag值由1变为0,表示运行期间电梯从上升状态转变为非上升状态,上行灯由亮变灭,DownFlag值

38、为0,表示电梯不处于下行状态。 在电梯到达三楼,up_3取消请求由1变为0后, 图9 num_louceng(楼层的四位二进制表示)值为0011,表示电梯处于三楼,LiftState值由00010先变为01000,表示电梯进入OPENDOOR状态,再变为10000,表示电梯进入关门状态,再变为00001,表示电梯进入WAIT等待状态,count值由0100不断自减减到0000保持不变,表示计时器进行最后一次5秒倒计时后保持为0不再计时,DoorFlag值由0变为1再变为0,表示电梯5秒计时后关门,由于处于WAIT状态故不再开门门一直处于关闭状态,UpDnFlag由01变为00,表示运行状态标志

39、由上升up转变为静态static,pos(楼层的八位二进制表示)值维持00000100,表示电梯一直处于三楼,UpFlag和DownFlag值为0,表示电梯即不处于上升状态也不处于下行状态。电梯运行的较复杂情况如多请求,按下关门键等操作的仿真皆可通过,与上述情况同理,在此就不再说明。3.2 主要故障与调试 整个代码在设计过程中出现了很多大大小小的问题,这是程序设计不可避免的过程,但也是这些排错过程才真正使人成长,以下简述我在设计时遇到的主要故障:3.2.1 故障1问题描述:下降和上升的请求并置后,程序在有来自1、8楼的请求时有时会出现错误输出问题分析:问题在于我没有注意到要求3、6用开关,1、

40、8用脉冲的区别,把1、3、6的上升请求以及3、 6、8的下降请求简单合并解决方法:在程序中添加了2个reg变量up_1_qingqiu和down_8_qingqiu并使用两个always去描述这两个变量与up_1、down_8的关系以及在不同情况下的赋值。并在信息并置中用这两个去代替原来的输入3.2.2 故障2问题描述:三段式中的第二段设计状态转移时提示出错问题分析:电梯五个状态间的状态转移关系相当复杂,并且涉及到不同请求的优先级关系。当时经过排查后发现自己在设计过程中在当前状态为CLOSEDOOR以及UP时,转移为下一个状态的优先级设计出现了矛盾,导致不能正常运行。解决方法:在这种比较复杂的

41、状态转移设计前,一定要保持头脑的清醒。为了不再出现这样的错误,我采用画图的方法去展现状态转移的关系,并且在连线上标明转移条件,把图一步步规范化可以得到状态转移的流程图(如上面所示)经过仔细对比梳理成功排除并杜绝了此类错误。3.3 模块内部图 3.3.1 顶层调用模块 图10输入:cp为开发板的50Mhz系统时钟 reset为复位键 door为关门键 up_3,up_6,down_3,down_6为3,6楼的上下行请求信号 up_1,down_8为1楼的上行请求信号,8楼的下行请求信号 d1,d3,d6,d8为1,3,6,8楼的停靠请求信号输出:led_1,led_3,led_6,led_8为1

42、,3,6,8楼的停靠LED灯 led_up,led_down为上下行的指示灯 led_door为开关门指示灯 out_count为数码管显示的一个数字对应的八位笔画 out_shumaguan为扫描频率下工作的数码管3.3.2 主控制器模块 图11输入:cp为开发板的50Mhz系统时钟 clk为1hz的电梯系统时钟 reset为复位键 door为关门键 up_3,up_6,down_3,down_6为3,6楼的上下行请求信号 up_1,down_8为1楼的上行请求信号,8楼的下行请求信号 d1,d3,d6,d8为1,3,6,8楼的停靠请求信号输出:num_louceng为楼层输出(四位二进制表

43、示) out_f为楼层输出(八位二进制表示),但在顶层调用模块中未用到 count_out为计时器输出(八位二进制表示),但在顶层调用模块中未用到 LiftState为当前状态输出,但在顶层调用模块中未用到 count为计时器输出(四位二进制表示) DoorFlag为开关门标志位 UpDnFlag为上下行标志 pos为楼层输出(八位二进制表示),但在顶层调用模块中未用到 UpFlag为上行标志 DownFlag为下行标志4 总结与心得4.1 课设总结就整体而言,个人认为这份代码完成度还是很高的,既把题目的要求全部考虑进去了,又在里面加入了不少我们自己的想法。并且这种有限状态机三段式的描述方式我

44、们在相关书籍资料上了解后也是第一次使用,对我们来说也是一次挑战。但是我还是想提一下建议,数电课程本身学到的东西对这次实验的帮助还是太小了,赵老师请过来教verilog语言的老师由于时间的原因也只能点水式地介绍,并且没有之前做过的经验,然后就要我们做这种比较大型的设计对大多数学生来说还是很难的,希望学院以后能做出改变,多增加时间对学生做出相关的教学。 4.2 课设心得这次课设实验确实花了我不少心思与时间,从一开始只会用简单的门与触发器去写一些简单的电路,到花大量时间去翻阅资料,自学verilog更深层次的内容以及参阅其他一些经典实践设计的思想和具体代码,再到分工合作,从思想设计到一步步去编写程序

45、,绞尽脑汁去排查各种各样的错误,其中付出的辛苦也就自己能知道,当然我们也最终收获了成功的喜悦。在此很感谢我的课设搭档,在完成过程中他包下了很多麻烦的“苦活”,例如每个模块的仿真等,很多棘手的小错误也是他想的办法。相信我能从这次实验中的经历中汲取知识与教训,经过这次课设后,以后再碰到相关的设计,将做的更加游刃有余。附 录(源程序)主控制器模块:module elevator(cp,clk,reset,door,up_1,up_3,up_6,down_3,down_6,down_8,d1,d3,d6,d8,num_louceng ,out_f,count_out,LiftState,count,D

46、oorFlag, UpDnFlag, pos,UpFlag,DownFlag); input cp; input clk; input reset; input door; input up_1; input up_3; input up_6; input down_3; input down_6; input down_8; input d1; input d3; input d6; input d8; output 7:0 out_f; output 7:0 count_out; output 4:0 LiftState; output 3:0 count; output DoorFlag

47、; output 1:0 UpDnFlag; output 7:0 pos; output UpFlag; output DownFlag; output 3:0 num_louceng; wire 7:0 out_f; wire 7:0 count_out; wire clk; reg 3:0num_louceng; wire 3:0 count; wire wumiaofuwei; assign wumiaofuwei=doorreset; reg 7:0 pos; reg 3:0 count_door,count_updn; reg DoorFlag,ResetFlag,TransFla

48、g,up_1_qingqiu,down_8_qingqiu,UpFlag,DownFlag; reg 1:0 UpDnFlag; reg 4:0 LiftState,NextState; reg 7:0 up_all,down_all,d_all; parameter WAIT=5'b00001,UP=5'b00010,DOWN=5'b00100,OPENDOOR=5'b01000,CLOSEDOOR=5'b10000; parameter FLOOR1=8'b00000001,FLOOR2=8'b00000010,FLOOR3=8'b00000100,FLOOR4=8'b00001000, FLOOR5=8'b00010000,FLOOR6=8'b00100000,FLOOR7=8'b01000000,FLOOR8=8'b10000000; parameter OPEN=1'b1,CLOSED=1'b0; parameter up=2'b01,down=2'b10,static=2'b00; always(posedge cp) begin case(pos) 8'b00000001:num_louceng&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论