带液晶显示驱动的智能电梯控制器
elevator_controllercp_50Mclkresetforbidcall_up_1call_up_2call_up_3call_up_4call_up_5call_down_2call_down_3call_down_4call_down_5call_down_6request_1request_2request_3request_4request_5request_6out[6..0]LiftState[6..0]over_alarmcount_out[6..0]count[2..0]malueeinst3端口声明:
Input Port:
call_up_1, call_up_2, call_up_3, call_up_4, call_up_5分别为1-5楼的上行请求信号,
call_down_2, call_down_3, call_down_4, call_down_5, call_down_6则分别为2-6楼的下行请求信号
request_1, request_2, request_3, request_4, request_5, request_6则分别为电梯内部的停靠1-6楼的请求
上述各端口均为有请求时,输入为高电平,否则为低电平; clk分别为状态转移时钟,reset为复位信号 Output Port:
PosOut输出当前电梯所在的楼层,DoorFlag为开门标志,UpDnFlag为电梯上下标志 LiftState输出当前电梯的状态.
PosOut取值可为6'b000001,6'b000010,6'b000100,6'001000,6'b010000,6'b100000分别代表电梯处在1,2,3,4,5,6楼。这样编码的话,有利于后面的比较判断。
DoorFlag取值可为1'b0,1'b1,分别代表当前门是关闭和当前门是打开的。
UpDnFlag取值可为2'b00,2'b01,2'b10,分别代表当前电梯是上升的,下降的和静止的。 LiftState7'b0000001,7'b0000010,7'b0000100,7'b0001000,7'b0010000,7'b0100000,7'b1000000, 分别电梯处于等待模式、上升模式、下降模式、上升停止,下降停止、开门和关门等7个状态。
(2)分频模块frequence_div:
frequence_divcp_50Mcp_1inst2端口说明: Input ports: cp_50M; output ports: cp_1;
- 6 -
带液晶显示驱动的智能电梯控制器
(3)电梯状态仲裁器arbitrator:
arbitratorelevator_state[6..0]count_in[2..0]open_enablestop_enableup_enabledown_enableclose_enableinst5 端口说明: Input ports: elevator_state; count_in; output ports:
output open_enable,stop_enable,up_enable,down_enable,close_enable; (4)LCD驱动模块DE2_Default:
DE2_Defaultopen_enablestop_enableup_enabledown_enableclose_enableCLOCK_50KEYinst4LCD_ONLCD_BLONLCD_RWLCD_ENLCD_RSLCD_DATA[7..0] 端口说明: Input ports:
input open_enable,stop_enable,up_enable,down_enable,close_enable; input CLOCK_50; // 50 MHz input KEY; output ports:
inout [7:0] LCD_DATA; // LCD Data bus 8 bits output LCD_ON; // LCD Power ON/OFF output LCD_BLON; // LCD Back Light ON/OFF output LCD_RW; // LCD Read/Write Select, 0 = Write, 1 = Read output LCD_EN; // LCD Enable output LCD_RS;// LCD Command/DataSelect, 0= Command, 1 = Data
2.2 模块设计过程
现在我简要的说明一下我的模块的设计过程:
(1)电梯主控制器模块elevator_controller:
此段智能电梯控制器由三个重要部分组成的。
(a)信号并置部分,完成对5路向上请求、5路向下请求、6路内部请求的信号并置,化繁为简。
(b)三段式有限状态机部分。在有请求的情况下,电梯控制器还要根据电梯的当前状态
- 7 -
带液晶显示驱动的智能电梯控制器
和当前的楼层去判断电梯的下一步该如何运作。
(c)计数器部分。完成电梯的开门、关门的时间管理。
(2)分频模块frequence_div:
这段分频器完成对50Mhz的1分频操作。采用传统的“一半就翻转”的计数技巧。
(3)电梯状态仲裁器arbitrator:
完成电梯信号到LCD控制的信号转换。其中也采用了“电梯主控制器”中的信号并置的思想。这一点可以在我的程序中十分清楚的看到,在此我不再赘述。
(4)LCD驱动模块DE2_Default:
这个模块我是采用“ 拿来主义”的。因为是DE2板子提供的源程序,所以编写起来还算比较轻松。就只加了一个“ 根据不同的输入产生不同的输出 ”的模块。中途还遇到了字符型液晶不能更新的问题,不过在同学的帮助下,最终还是解决了。
(5)数码管译码模块:
(6)数码管时间译码模块:
以上两个模块一起讲比较合适,因为它们都是采用了同样的译码原则,只不过条件不一样而已。我们可以针对不同的输入根据自己的意愿把它译成同样的数码显示。
以上的模块设计过程说的比较的简约。主要是大概的介绍了我的各个模块的基本设计原理,希望读者能从程序中仔细体会这种原理。
2.3 波形仿真
(1)当电梯处于初始状态时,电梯在高层有向下的请求时:
- 8 -
带液晶显示驱动的智能电梯控制器
(2)LCD的显示由于数据太多,所以单独显示如下:
首先显示:“ it is static.. ” 随后会显示:
- 9 -
带液晶显示驱动的智能电梯控制器
以上的字符发送到液晶显示模块之后,可以显示“ door is rising.. ” 随后会显示:
可以显示“ it is static.. ”
以上的字符发送到液晶显示模块之后,可以显示“ door is opening.. ” 随后会显示:
- 10 -