VHDL课程设计报告
——汽车租赁系统
61009332 杨康
1. 申请题目:汽车租赁系统
n 汽车租赁系统,是一个包含汽车分配、租赁计时、查询租赁状态灯一系列功能于一体的控制系统,实现日常生活中的汽车租赁的模拟化。
2. 课题背景:
尽管小汽车普及率逐渐增高,但仍有很多的家庭没有。因而汽车租赁显得尤为必要。在此背景下,我设计了一款基于VHDL的汽车租赁控制系统,能够智能的控制汽车的租借情况。在一定程度上,推动了汽车租赁业的发展。
3. 项目规划:
n 功能:
1) 假设共有四辆不同大小的汽车以供租赁。其中1号车可容纳1~10人,2、3、 4号车可容纳的人数分别为:11~20、 21~30、 31~40人。每种型号的车各有5辆。
2) 系统可以自动判断现有条件下能否满足当前的租赁请求。
3) 系统在闲置车中根据满足人数条件的最少数量的车选择车的型号及数量,并显示在四个对应的数码管中。
4) 设置查询功能,能够查询剩余车辆。
5) 当某种类型的车全被租出,可以通过查询键查出需要等待的最短时间,若没被全部租出,等待时间设置为0。
6) 系统能够判断被租出的车是否被返回,即租赁时间倒计时是否为0。
n 面板:
键盘上出了数字键用来输入租赁的人数和时间外,还有“人数”,“时间”键用以作为人数及时间的输入开始键,“查询”键用来查询车辆返回倒计时,“租赁”键用来作为租赁的开始键,“确定”键以及“清零”键。六个数码管,其中四个显示每种车型的车辆显示,另外两个作为复用管显示时间和人数。五个LED灯,其中四个表示对应的车是否被返回,另一个表示能否租赁。具体如下:
键盘面板:
外接输出接口:
四种车的数量显示
|
人数、时间复用管
|
四种车是否返还灯
|
能否租赁显示灯
|
n 操作及工作原理:
1) 按下“重置”键,各数码管显示为零。
2) 按下“人数”键,系统自动在四个车型对应的数码管里显示各车闲置的数量(初始值均为5),输入所容纳的人数,按下“确定”,复用管显示人数,同时,系统在闲置车中根据满足人数条件的最少数量的车选择车的型号及数量,显示在各数码管中,继续按“租赁时间”,输入租赁所需时间,确定,复用管显示时间并开始倒计时进入租赁阶段。若没有满足条件的选择,LED1亮,提示系统选择失败。
3) 在系统运行过程中,可以通过“查询”键查询每种类型的车剩余的数量,并通过数字键“1”,“2”,“3”,“4”分别查询对应的类型的需要等到的时间(及租赁时间最短倒计时),若该类型的车没有被全部租出则显示等待时间为0。
4) 当某辆车等待时间倒计时为0时,四个LED灯对应号码的灯亮,显示该号码的车返还,可以被租赁出去,同时对应的数量加1。
4. 实现方案:
n 核心问题:
1) 输入状态机的合理设计。
2) 系统自动根据人数选择最合理的租赁方案。
3) 排列出每种类型车辆需要等待的最短时间。
n 解决方案:
1) 输入时间和人数状态机的设计中,我考虑到需要输入十位和个位,因此可以借助两个变量:ten_setting,one_setting,来控制输入十位和个位的顺序。因此需要额外增加两个小的状态机,输出的是ten_setting和one_setting的逻辑值。
2) 在考虑系统自动根据人数选择最合理的租赁方案的时候,我首先考虑了能否通过一个函数来达到目的,这是最省事的方案,但实际过程中发现时很困难的,因此我只好采用备用方案:即将人数分为不同的范围,在每个范围中,根据选择的两个原则从优到劣列出所有满足条件的租赁方案,用if,else语句实现系统的自动选择,在仿真的过程中发现这种方法虽然是最耗费精力的,但同时也是最难出错的方案,给我最终的调试节省了很多差错的时间。
3) 针对第三个核心问题,我同样考虑了两个方案。方案一:通过二维数组求最值。方案二:通过四个一维数组,分别求每个数组的最值。发现方案二更为适合,原因有两个:我需要分别计算出每种类型的车等待时间的最小值,显然方案二更加适合。第二个原因是一维数组相比较二位数组来说更加稳定,容易调试。
5. 系统结构:
n 系统框图:
n 模块功能描述:
人数输入状态机:通过两个变量:people_ten_setting,people_one_setting,控制输入顺序,将人数的十位和个位分别输入进控制模块。
时间输入状态机:与人数输入状态机模块功能类似,不同的是做了一个“租赁判断”,是用来判断现有的条件下能否满足租赁要求,若不能,则时间输入无效。
控制:用来完成系统的控制功能,包括:判断能否满足输入条件、自动根据人数选择最合适的租赁方案、查询剩余车辆数、最短等待时间、判断车辆是否返回等等。
输出译码:由于控制模块输出的人数和时间以及车辆数都是整数,因此需要一个译码模块将整数转化为四位BCD码,可供数码管显示。
n 模块接口标注(参数、协议):
EP1C3T144C8实验箱的输入输出的实际连线与管脚表
输入输出名称
|
芯片引脚号
|
试验箱标注
|
钉子线连接
|
Col0
|
69
|
P5
|
Col1
|
Col1
|
68
|
P6
|
Col2
|
Col2
|
67
|
P7
|
Col3
|
Col3
|
61
|
P9
|
Col4
|
clk
|
62
|
P8
|
无
|
Row0
|
60
|
P10
|
Row1
|
Row1
|
59
|
P11
|
Row2
|
Row2
|
58
|
P12
|
Row3
|
Row3
|
57
|
P13
|
Row4
|
Num10
|
73
|
P1
|
A3
|
Num11
|
72
|
P2
|
B3
|
Num12
|
71
|
P3
|
C3
|
Num13
|
70
|
P4
|
D3
|
Num20
|
56
|
P14
|
A4
|
Num21
|
55
|
P15
|
B4
|
Num22
|
54
|
P16
|
C4
|
Num23
|
53
|
P17
|
D4
|
Num30
|
52
|
P18
|
A5
|
Num31
|
51
|
P19
|
B5
|
Num32
|
50
|
P20
|
C5
|
Num33
|
42
|
P24
|
D5
|
Num40
|
41
|
P25
|
A6
|
Num41
|
40
|
P26
|
B6
|
Num42
|
39
|
P27
|
C6
|
Num43
|
38
|
P28
|
D6
|
P1
|
4
|
P37
|
LED1
|
P2
|
3
|
P38
|
LED2
|
P3
|
2
|
P39
|
LED3
|
P4
|
144
|
P40
|
LED4
|
Ten0
|
33
|
P33
|
A1
|
Ten1
|
32
|
P34
|
B1
|
Ten2
|
31
|
P35
|
C1
|
Ten3
|
5
|
P36
|
D1
|
One0
|
37
|
P29
|
A2
|
One1
|
36
|
P30
|
B2
|
One2
|
35
|
P31
|
C2
|
One3
|
34
|
P32
|
D2
|
Yes_no
|
127
|
P53
|
LED5
|
6. 状态流程图:
7. 各主要模块仿真结果波形:
这里我只列举了三个主要的模块的仿真波形图:人数状态机模块、主控制模块以及输出译码模块。波形图如下:
波形一:人数状态机模块
根据输入的bcdfk码,“1010”表示人数键,随后输入的第一个数字键“0000”,表示十位为0,此时“setting_ten”为高电平,表示此时输入的是十位,第二个输入的数字键“0011”,表示个位,此时“setting_one”为高电平
|
Setting_ten
|
Setting_one
|
波形二:主控制模块
租赁开始时的时间倒计时
|
查询键查得此时的车辆剩余数量分别为:5辆,5辆,4辆,4辆
|
系统根据输入的人数自动选择的最佳租赁方案:1辆3号车以及1辆4号车。
|
初始每种类型的车各有5辆
|
键盘输出码
|
波形三:输出译码波形
车辆(整数)
|
车辆(BCD码)
|
时间(整数)
|
时间(BCD码)
|
8. 课程设计总结:
1) 预期的目标与当前实现功能的差异详细注释
预期的功能有:人数、时间的输入、系统自动选择最佳租赁方案、查询车的数量以及最短的等待时间、判断车是否返还、人工选择、预租。而最后做成的实际效果中,没能实现人工选择以及预租的功能。
这是因为在做的过程中逐渐意识到中间的过程的复杂性,系统自动选择已经在当前条件下为租赁者选择出了最优的方案,所以并不需要租赁者人工选择,有一定的实际意义。另外,考虑到预租的功能在一定程度上破坏了主程序的完整性,并且预租所实现的车辆剩余数量的显示也可以通过增设的“查询”键来完成,所以舍弃了预租的功能。这在一定程度上有利于主程序的构建。
2) 可以进一步发挥提高的部分
在实现了大部分的功能之后,我逐渐认识到要想达到原来设定的反应现实生活中的汽车租赁系统的功能,还需要在已完成的基础上增设一些必要的功能。我做的程序在表示车辆被返回时,数码管亮,相应的数量加1,但这只是记录了租赁时间最短的那辆车是否被返回,对于其他的车辆是否返还没有时间的记录,导致了与现实生活存在很大的差距。另外可以增加每种车型的车辆数,和现实更加贴切点。
3) 课程设计体会
这次的课程设计于我来说最大的收获不是更加了解一门语言,更加重要的是在从构思模块框架到独立完成每个模块的语言编写,再到模拟仿真,以及最后的调试过程中我懂得了如何克服恐惧并坚持,朝着自己的目标前进,而不是畏缩不前。我的设计是从第九周开始的,比计划稍微落后了些,最初的编写阶段,由于对VHDL语言相当的陌生,中间纠结了很长一段时间,后来慢慢熟悉了VHDL的特点,看了很多设计的例子,才找到了对这门语言的感觉,随后的编写过程虽没有起初阶段的难熬,但也不轻松。因为VHDL和以往我学过的语言有着本质的区别,它的逻辑执行顺序不是单调的自上而下的,并序,顺序结合,这在一定程度上给我的编写带来了难度,随之产生了对这门课程设计的恐惧,逐渐产生了消极的情绪。
好在我有几个志同道合的朋友一起奋斗在编程的路上,相互探讨探讨,问题也就不再是问题了。
最初遇到的问题现在想来确实很难算是一个问题,譬如当时还为一个进程里设置了两个时钟的上升沿仿真总是出错而懊恼不已,很多当时看似无从下手的逻辑功能现在也觉得非常容易实现,只是需要花写时间把脑袋里的雏形转变为更加具体,缜密的语言框架。
整个过程除去在语言的理解上花了很多的精力外,还让我犹豫了很久的是整个模块框架的构建。最初我想简单的设置三个模块:键盘输出、主控制以及输出译码模块。但在编写主程序的时候发现中间需要考虑的问题很多,逻辑也比较混乱,这无疑增加了出错的可能性。因此我放弃的这种模块框架。随后在修修改改近一个礼拜以后,我最终确定了最后的模块框架,事实也证明了一个好的模块框架的建立对整个编写及调试过程有着非常重要的意义。也验证了那句:好的开头等于成功的一半。
总上所述,我想说的是,较好的完成一件事,技能是可以在完成的过程中学习的,并不是最重要的,想比较而言,良好的心态以及坚持,不放弃的意志力则更为重要。感谢这次的课程设计带给我的这些感悟。
9. 参考文献
1、《VHDL数字电路及系统设计》
1、《VHDL数字电路及系统设计》
江思敏 编著 --------机械工业出版社
2、《CPLD/FPGA可编程逻辑器件实用教程》
马彧 王丹利 王丽英 编著--------机械工业出版社