基于FPGA的出租车计价器设计.docx
- 文档编号:6041628
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:11
- 大小:131.41KB
基于FPGA的出租车计价器设计.docx
《基于FPGA的出租车计价器设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的出租车计价器设计.docx(11页珍藏版)》请在冰豆网上搜索。
基于FPGA的出租车计价器设计
郑州交通职业学院
《CPLD/FPGA应用》课程设计报告
课程设计题目:
基于FPGA的出租车计价器设计
所属系别信息工程系
专业班级11大专电子信息工程技术1班
姓 名胡兴凯
学 号1106020126
指导教师朱永琴
撰写日期2012年6月
一、设计任务与要求
1、本课题要求设计车租车自动计价器,能基本实现自动计价的功能
2、本出租车计价器的计费系统:
行程3公里内,且等待累计时间2分钟内,起步费为10元;3公里外以每公里1.6元计费,等待累计时间2分钟外以每分钟1.5元计费。
并能显示行驶公里数、等待累计时间、总费用。
设计的主要技术指标如下:
①、计价范围:
0~999.9元计价分辨率:
0.1元
②、计程范围:
0~99公里计程分辨率:
1公里
③、计时范围:
0~59分计时分辨率:
1分
二、方案设计与论证
出租车的一般计费过程为:
出租车载客后,启动计费器,整个系统开始运行,里程计数器从0开始计数,费用计数器从9开始计算;出租车载客中途等待,等待时间计数器从0开始计数。
最后根据行驶里程或停止等待的时间的计费标准计费。
出租车到达目的地停止后,停止计费器,显示总费用。
根据出租车计费器的工作过程,本系统采用分层次、分模块的方式设计,其FPGA内部具体框图如下所示。
(1)分频模块:
分频模块是其它模块的基础,输入时钟选为32Hz,分频后的时钟频率为1Hz,为后续模块提供基本时钟。
(2)等待时间模块:
该模块针对乘客确认下车前的等待而言,比如堵车、中途下车的情况,通过1Hz脉冲计数,每一分钟计时加一,最大计时时间显示为99分钟。
(3)路程模块:
该模块是对车辆行驶路程进行计数,以1Hz时钟为基础,检测行程脉冲,路程模块中有内部变量来判断路程,当大于3公里、20公里时,分别有相应的使能信号对此作出记录,最大路程显示为99公里。
(4)计费模块:
该模块是基于等待时间模块和路程模块对费用进行控制的。
通过内部使能信号分别计算3公里以内、3-20公里以及20公里以后的费用。
三、VHDL程序、模块及仿真波形
1.程序源代码
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityhxk_26is
port(
clk:
instd_logic;
start:
instd_logic;
wait_signal:
instd_logic;
mile:
instd_logic;
one_way:
instd_logic;
rst:
instd_logic;
cost0,cost1,cost2,cost3:
outstd_logic_vector(3downto0);
min0,min1:
outstd_logic_vector(3downto0);
km0,km1:
outstd_logic_vector(3downto0));
end;
architecturebhvofhxk_26is
signalmile_r1,mile_r2,mile_clk,start_r,clk1hz:
std_logic;
signalcount:
integerrange0to29;
signalsec:
integerrange0to59;
signalc0,c1,c2,c3:
std_logic_vector(3downto0);
signalk0,k1,m0,m1:
std_logic_vector(3downto0);
signalen0:
std_logic;
signalen1:
std_logic;
signalwait_clk:
std_logic;
signalcost_clk:
std_logic;
begin
min0<=m0;
min1<=m1;
km0<=k0;
km1<=k1;
cost0<=c0;
cost1<=c1;
cost2<=c2;
cost3<=c3;
process(rst,clk)
begin
ifrst='0'then
ifclk'eventandclk='1'then
ifcount=5then
count<=0;
clk1hz<='1';
else
count<=count+1;
clk1hz<='0';
endif;
endif;
endif;
endprocess;
process(rst,clk1hz,start,wait_signal)
begin
ifrst='1'then
m0<="0000";
m1<="0000";
elsifstart='0'then
wait_clk<='0';
elsifclk1hz'eventandclk1hz='1'then
ifwait_signal='1'then
ifsec=5then
sec<=0;
wait_clk<='1';
ifm0="1001"then
m0<="0000";
ifm1="0101"then
m1<="0000";
else
m1<=m1+'1';
endif;
else
m0<=m0+'1';
endif;
else
wait_clk<='0';
sec<=sec+1;
endif;
else
wait_clk<='0';
endif;
endif;
endprocess;
process(rst,clk1hz,mile,start)
begin
ifrst='0'then
ifclk1hz'eventandclk1hz='1'then
mile_r2<=mile_r1;
mile_r1<=mile;
start_r<=start;
endif;
endif;
endprocess;
mile_clk<=mile_r1andnot(mile_r2);
cost_clk<=wait_clkwhenwait_signal='1'else
mile_clkwhenen0='1'oren1='1'else
'0';
process(rst,start,mile_clk)
begin
ifrst='1'then
k0<="0000";
k1<="0000";
elsifstart='0'then
k0<="0000";
k1<="0000";
en0<='0';
en1<='0';
elsifmile_clk'eventandmile_clk='1'then
ifk1&k0>="00011001"andone_way='1'then
en1<='1';
en0<='0';
endif;
ifk1&k0="00000011"then
en0<='1';
endif;
ifk0="1001"then
k0<="0000";
ifk1="1001"then
k1<="0000";
else
k1<=k1+'1';
endif;
else
k0<=k0+'1';
endif;
endif;
endprocess;
process(rst,start,cost_clk,start_r)
begin
ifrst='1'then
c0<="0000";
c1<="0000";
c2<="0000";
c3<="0000";
elsifstart='1'andstart_r='0'then
c0<="0000";
c1<="1000";
c2<="0000";
c3<="0000";
elsifcost_clk'eventandcost_clk='1'then
ifen1='0'anden0='1'then
ifc1="1001"then
c1<="0000";
ifc2="1001"then
c2<="0000";
ifc3="1001"then
c3<="0000";
else
c3<=c3+'1';
endif;
else
c2<=c2+'1';
endif;
else
c1<=c1+'1';
c0<="0000";
endif;
else
if(c0="0101"andc1="1000")orc1="1001"then
ifc1="1001"andc0="0101"then
c0<="0000";
c1<="0001";
elsifc1="1001"andc0="0000"then
c0<="0101";
c1<="0000";
elsifc1="1000"andc0="0101"then
c0<="0000";
c1<="0000";
endif;
ifc2="1001"then
c2<="0000";
ifc3="1001"then
c3<="0000";
else
c3<=c3+'1';
endif;
else
c2<=c2+'1';
endif;
elsifc0="0000"then
c0<="0101";
c1<=c1+'1';
else
c0<="0000";
c1<=c1+"0010";
endif;
endif;
endif;
endprocess;
endbhv;
2.模块图形
各信号说明:
输入信号:
clk:
系统时钟信号,
mile:
车速时钟,
start:
:
启动信号,当start=1时,出租车启动,计数器开始计数;否则计数器停止计数;
rst:
复位信号,当rst=1时,各计数器清0;当rst=0时,计数器可以开始计数,start=1表示计数开始;
one_way:
单程信号,单程时由司机输入;
wait_siignal:
等待信号,处于等待状态时由司机输入;
输出信号:
km0,km1:
里程,单位为公里;
min0,min1:
等待时间,单位为分钟;
cost0,cost1,cost2,cost3:
费用,单位为元,其中cost0表示小数位。
3、系统在几种不同情况下仿真的波形:
图2单程行驶示意图
启动键、单程键有效,由图4可知,3公里之内计费显示为8元;3-20公里之间每公里1元累计;超过20公里每公里1.5元累计。
图3单程行驶中途等待示意图
启动键、单程键有效,行驶一段时间等待信号有效,等待后继续行驶。
由图5可知,3公里之内计费显示8元,3-20公里之间每公里1元累加,中间等待信号有效,每等待一分钟按此时每公里的费用计算,里程计数器停止计数,等待时间到,里程计数器继续计数。
图4单程行驶复位示意图
启动键、单程键有效,中途等待4分钟,乘客下车时显示费用25元,复位信号有效,计数器清零,当启动信号有效时重新计数。
四、设计思想与讨论
系统测试过程如下:
首先用QuartusⅡ仿真工具对系统进行时序仿真(波形如图3、图4)。
功能仿真用于综合前检查设计的逻辑功能是否符合设计要求,仿真过程中可以通过观察检测设计的输入信号、输出信号以及内部信号来分析设计的逻辑功能是否实现。
如果仿真全部通过无误的话,就可以进行引脚锁定,然后下载程序到GW48系统进行硬件仿真。
FPGA的配置芯片为ACEX1KEP1K30TC114-3,利用在实验箱上连接好的八片LED数码管中的六片,直接观察结果。
测试结果表明,系统设计达到了预期的技术指标要求。
五、结论与心得
这次课程设计中,我们主要是运用VHDL语言设计了一个出租车计费器,并且用层次化的设计方法来实现这个电路。
在程序编写结束后,我们还对该程序进行了调试,能按预期的效果进行模拟汽车启动、停止、暂停等功能,基本完成课程设计的要求。
通过此次课程设计,我们更进一步的深入了解了VHDL设计语言,并通过使用对它有了更深的体会。
对于编程过程中可能遇到的问题有了一定的了解,也明白了其中的一些注意事项,对于下次进行编程设计有很大的帮助和提高。
总之,这次实验不仅仅加强了我们的动手编程能力,也大大加强了团队合作以及设计能力,使我们在理论学习和编程练习方面及实际操作方面都获得了较大的收获。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 出租车 计价器 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)