arm出租车计价器系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《》
课程设计报告题目:出租车计价器系统
专业:)
班级:
学号:
姓名:
指导教师:
完成日期:
目录
一、前言 (11)
1.1课题研究背景 (11)
1.2课程研究目的和意义 (11)
二、需求分析 (11)
三、开发环境及系统结构 (22)
3.1开发环境 (22)
3.2系统结构 (22)
四、详细设计 (33)
五、结论 (1717)
参考文献 (1818)
一、前言
1.1 课题研究背景
嵌入式系统反映了当代最新的技术水平。
嵌入式系统不仅和一般的PC机上的应用系统不同,就是针对不同的具体应用而设计的嵌入式系统之间差别也很大。
嵌入式系统一般功能单一,简单而且兼容性方面要求不高,但是在大小和成本方面限制较多。
1.2 课程研究目的和意义
在本实验中以三星S3C6410开发板和7个7段数码管为基础,设计一个出租车简易计价器,用FPGA开发板的按键手动来控制出租车的状态,即行驶或等待,数码管显示当前的行驶里程,等待时间以及总共的费用。
二、需求分析
随着汽车的普及人们出行的需求出租车行业越来越繁盛,随之而来的便是关于乘客出租车计费的标准化要求,本设计根据乘客以及车主的实际情况来进行设计,具备的功能如下:
(1)异步复位,复位信号与时钟信号不同步。
(2)基准时钟(50MHZ)由原来的每秒跳变50M下分成每秒跳变3下,即便于人眼的观察,设计5秒钟里程变化一公里,6秒钟时间等待为一分钟。
(3)用一个拨码开关来控制当前的状态,如果是高电平1则开始计里程,如
果是低电平0则开始计等待时间。
(4)用7个7段数码管来显示当前的里程,等待时间以及最后的费用。
(5)手动控制计费系统,当一位客人下车而另一位客人上车则按复位键清0,使得数码管只显示起始价8元。
三、开发环境及系统结构
3.1开发环境
三星s3c6410开发板
3.2系统结构
1、结构图
图1
2、顶层划分
图2
四、详细设计
1、输入输出信号描述
表1
2、分频模块
module fenpin(clk,reset,clk_1); input clk,reset;
output clk_1;
reg clk_1;
reg [29:0] count;
always@(posedge clk,negedge reset)
begin
if(!reset)
begin
count=0;
clk_1=1'b0;
end
else if(count==25000000)
begin
count=0;
clk_1=!clk_1;
end
else
count=count+1'd1;
end
endmodule
仿真结果:
图3
3、里程模块
在出租车转轴上加装传感器,以便获得“行驶里程信号”。
设汽车每走10米发一个脉冲,到1公里时,发100个脉冲,所以对里程计数要设计一个模100计数器,如图3-1程的计数显示,则用十进制、译码显示即可,见图3-4。
计数器采用74LS290,显示可用译码、驱动、显示三合一器件CL002或共阴、共阳显示组件
module licheng(reset,start,clk_1,lch);
input reset,start,clk_1;
output lch;
reg [7:0] lch;
reg [5:0] count;
always@(negedge reset,posedge clk_1)
begin
if(!reset)
begin
lch=8'b00000000;
count=6'b000000;
end
else
begin
if(start)
begin
if(count==6'b000010)
begin
lch=lch+1'b1;
count=count+1'b1;
if(lch[3:0]>4'b1001)
begin
lch[7:4]=lch[7:4]+4'b0001; lch[3:0]=4'b0000;
end
end
else if(count==6'b000100) count=6'b000000;
else
count=count+1'b1;
end
else
lch[7:0]=lch[7:0];
end
end
endmodule
module js(reset,start,clk_1,jishi);
input reset,start,clk_1;
output jishi;
reg [5:0] count1;
reg [7:0] jishi;
always@(negedge reset,posedge clk_1)
begin
if(!reset)
begin
count1=6'b000000;
jishi=8'b00000000;
end
else
begin
if(!start)
begin
if(count1==6'b000010)
begin
jishi=jishi+1'b1;
if(jishi[3:0]>4'b1001)
begin
jishi[7:4]=jishi[7:4]+4'b0001; jishi[3:0]=4'b0000;
end
count1=count1+1'b1;
end
else if(count1==6'b000100)
count1=6'b000000;
else
count1=count1+1'b1;
end
else
jishi[7:0]=jishi[7:0];
end
end
endmodule
里程计时模块仿真结果:
图4
说明:从图上可以看出根据start的不同状态,里程和计时模块交替工作,若在行驶状态,则计程器开始加计数,。
若出租车停止等待状态,则计时器开始加计数。
里程计时模块框图:
图5
4、计费模块
该电路由两部分组成。
一是里程计价:在起价公里以内(如5公里内),按
起步价算;若超过起价公里,则每走一公里,计价器则加上每公里的单价款。
二是等候计价;汽车运行时,自动关断计时等待,而当要等候计数时,需要手动按动“等候”计费开关,进行计时,时间到(如10分钟),则输出1公里的脉冲。
相当于里程增加1公里,数字显示均为十进制数,因此,加法也要以BCD码相加。
module jf(lch,jishi,fee);
input lch,jishi;
output fee;
reg [13:0] fee;
wire [7:0] lch;
wire [7:0] jishi;
always@(lch,jishi)
begin
if(jishi[7:0]<8'b00000011)
begin
fee[4:0]={1'b0,lch[3:0]}+5'b01000;
fee[9:5]={1'b0,lch[7:4]};
fee[13:10]=4'b0000;
if(fee[4:0]>5'b01001)
begin
fee[4:0]=fee[4:0]-5'b01010;
fee[9:5]=fee[9:5]+5'b00001;
end
end
else
begin
fee[4:0]={1'b0,jishi[3:0]}+{1'b0,lch[3:0]}-5'b00011+5'b01000;
fee[9:5]={1'b0,jishi[7:4]}+{1'b0,lch[7:4]};
fee[13:10]=4'b0000;
if(fee[4:0]>5'b10011)
begin
fee[4:0]=fee[4:0]-5'b10100;
fee[9:5]=fee[9:5]+5'b00010;
end
else if(fee[4:0]>5'b01001)
begin
fee[4:0]=fee[4:0]-5'b01010;
fee[9:5]=fee[9:5]+5'b00001;
end
if(fee[9:5]>5'b10011)
begin
fee[9:5]=fee[9:5]-5'b10100;
fee[13:10]=fee[13:10]+4'b0010;
end
else if(fee[9:5]>5'b01001)
begin
fee[9:5]=fee[9:5]-5'b01010;
fee[13:10]=fee[13:10]+4'b0001;
end
end
end
endmodule
仿真结果:
图6
说明:若在行驶状态,则计程器开始加计数,每公里1元。
若出租车停止等待状态,则计时器开始加计数,当时间超过三分钟后,计费器以每两分钟1元累加,最后显示总费用。
计费模块框图:
图7
5、数码管显示
显示器显示。
基本起步价所行驶的里程到达后,按每行驶1公里的单价进行计价。
由控制触发器IC9(FF2)控制起步里程到否?若起步里程(图中设为5km)使IC9(FF2)Q端为1,Q=0,这样IC11和IC13连通,显示器显示的为起步价、单价之和的值
module display (clk_1,lch,reset,jishi,fee,hex0,hex1,hex2,hex4,hex5,hex6,hex7);
input clk_1,lch,jishi,fee,reset;
output hex0,hex1,hex2, hex4, hex5, hex6, hex7;
wire reset;
wire [7:0] lch;
wire [7:0] jishi;
wire [13:0] fee;
reg [6:0] hex0,hex1,hex2,hex4,hex5,hex6,hex7;
always@(posedge clk_1,negedge reset)
begin
if(!reset)
begin
hex6[6:0]=7'b1000000;
hex7[6:0]=7'b1000000;
hex4[6:0]=7'b1000000;
hex5[6:0]=7'b1000000;
hex0[6:0]=7'b1000000;
hex1[6:0]=7'b1000000;
hex2[6:0]=7'b1000000;
end
case(lch[3:0])
4'b0000:hex6[6:0]=7'b1000000;
4'b0001:hex6[6:0]=7'b1111001; 4'b0010:hex6[6:0]=7'b0100100; 4'b0011:hex6[6:0]=7'b0110000; 4'b0100:hex6[6:0]=7'b0011001; 4'b0101:hex6[6:0]=7'b0010010; 4'b0110:hex6[6:0]=7'b0000010; 4'b0111:hex6[6:0]=7'b1111000; 4'b1000:hex6[6:0]=7'b0000000; 4'b1001:hex6[6:0]=7'b0010000; default:hex6[6:0]=7'b1000000; endcase
case(lch[7:4])
4'b0000:hex7[6:0]=7'b1000000; 4'b0001:hex7[6:0]=7'b1111001; 4'b0010:hex7[6:0]=7'b0100100; 4'b0011:hex7[6:0]=7'b0110000; 4'b0100:hex7[6:0]=7'b0011001; 4'b0101:hex7[6:0]=7'b0010010; 4'b0110:hex7[6:0]=7'b0000010; 4'b0111:hex7[6:0]=7'b1111000; 4'b1000:hex7[6:0]=7'b0000000; 4'b1001:hex7[6:0]=7'b0010000; default:hex7[6:0]=7'b1000000; endcase
case(jishi[3:0])
4'b0000:hex4[6:0]=7'b1000000; 4'b0001:hex4[6:0]=7'b1111001; 4'b0010:hex4[6:0]=7'b0100100; 4'b0011:hex4[6:0]=7'b0110000; 4'b0100:hex4[6:0]=7'b0011001; 4'b0101:hex4[6:0]=7'b0010010; 4'b0110:hex4[6:0]=7'b0000010; 4'b0111:hex4[6:0]=7'b1111000; 4'b1000:hex4[6:0]=7'b0000000; 4'b1001:hex4[6:0]=7'b0010000; default:hex4[6:0]=7'b1000000; endcase
case(jishi[7:4])
4'b0000:hex5[6:0]=7'b1000000; 4'b0001:hex5[6:0]=7'b1111001; 4'b0010:hex5[6:0]=7'b0100100; 4'b0011:hex5[6:0]=7'b0110000; 4'b0100:hex5[6:0]=7'b0011001;
4'b0101:hex5[6:0]=7'b0010010; 4'b0110:hex5[6:0]=7'b0000010; 4'b0111:hex5[6:0]=7'b1111000; 4'b1000:hex5[6:0]=7'b0000000; 4'b1001:hex5[6:0]=7'b0010000; default:hex5[6:0]=7'b1000000; endcase
case(fee[3:0])
4'b0000:hex0[6:0]=7'b1000000; 4'b0001:hex0[6:0]=7'b1111001; 4'b0010:hex0[6:0]=7'b0100100; 4'b0011:hex0[6:0]=7'b0110000; 4'b0100:hex0[6:0]=7'b0011001; 4'b0101:hex0[6:0]=7'b0010010; 4'b0110:hex0[6:0]=7'b0000010; 4'b0111:hex0[6:0]=7'b1111000; 4'b1000:hex0[6:0]=7'b0000000; 4'b1001:hex0[6:0]=7'b0010000; default:hex0[6:0]=7'b1000000; endcase
case(fee[8:5])
4'b0000:hex1[6:0]=7'b1000000; 4'b0001:hex1[6:0]=7'b1111001; 4'b0010:hex1[6:0]=7'b0100100; 4'b0011:hex1[6:0]=7'b0110000; 4'b0100:hex1[6:0]=7'b0011001; 4'b0101:hex1[6:0]=7'b0010010; 4'b0110:hex1[6:0]=7'b0000010; 4'b0111:hex1[6:0]=7'b1111000; 4'b1000:hex1[6:0]=7'b0000000; 4'b1001:hex1[6:0]=7'b0010000; default:hex1[6:0]=7'b1000000; endcase
case(fee[13:10])
4'b0000:hex2[6:0]=7'b1000000; 4'b0001:hex2[6:0]=7'b1111001; 4'b0010:hex2[6:0]=7'b0100100; 4'b0011:hex2[6:0]=7'b0110000; 4'b0100:hex2[6:0]=7'b0011001; 4'b0101:hex2[6:0]=7'b0010010; 4'b0110:hex2[6:0]=7'b0000010; 4'b0111:hex2[6:0]=7'b1111000; 4'b1000:hex2[6:0]=7'b0000000;
4'b1001:hex2[6:0]=7'b0010000;
default:hex2[6:0]=7'b1000000;
endcase
end
endmodule
仿真结果:
图8
说明:数码管有两种显示方式动态显示与静态显示,由于在本文中用到了七个数码管所以选择了动态显示,在时钟的控制下,当reset为高电平的时候把费用,公里,时间译码输出
显示模块框图:
图9
6、系统仿真
初步设计完成后,即可将分模块和顶层模块进行仿真测试,同时可根据设计要求加入测试输入条件。
仿真后得到的相应输出结果如与预先的结果不相符,则应修改设计,直到相符为止。
没有译码的仿真结果如下所示:
(a)为行驶中未停时的系统电路仿真结果:
图10
(b)为行驶中时(在两公里之内)的系统电路仿真结果:
图11
(c)为停止时(在两分钟之外)的系统电路仿真结果:
图12
从(a)可以看出当reset=1时,系统复位,路程计数器、和等待时间计数器均为0,费用计数器为8元;当reset为0时,系统启动,start=1表示出租车行驶, clk-1每产生一个脉冲,路程计数器加1;路程2公里内,费用保持8不变,超过2公里,费用计数器进行加计数,每增加1公里费用加1元,此时等待时间计数器不变。
而根据 (b) ,(c)的仿真波形可知,当reset为0时,系统启动,start=0表示出租车处于停止等待状态,此时等待时间计数器计数,在2分钟等待时间内,费用计数器不变;等待时间超过2分钟后,每增加2分钟,费用计数器增加1元,此时路程计数器保持不变。
7、验证流程图
图13
五、结论
本文介绍了一种全新的出租车计价器计费系统的FPGA设计方法。
分别介绍了整个系统和各个模块的设计,使用FPGA芯片、VHDL硬件描述语言作为设计手段,利用自顶向下的模块化设计思路,通过在QuartusⅡ软件下进行的模拟仿真,并进行相应的硬件下载调试,证明所设计的系统完成了出租车计费器的功能,各项技术指标符合预定标准,具有一定实用性。
如果将该设计再结合到实际应用中,那么,只需改变设计中计费要求,就可以应用到出租车上。
另外,如果再任意输入该出租车计价器的计费标准,那么,它的适用范围可能就更广泛了。
本次课程设计还是比较有成就感的,因为遇到一些很棘手的问题,最终解决之后感觉很好,还学到一些之前没学到的东西。
参考文献
[1] 刘尚军,张志兵等ARM嵌入式技术与应用—基于Xscale处理器及 Vxworks操作系统北京:北京航空航天大学出版社 2012
[2] 田泽 ARM9嵌入式Linux开发实验与实践北京:北京航空航天大学出版2013
[3] 沈连丰,许波,夏玮玮等嵌入式系统及其开发应用北京:电子工业出版社 2011
[4] Embedded systems Tammy Noergaard 北京:人民邮电出版社 2008
[5]童永清Linux C 编程实践北京:人民邮电出版社 2008
[6]李斌,董慧颖.可重组机器人研究和发展现状.沈阳工业学院学报2000
[8]马淑华.单片机原理与接口技术.北京邮电大学出版社2007
[9]张义和.例说51单片机. 人民邮电出版社2008
[10]刘岚,尹勇基于ARM的嵌入式系统开发北京:电子工业出版社 2013
[11]三恒星科技ARM9应用实例北京:电子工业出版社 2015
[12]庞丽萍操作系统原理武汉:华中科技大学出版社 2017
19 / 21。