EDA出租车计费器课设文档格式.docx

上传人:b****6 文档编号:19045555 上传时间:2023-01-03 格式:DOCX 页数:21 大小:901.49KB
下载 相关 举报
EDA出租车计费器课设文档格式.docx_第1页
第1页 / 共21页
EDA出租车计费器课设文档格式.docx_第2页
第2页 / 共21页
EDA出租车计费器课设文档格式.docx_第3页
第3页 / 共21页
EDA出租车计费器课设文档格式.docx_第4页
第4页 / 共21页
EDA出租车计费器课设文档格式.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

EDA出租车计费器课设文档格式.docx

《EDA出租车计费器课设文档格式.docx》由会员分享,可在线阅读,更多相关《EDA出租车计费器课设文档格式.docx(21页珍藏版)》请在冰豆网上搜索。

EDA出租车计费器课设文档格式.docx

星期五:

答辩

星期六-星期天:

撰写课程设计报告

附:

课程设计报告装订顺序:

封面、任务书、目录、正文、评分、附件(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课程设计题目为出租车计费器系统,该系统要求能够与现实生活中的士车上的计费器实现相同的功能。

在做这个课题之前,我先进行了思考和步骤的罗列,但是还是没有考虑完善

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1