EDA出租车计费器课设.docx
- 文档编号:6049263
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:21
- 大小:901.49KB
EDA出租车计费器课设.docx
《EDA出租车计费器课设.docx》由会员分享,可在线阅读,更多相关《EDA出租车计费器课设.docx(21页珍藏版)》请在冰豆网上搜索。
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课程设计题目为出租车计费器系统,该系统要求能够与现实生活中的士车上的计费器实现相同的功能。
在做这个课题之前,我先进行了思考和步骤的罗列,但是还是没有考虑完善
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- EDA 出租车 计费 器课设