EDA出租车计费器课设文档格式.docx
《EDA出租车计费器课设文档格式.docx》由会员分享,可在线阅读,更多相关《EDA出租车计费器课设文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
![EDA出租车计费器课设文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/3/00afc78e-6ef9-431f-9f56-29acbab7ad68/00afc78e-6ef9-431f-9f56-29acbab7ad681.gif)
星期五:
答辩
星期六-星期天:
撰写课程设计报告
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;
行距为22。
正文的内容:
一、课题的主要功能;
二、课题的功能模块的划分(要求画出模块图);
三、主要功能的实现;
四、系统调试与仿真;
五、总结与体会;
六、附件(所有程序的原代码,要求对程序写出必要的注释);
七、评分表。
一、出租车计费系统的总体设计
1.1出租车计费设计
本系统为出租车计费系统,有计费、计里程、复位、显示等功能,当按下reset复位键(S1)后开始重新计费和计里程数(复位,计费回复为起步价,里程清空),起步价是6元/2公里,往后汽车每行使1公里计费增加1元。
在2公里内,只有计公里数增加,计费不变,当超过两公里后开始跳表。
公里数每增加100米,公里数自增0.1公里,公里数每增加1000米,计费自增1元。
(根据生活中打的的实际情况,当路程在0-1.9公里时,计费一直显示6元,当路程跳为2公里(满两公里),计费自增1,此后每次进位计费都要自增1)
1.2基本设计思想
本实验要完成的任务就是设计一个简单的出租车计费器,要求起步价是3元,开行1公里,以后1元/1公里。
时钟输入为1KHz的系统时钟,直流电机模块每转一圈输出一个脉冲信号给CPU,另外用按键模块S1来作为整个系统的复位按钮,每复位一次,计费器开始重头计费。
直流电机模块用来模拟出租车的车轮子,每转动一圈认为是行走1米,所以每旋转1000圈,认为车子前进1公里。
系统设计是需要检测电机的转动情况,每转一周,计米计数器增加1。
直流电机每转一圈输出一个脉冲(pulse)信号(但由于本人使用的箱子有问题,故用clk时钟代替pulse脉冲),用按键S1来作为整个系统的复位按钮(reset),每按下复位键,计费器从头开始计费,里程数清零。
脉冲pulse每转1000圈视为汽车行走了1公里,本人以0.1公里为单位进行程序编写。
每当pulse上升时,进行计数信号count自增1,当count到达99时,就会在下一次判断时进入里程数和计费数的增加,公里数每增加100米,公里数自增0.1公里,在两公里以前,需要作出判断,计费应该保持6元起步价不变,当2公里以后(根据打的的实际情况,包括2公里),公里数每增加1000米(每进一位),计费自增1元。
显示也是本系统的重要步骤,我通过clk时钟和信号move8控制数码管的移位,clk每上升一次,move8移动一位,再用两个case语句控制选段和输出显示。
每当clk上升,控制数码管的信号就会移动一位,再通过第一个case语句
锁定移动到的需要显示的数码管,然后通过第二个case语句将对应数码管上所需要显示的值(money0-3,kilometre0-3)显示在数码管上,disp7-0分别对应数码管上的小数点、gfedcba。
二、出租车计费系统的功能实现
2.1系统的总体框图
该系统由计费、记里程、脉冲、选段、显示几个部分组成,为了尽可能减少竞争与冒险,本人将该系统写入了一个进程中,在这一个进程中,计费和里程都由pulse脉冲来决定是否增加,显示部分则有clk上升后的不断扫描显示,系统总体框图如下:
2.2程序流程图
1.脉冲流程图
Y
NN
Y
N
Y
2.计费、计里程流程图
NY
N
N
NY
Y
N
N
3.显示流程图
YN
2.3系统各功能模块的实现
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitytaxiis--实体,设置输入、输出
port(reset:
instd_logic;
pulse:
--脉冲,转1圈为1米,控制计费、计里程
clk:
--时钟,控制显示
sel:
outstd_logic_vector(7downto0);
--选择数码管
disp:
--选择发光数字
money_0:
outstd_logic_vector(3downto0);
--输出四位费用
money_1:
money_2:
money_3:
kilometre_0:
--输出四位里程,其中一位为小数
kilometre_1:
kilometre_2:
kilometre_3:
outstd_logic_vector(3downto0));
endentitytaxi;
architecturefunctionsoftaxiis--结构体
signalcount:
integerrange0to100;
--计脉冲数,每100次0.1公里清零1次
signalmoney0:
std_logic_vector(3downto0);
signalmoney1:
signalmoney2:
signalmoney3:
signalkilometre0:
signalkilometre1:
signalkilometre2:
signalkilometre3:
signalmove8:
std_logic_vector(2downto0);
--控制数码管选位,不断移动
signala:
--接收计费、计里程数,控制数码管显示
signalb:
std_logic;
--控制公里数第二位的小数点显示
begin
process(pulse,reset,clk)--进程,三个敏感信号
begin
ifreset='
0'
then--reset=‘0’,复位
kilometre0<
="
0000"
;
kilometre1<
kilometre2<
kilometre3<
money0<
0110"
money1<
money2<
money3<
elsifpulse'
eventandpulse='
1'
then--否则,当脉冲小于或大于等于100次时
ifcount<
100thencount<
=count+1;
elsifkilometre0<
9then--公里第一位小于9,第一位加1
kilometre0<
=kilometre0+"
0001"
kilometre1<
=kilometre1;
kilometre2<
=kilometre2;
kilometre3<
=kilometre3;
count<
=0;
--只要进入以下判断,都会清零,重新计数
elsifkilometre1<
9andkilometre0=9then--当第一位等于9,第二位小于9
=kilometre1+"
ifkilometre1>
0orkilometre2>
0orkilometre3>
0then
--当第二位大于2时或更高位不为0时(大于2公里),开始计费
--由于计程车都是在新进一公里时就跳表,所以在低位为9时就
--要加钱,如2.1公里时计费就应该显示6+1=7元,以下相同代码
--均表示相同的意思
ifmoney0<
9thenmoney0<
=money0+"
elsemoney0<
ifmoney1<
9thenmoney1<
=money1+"
elsemoney1<
ifmoney2<
9thenmoney2<
=money2+"
elsemoney2<
ifmoney3<
9thenmoney3<
=money3+"
elsemoney3<
endif;
endif;
elsifkilometre2<
9andkilometre1=9andkilometre0=9then--当前两位为9,第
--三位小于9时
=kilometre2+"
ifmoney0<
elsemoney0<
ifmoney1<
elsemoney1<
ifmoney2<
elsemoney2<
ifmoney3<
elsemoney3<
elsifkilometre3<
9andkilometre2=9andkilometre1=9andkilometre0=9then
--当前三位均为9,第四位小于9时
=kilometre3+"
elsifkilometre3=9andkilometre2=9andkilometre1=9andkilometre0=9then
--当四位均为9时,清零
endif;
endif;
ifclk'
eventandclk='
then--时钟控制显示,每上升一次,move8移动一次
move8<
=move8+1;
casemove8is--用case选择开启哪一个数码管,随着clk的变化不
--断扫描片选,通过a输送需要显示的数据,通过b
--判断是否需要需要输出小数点(只有公里第二位需
--要加小数点,其他位均不需要)第8位对应显示m
--oney0的数据,不需要小数点,以下代码以此类推
when"
000"
=>
sel<
10000000"
a<
=money0;
b<
='
when"
001"
01000000"
=money1;
010"
00100000"
=money2;
011"
00010000"
=money3;
100"
00001000"
=kilometre0;
101"
00000100"
110"
00000010"
b<
111"
00000001"
endcase;
ifb='
then--当需要显示的是公里的第二位时(个位),需要小数点
--将a送入的数据通过数码管显示
caseais
when"
disp<
10111111"
--0.
10110000"
--1.
0010"
11011011"
--2.
0011"
11001111"
--3.
0100"
11100110"
--4.
0101"
11101101"
--5.
11111101"
--6.
0111"
10000111"
--7.
1000"
11111111"
--8.
1001"
11101111"
--9.
whenothers=>
null;
else--当需要显示的是其他位数据时,不需要小数点
caseais
00111111"
--0
00110000"
--1
01011011"
--2
01001111"
--3
01100110"
--4
01101101"
--5
01111101"
--6
00000111"
--7
01111111"
--8
01101111"
--9
endprocess;
money_0<
--输出
money_2<
=money2;
money_1<
money_3<
kilometre_0<
kilometre_1<
kilometre_2<
kilometre_3<
endarchitecturefunctions;
--结束
三、系统调试与仿真
实验编写和仿真环境:
QuartusII9.0(64-Bit)/Windows7(64-Bit)
1.编写程序和编译:
程序编写完成后,成功通过编译。
2.参数设置:
设置endtime为10s,设置pulse为1ms,设置clk为100ms。
3.设置复位:
在仿真后观察复位是否有效,若复位无效则可能是代码有错误。
4.仿真:
从大体图可以看出,0-1.9公里时,计费为起步价2元,没有出现跳表的情况当公里数跳到2.0公里时,计费跳表为7元,此后公里数每加1,计费跳表一次。
下图为当公里数到达5公里时,计费显示为10元,计费器进位,公里进位和计费进位均可正常实现。
将endtime设置为100s后观察,各项结果也是正确无误的。
5.执行复位:
当reset置为‘0’时复位,里程数清零,计费器调回起步价6元。
6.选位sel:
通过clk时钟上升控制move8不断移位,不断扫描,通过case语句来控制sel的值,决定哪一位数码管亮,并同时将所要显示的内容赋给a,a在下一个case语句中作为判断条件控制显示什么数字。
通过仿真结果可以看出,sel可以正常工作,不断地从sel7扫描到sel0;
美中不足的是依然存在一些毛刺,但是通过接入工具箱看到的实际情况是,该毛刺不会影响系统正常运行,无混乱跳表的情况出现。
7.控制显示disp:
将上一个case语句中的a(存放计费、计公里数)作为下一个case的判断条件,通过不断扫描来显示各个数码管上所要显示的数字。
由下图可以得知,在0-335.544ms之间,disp显示的数值为“”、“”,数码管转化为所需要显示的数字则为6、0,对应上个截图中sel选位,sel正好在sel7时显示为6,sel5-6时,为0,可见数码管中只有计费的第一位为6,其余位数均为0,可见当前正在起步价(初始)状态,当1.342s左右,disp7为1,说明扫描到了计公里数的个位(表面该位带小数点),对应上图sel2,sel2正好是控制公里数个位,所以也符合要求,当选到其他位数码管时,disp7均为0,都满足要求,虽然disp内也存在毛刺,但是并没有影响实验的实际运行效果。
四、总结与体会
本周我们进行了EDA的课程设计,感受了VHDL语言编程的方法和技巧,在这几天的学习时间里,我感受到了VHDL语言和其他编程语言的不同,通过独立完成课程设计,使我更加熟悉了该语言,了解了该语言方面的知识,纠正了在学习过程中经常犯的一些问题和逻辑思维上的错误,这一次的课程设计让我受益匪浅。
EDA是电子设计自动化(ElectronicdesignAutomation)的缩写,EDA是一门用途广泛的学科,它以计算机为工具,在EDA平台上用VHDL语言完成设计仿真下载,通过这门学科,我们可以把我们的思想转化为现实,所以学好EDA这门课程是非常重要的。
本次我的EDA课程设计题目为出租车计费器系统,该系统要求能够与现实生活中的士车上的计费器实现相同的功能。
在做这个课题之前,我先进行了思考和步骤的罗列,但是还是没有考虑完善