EDA出租车计价器的设计.docx
《EDA出租车计价器的设计.docx》由会员分享,可在线阅读,更多相关《EDA出租车计价器的设计.docx(20页珍藏版)》请在冰点文库上搜索。
EDA出租车计价器的设计
EDA技术课程设计任务书
一、设计题目、内容及要求
题目:
出租车计价器设计
内容及要求:
设计任务:
设计一种出租车计价器,计费标准如下
(1)起步价为元,起步公里为3公里;
(2)超过3公里,每公里按元收费;
(3)单程行驶里程超过20公里,每公里租价加收50%;
(4)等候时间累积1分钟,则每分钟这算1公里里程价。
要求显示里程、计费及等候时间。
乘客上车后,按下启动键,开始计费,除非同一乘客往返用那个车,否则按下单程键,这样行驶里程超过20公里时,每公里加收50%,既每公里租费元;计费显示为3位整数、1位小数。
二、设计原始资料
三、要求的设计成果(课程设计说明书、设计实物、图纸等)
1.设计说明书:
内容包括设计背景、设计原理、仿真结果分析、设计总结。
2.硬件调试:
要求学生对设计进行硬件调试,调试平台为EDA实验室的实验箱。
四、进程安排
周1-3进行总体设计,进行各模块的程序设计、仿真及硬件调试。
周4-5进行说明书撰写及答辩。
五、主要参考资料
1.潘松,黄继业.《EDA技术实用教程》.科学出版社,.
2.刘江海.《EDA技术课程设计》.华中科技大学出版社,.
指导教师(签名):
教研室主任(签名):
注:
能够附页
1概述1
2整体设计2
设计要求2
设计思路2
设计流程图2
整体设计封装图4
各信号说明4
3模块设计5
秒分频模块5
操纵模块5
计量模块5
计价部份5
计时部份5
计程部份5
译码显示模块5
4程序调试运行6
5硬件验证8
引脚锁定8
硬件验证情形8
6总结及体会9
参考文献10
附录(程序源代码)11
1概述
随着我国国民经济生产总值的增加和人民生活水平的提高,各大中小城市的出租车营运事业进展迅速,出租车已经成为人们日常出行选择较为一般的交通工具。
出租车计价器是出租车营运收费的专用智能化仪表,是使出租车市场标准化、标准化的重要设备。
一种功能完备,简单易用,计量准确的出租车计价器是增强出租车行业治理,提高效劳质量的必需品。
本设计采纳VHDL硬件描述语言作为设计手腕,采纳自顶向下的设计思路,取得一种出租车计价系统的软件结构,通过QuartusⅡ软件下进行仿真,证明所设计的电路系统完成了出租车计价的功能,各项指标符合设计要求。
该设计尽管功能简单,智能化水平比较低,但仍具有必然的有效性。
该设计是在VHDL的基础上对出租车计价器进行设计来实现其大体功能的,与以往的基于单片机的数模混合电路相较,FPGA具有稳固性好、抗干扰能力强、电路实现简单、程序简单等优势,且超级适合做为出租车计价器的操纵核心,因此选择用VHDL来对计价器进行设计来实现其功能。
出租车计价器的实现将大大改善人们出行时因为讨价还价而带来的苦恼,从而令人们的心情比较愉悦。
本设计是对出租车计价器的四个模块进行分析的,综述如下:
分频模块:
分频模块是其它模块的基础,输入时钟选为32Hz,分频后的时钟频率为1Hz,为后续模块提供大体时钟。
等待时刻模块:
该模块针对乘客确认下车前的等待而言,比如堵车、半途下车的情形,通过1Hz脉冲计数,每一分钟计时加一,最大计不时刻显示为99分钟。
路程模块:
该模块是对车辆行驶路程进行计数,以1Hz时钟为基础,检测行程脉冲,路程模块中有内部变量来判定路程,当大于3千米、20千米时,别离有相应的使能信号对此作出记录,最大路程显示为99千米。
计费模块:
该模块是基于等待时刻模块和路程模块对费用进行操纵的。
通过内部使能信号别离计算3千米之内、3-20千米和20千米以后的费用。
本设计是基于VHDL进行编程,然后在QuartusⅡ进行波形仿真,实现出租车计价器的大体功能。
2整体设计
设计要求
(1)起步价为元,起步千米为3千米;
(2)超过3千米,每千米按1元收费;
(3)单程行驶里程超过20千米,每千米租价加收50%;
(4)等候时刻超过1分钟,每分钟按这千米的租价计算。
要求显示里程、计费及等候时刻。
乘客上车后,按下启动键,开始计费,除非同一乘客来回用那个车,不然按下单程键,如此行驶里程超过20千米时,每千米加收50%,既每千米租费元;计费显示为3位整数、1位小数。
设计思路
输入2个时钟信号,别离模拟时刻和路程。
对等待时刻、路程计数,进而统计费用。
系统结构框图如图2-1。
显示
分频器
计费
时钟信号
等待信号
公里脉冲
计费/复位
控制器
计程
计时
图2-1自动计价器的系统方框图
上图中,计数器1对分频后的1Hz脉冲计数,计数60次,计数器加1,对应等待时刻,计数器2对车速脉冲计数,其上升沿到来计数加1,对应里程。
设计流程图
设计流程图如图2-2所示。
开始
初始化
单程?
里程>3
里程>20
元/公里
1元/公里
等待?
等待?
元/分钟
1元/分钟
计费
N
Y
Y
Y
N
Y
Y
N
N
图2-2系统设计流程图
分频
里程计数
时间计数
时间计数
N
乘客上车后,按下启动按钮,计价器开始工作,第一进入初始化状态,即计程从0开始,计费从8开始。
再依照单程信号判定是不是为单程,进而确信计费方式。
单程:
里程计数器开始计数,当路程超过3千米时,计费开始累加,按1元每千米计算,路程超过20千米时每千米元。
当路程超过3千米有等待时,按劣等待信号,每等待1分钟费用与当前计费方式相同。
来回:
每千米1元,等待计费为每分钟1元。
乘客下车后,按下复位键,那么所有计数器进入初始状态。
整体设计封装图
整体设计封装图如图2-3所示。
图2-3系统封装图
各信号说明
输入信号:
clk:
系统时钟信号;
mile:
车速时钟;
start:
:
启动信号,当start=1时,出租车启动,计数器开始计数;不然计数器停止计数;
single:
单程信号,单程时由司机输入;
stop:
等待信号,处于等待状态时由司机输入;
输出信号:
km1,km2:
里程,单位为千米;
min1,min2:
等待时刻,单位为分钟;
price1,price2,price3,price4:
费用,单位为元,其中price1表示小数位。
3模块设计
秒分频模块
秒分频模块对频率为240Hz的输入脉冲进行分频,取得的频率为16Hz,15Hz和1Hz的三种频率。
该模块产生频率信号用于计费,每一个1HZ脉冲为元计费操纵,15HZ信号为元的计费操纵,16Hz信号为元计费操纵。
操纵模块
操纵模块是系统的核心部份,对计价器的状态进行操纵。
计量模块
计量模块完成计价、计时、计程功能。
计价部份
行程3千米内,起步费为8元;3千米外以每千米1元计费,等待累计时刻1分钟外以每分钟1元计费。
20千米外以每千米元计费,等待累计时刻1分钟外以每分钟元计费。
计费数据送入显示译码模块进行译码,最后送至以百元、十元、元、角为单位对应的数码管上显示。
计时部份
计时部份用于计算乘客的等待累计时刻。
计时器的量程为59分,满量程自动归零。
即时数据送入显示译码模块进行译码,最后送至以分为单位对应的数据管上显示。
计程部份
计程部份用于计算乘客所行使的千米数。
计程器的量程为99千米,满量程自动归零。
计程数据送入显示译码模块进行译码,最后送至以千米为单位对应的数据管上显示。
译码显示模块
译码显示模块完成计价、计时、计程数据显示。
该模块通过8选1选择器将计费数据(4位BCD码)、计时数据(2位BCD码)、计程数据(2位BCD码)动态选择输出。
其中计费数据送入显示译码模块进行译码,最后送至百元、十元、元、角为单位对应的数码管上显示,最大显示为元;计时数据送入显示译码模块进行译码,最后送至分为单位对应的数码管上显示,最大显示为99分钟;计程数据送入显示译码模块进行译码,最后送至以千米为单位的数码管上显示,最大显示为99千米。
4程序调试运行
图4-1单程行驶示用意
启动键、单程键有效,由图4-1可知,3千米之内计费显示为8元;3-20千米之间每千米1元累计;超过20千米每千米元累计。
图4-2单程行驶半途等待示用意
启动键、单程键有效,行驶一段时刻等待信号有效,等待后继续行驶。
由图4-2可知,3千米之内计费显示8元,3-20千米之间每千米1元累加,中间等待信号有效,每等待一分钟按现在每千米的费用计算,里程计数器停止计数,等待时刻到,里程计数器继续计数。
图4-3单程行驶抵达目的地示用意
启动键、单程键有效,乘客抵达目的地下车。
如图4-3所示。
图4-4双程行驶示用意
启动键有效,乘客搭车完成双程行驶。
由图4-4可知,3千米之内计费显示为8元;3-20千米之间每千米1元累计;超过20千米每千米1元累计。
5硬件验证
引脚锁定
做硬件验证之前需要清楚实验板上各键与各信号的链接情形,参照资料得出本设计中各引脚的对应情形如下,本设计下载时选择模式5。
引脚锁定如图5-1。
图5-1引脚锁定图
硬件验证情形
做好引脚锁定后,打开硬件箱的电源,数码管有正确的数字显示,链接硬件箱与运算机开始验证。
操作运行实验结果完全符合要求。
通过仿真验证说明,本文所设计的出租车计价器能够正常地显示行驶的里程数和乘客应付的费用,符合预定的计费标准和功能要求。
6总结及体会
通过为期一周的课程设计,出租车计价器系统的设计已大体完成,能按预期的成效模拟汽车启动、等待、停止、复位等功能,并显示车费数量等待时刻及行驶路程。
出租车计费系统的设计中表现了VHDL覆盖面广,描述能力强,是一个多层次的硬件描述语言及CPLD器件速度快,利用方便,便于修改等特点,本设计在有效方面具有必然的价值。
在本次设计中还存在很多不足,能够改良的地址目前有以下几点:
一、该设计尽管实现了大体的计费和计程,可是很多问题并无解决,如本设计只实现了一种车速的计费。
假设要实现出租车的不同档位下的计程计费,还需要进一步讨论。
二、该设计智能化水平较低,启动、等待、复位等信号需要人为输入,假设在实际中显现操作误差,会致使计费不准确。
通过这次课程设计,咱们更进一步的深切了解了VHDL设计语言,并在利用进程中对它有了更深的体会。
对编程进程中可能碰到的问题有了必然的了解和解决方式,在理论学习和编程练习和硬件测试方面都取得了较大的收成,关于尔后进行程序设计有专门大的帮忙。
期间要感激我的教师的悉心指导和同窗们的大力帮忙。
在这次设计进程中确实碰到了很多困难,可是再大的困难只要有勇气去征服它,那就不是什么困难了。
另外,通过本次课程设计,我还有了必然的对学习上的体会,知识的真实魅力实际上是在于它因为应用于实践中而产生的实际的生产价值,或说是给人们带来的庞大的方便,因为它有效了因此咱们学起来会更有动力,更能往深里去研究。
参考文献
[1]VoleiA.Pedroni.《VHDL数字电路设计教程》.电子工业出版社,2020.
[2]潘松,黄继业.《EDA技术有效教程》.科学出版社,.
[3]刘江海.《EDA技术课程设计》.华中科技大学出版社,.
[3]鲍可进,赵念强,赵不贿等.《数字逻辑电路设计》.清华大学出版社,2004.
[4]王道宪,贺名臣,刘伟.《VHDL电路设计技术》.国防工业出版社,2004.
[5]黄仁欣.《EDA技术有效教程》.清华大学出版社,2006.
[6]徐向民.《数字系统设计及VHDL实践》.机械工业出版社,2007.
附录(程序源代码)
出租车计价器源程序
libraryieee;
usehuis
port(clk:
instd_logic;
start,single:
instd_logic;
stop,mile:
instd_logic;
min1,min2:
outstd_logic_vector(3downto0);
km1,km2:
outstd_logic_vector(3downto0);
price1,price2,price3,price4:
outstd_logic_vector(3downto0));
end;
architecturebhvofhuis
signalstart_r:
std_logic;
signalclk1hz:
std_logic;
signalq:
integerrange0to299;
signalsecond:
integerrange0to59;
signalp1,p2,p3,p4:
std_logic_vector(3downto0);
signalk1,k2:
std_logic_vector(3downto0);
signalm1,m2:
std_logic_vector(3downto0);
signalen0,en1,f_wait,f:
std_logic;
begin
min1<=m1;min2<=m2;
km1<=k1;km2<=k2;
price1<=p1;price2<=p2;
price3<=p3;price4<=p4;
U1:
process(clk)
begin
if(clk'eventandclk='1')then
ifq=255then
q<=0;
clk1hz<='1';
else
q<=q+1;
clk1hz<='0';
endif;
endif;
endprocess;
U2:
process(clk1hz)
begin
ifstart='0'then
f_wait<='0';
m1<="0000";
m2<="0000";
elsif(clk1hz'eventandclk1hz='1')then
ifstop='1'then
ifsecond=6then
second<=0;
f_wait<='1';
ifm1="1001"then
m1<="0000";
ifm2="0101"then
m2<="0000";
else
m2<=m2+'1';
endif;
else
m1<=m1+'1';
endif;
else
f_wait<='0';
second<=second+1;
endif;
else
f_wait<='0';
endif;
endif;
endprocess;
U3:
process(clk1hz)
begin
if(clk1hz'eventandclk1hz='1')then
start_r<=start;
endif;
endprocess;
f<=f_waitwhenstop='1'else
milewhenen0='1'else
'0';
U4:
process(start,mile)
begin
ifstart='0'then
k1<="0000";k2<="0000";
en0<='0';en1<='0';
elsif(mile'eventandmile='1')then
ifstop='0'then
ifk1="1001"then
k1<="0000";
ifk2="1001"then
k2<="0000";
else
k2<=k2+'1';
endif;
else
k1<=k1+'1';
endif;
ifk1="0011"then
en0<='1';
endif;
ifk2="0001"andk1="1001"andsingle='1'then
en1<='1';
endif;
else
k1<=k1;
k2<=k2;
endif;
endif;
endprocess;
U5:
process(start,f)
begin
ifstart='0'then
p1<="0000";
p2<="0000";
p3<="0000";
p4<="0000";
elsifstart='1'andstart_r='0'then
p1<="0000";
p2<="1000";
p3<="0000";
p4<="0000";
elsif(f'eventandf='1')then
ifen1='0'then
ifp2="1001"then
p2<="0000";
ifp3="1001"then
p3<="0000";
ifp4="1001"then
p4<="0000";
else
p4<=p4+'1';
endif;
else
p3<=p3+'1';
endif;
else
p2<=p2+'1';
endif;
else
if(p1="0101"andp2="1000")orp2="1001"then
if(p2="1001"andp1="0101")then
p1<="0000";
p2<="0001";
elsif(p2="1001"andp1="0000")then
p1<="0101";
p2<="0000";
elsif(p2="1000"andp1="0101")then
p1<="0000";
p2<="0000";
endif;
ifp3="1001"then
p3<="0000";
ifp4="1001"then
p4<="0000";
else
p4<=p4+'1';
endif;
else
p3<=p3+'1';
endif;
elsifp1="0000"then
p1<="0101";
p2<=p2+'1';
else
p1<="0000";
p2<=p2+"0010";
endif;
endif;
endif;
endprocess;
endbhv;