EDA出租车计费器课设.docx

上传人:b****6 文档编号:6049263 上传时间: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

EDA出租车计费器课设

课程设计报告

课程名称EDA技术

课题名称出租车计费系统

专业通信工程

班级

学号

姓名

指导教师

2015年月日

湖南工程学院

课程设计任务书

 

课程名称EDA技术

课题出租车计费系统

 

专业班级

学生姓名

学号

指导老师

审批

 

任务下达日期2015年月日

任务完成日期2015年月日

《数字系统与逻辑设计》课程设计任务书

一、设计目的

全面熟悉、掌握VHDL语言基本知识,掌握利用VHDL语言对常用的的组合逻辑电路和时序逻辑电路编程,把编程和实际结合起来,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用设计综合电路的能力,养成提供文档资料的习惯和规范编程的思想。

二、设计要求

1、设计正确,方案合理。

2、程序精炼,结构清晰。

3、设计报告5000字以上,含程序设计说明,用户使用说明,源程序清单及程序框图。

4、上机演示。

5、有详细的文档。

文档中包括设计思路、设计仿真程序、仿真结果及相应的分析与结论。

三、进度安排

第十七周星期二课题讲解,查阅资料

 星期三总体设计,详细设计

星期四编程,上机调试、修改程序

星期五:

答辩

星期六-星期天:

撰写课程设计报告

附:

课程设计报告装订顺序:

封面、任务书、目录、正文、评分、附件(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.计费、计里程流程图

Y

NY

 

N

N

NY

Y

 

Y

Y

N

Y

N

N

3.显示流程图

 

N

 

Y

 

YN

 

2.3系统各功能模块的实现

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_unsigned.all;

entitytaxiis--实体,设置输入、输出

port(reset:

instd_logic;

pulse:

instd_logic;--脉冲,转1圈为1米,控制计费、计里程

clk:

instd_logic;--时钟,控制显示

sel:

outstd_logic_vector(7downto0);--选择数码管

disp:

outstd_logic_vector(7downto0);--选择发光数字

money_0:

outstd_logic_vector(3downto0);--输出四位费用

money_1:

outstd_logic_vector(3downto0);

money_2:

outstd_logic_vector(3downto0);

money_3:

outstd_logic_vector(3downto0);

kilometre_0:

outstd_logic_vector(3downto0);--输出四位里程,其中一位为小数

kilometre_1:

outstd_logic_vector(3downto0);

kilometre_2:

outstd_logic_vector(3downto0);

kilometre_3:

outstd_logic_vector(3downto0));

endentitytaxi;

architecturefunctionsoftaxiis--结构体

signalcount:

integerrange0to100;--计脉冲数,每100次0.1公里清零1次

signalmoney0:

std_logic_vector(3downto0);

signalmoney1:

std_logic_vector(3downto0);

signalmoney2:

std_logic_vector(3downto0);

signalmoney3:

std_logic_vector(3downto0);

signalkilometre0:

std_logic_vector(3downto0);

signalkilometre1:

std_logic_vector(3downto0);

signalkilometre2:

std_logic_vector(3downto0);

signalkilometre3:

std_logic_vector(3downto0);

signalmove8:

std_logic_vector(2downto0);--控制数码管选位,不断移动

signala:

std_logic_vector(3downto0);--接收计费、计里程数,控制数码管显示

signalb:

std_logic;--控制公里数第二位的小数点显示

begin

process(pulse,reset,clk)--进程,三个敏感信号

begin

ifreset='0'then--reset=‘0’,复位

kilometre0<="0000";

kilometre1<="0000";

kilometre2<="0000";

kilometre3<="0000";

money0<="0110";

money1<="0000";

money2<="0000";

money3<="0000";

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

kilometre0<="0000";

kilometre1<=kilometre1+"0001";

kilometre2<=kilometre2;

kilometre3<=kilometre3;

count<=0;

ifkilometre1>0orkilometre2>0orkilometre3>0then

--当第二位大于2时或更高位不为0时(大于2公里),开始计费

--由于计程车都是在新进一公里时就跳表,所以在低位为9时就

--要加钱,如2.1公里时计费就应该显示6+1=7元,以下相同代码

--均表示相同的意思

ifmoney0<9thenmoney0<=money0+"0001";

elsemoney0<="0000";

ifmoney1<9thenmoney1<=money1+"0001";

elsemoney1<="0000";

ifmoney2<9thenmoney2<=money2+"0001";

elsemoney2<="0000";

ifmoney3<9thenmoney3<=money3+"0001";

elsemoney3<="0000";

endif;

endif;

endif;

endif;

endif;

elsifkilometre2<9andkilometre1=9andkilometre0=9then--当前两位为9,第

--三位小于9时

kilometre0<="0000";

kilometre1<="0000";

kilometre2<=kilometre2+"0001";

kilometre3<=kilometre3;

count<=0;

ifmoney0<9thenmoney0<=money0+"0001";

elsemoney0<="0000";

ifmoney1<9thenmoney1<=money1+"0001";

elsemoney1<="0000";

ifmoney2<9thenmoney2<=money2+"0001";

elsemoney2<="0000";

ifmoney3<9thenmoney3<=money3+"0001";

elsemoney3<="0000";

endif;

endif;

endif;

endif;

elsifkilometre3<9andkilometre2=9andkilometre1=9andkilometre0=9then

--当前三位均为9,第四位小于9时

kilometre0<="0000";

kilometre1<="0000";

kilometre2<="0000";

kilometre3<=kilometre3+"0001";

count<=0;

ifmoney0<9thenmoney0<=money0+"0001";

elsemoney0<="0000";

ifmoney1<9thenmoney1<=money1+"0001";

elsemoney1<="0000";

ifmoney2<9thenmoney2<=money2+"0001";

elsemoney2<="0000";

ifmoney3<9thenmoney3<=money3+"0001";

elsemoney3<="0000";

endif;

endif;

endif;

endif;

elsifkilometre3=9andkilometre2=9andkilometre1=9andkilometre0=9then

--当四位均为9时,清零

kilometre0<="0000";

kilometre1<="0000";

kilometre2<="0000";

kilometre3<="0000";

count<=0;

ifmoney0<9thenmoney0<=money0+"0001";

elsemoney0<="0000";

ifmoney1<9thenmoney1<=money1+"0001";

elsemoney1<="0000";

ifmoney2<9thenmoney2<=money2+"0001";

elsemoney2<="0000";

ifmoney3<9thenmoney3<=money3+"0001";

elsemoney3<="0000";

endif;

endif;

endif;

endif;

endif;

endif;

ifclk'eventandclk='1'then--时钟控制显示,每上升一次,move8移动一次

move8<=move8+1;

endif;

casemove8is--用case选择开启哪一个数码管,随着clk的变化不

--断扫描片选,通过a输送需要显示的数据,通过b

--判断是否需要需要输出小数点(只有公里第二位需

--要加小数点,其他位均不需要)第8位对应显示m

--oney0的数据,不需要小数点,以下代码以此类推

when"000"=>sel<="10000000";a<=money0;b<='0';

when"001"=>sel<="01000000";a<=money1;b<='0';

when"010"=>sel<="00100000";a<=money2;b<='0';

when"011"=>sel<="00010000";a<=money3;b<='0';

when"100"=>sel<="00001000";a<=kilometre0;b<='0';

when"101"=>sel<="00000100";a<=kilometre1;b<='1';

when"110"=>sel<="00000010";a<=kilometre2;b<='0';

when"111"=>sel<="00000001";a<=kilometre3;b<='0';

endcase;

ifb='1'then--当需要显示的是公里的第二位时(个位),需要小数点

--将a送入的数据通过数码管显示

caseais

when"0000"=>disp<="10111111";--0.

when"0001"=>disp<="10110000";--1.

when"0010"=>disp<="11011011";--2.

when"0011"=>disp<="11001111";--3.

when"0100"=>disp<="11100110";--4.

when"0101"=>disp<="11101101";--5.

when"0110"=>disp<="11111101";--6.

when"0111"=>disp<="10000111";--7.

when"1000"=>disp<="11111111";--8.

when"1001"=>disp<="11101111";--9.

whenothers=>null;

endcase;

else--当需要显示的是其他位数据时,不需要小数点

caseais

when"0000"=>disp<="00111111";--0

when"0001"=>disp<="00110000";--1

when"0010"=>disp<="01011011";--2

when"0011"=>disp<="01001111";--3

when"0100"=>disp<="01100110";--4

when"0101"=>disp<="01101101";--5

when"0110"=>disp<="01111101";--6

when"0111"=>disp<="00000111";--7

when"1000"=>disp<="01111111";--8

when"1001"=>disp<="01101111";--9

whenothers=>null;

endcase;

endif;

endprocess;

money_0<=money0;--输出

money_2<=money2;

money_1<=money1;

money_3<=money3;

kilometre_0<=kilometre0;

kilometre_1<=kilometre1;

kilometre_2<=kilometre2;

kilometre_3<=kilometre3;

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