基于FPGA出租车计费器设计报告(verilog).doc

上传人:b****3 文档编号:2490806 上传时间:2022-10-30 格式:DOC 页数:9 大小:88KB
下载 相关 举报
基于FPGA出租车计费器设计报告(verilog).doc_第1页
第1页 / 共9页
基于FPGA出租车计费器设计报告(verilog).doc_第2页
第2页 / 共9页
基于FPGA出租车计费器设计报告(verilog).doc_第3页
第3页 / 共9页
基于FPGA出租车计费器设计报告(verilog).doc_第4页
第4页 / 共9页
基于FPGA出租车计费器设计报告(verilog).doc_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

基于FPGA出租车计费器设计报告(verilog).doc

《基于FPGA出租车计费器设计报告(verilog).doc》由会员分享,可在线阅读,更多相关《基于FPGA出租车计费器设计报告(verilog).doc(9页珍藏版)》请在冰豆网上搜索。

基于FPGA出租车计费器设计报告(verilog).doc

出租车计费器

一实验任务及要求

1.能实现计费功能,计费标准为:

按行驶里程收费,起步费为10.00元,并在车行3公里后再按2元/公里,当计费器计费达到或超过一定收费(如20元)时,每公里加收50%的车费,车停止不计费。

2.实现预置功能:

能预置起步费、每公里收费、车行加费里程。

3.实现模拟功能:

能模拟汽车启动、停止、暂停、车速等状态。

4.设计动态扫描电路:

将车费显示出来,有两位小数。

5.用VHDL语言设计符合上述功能要求的出租车计费器,并用层次化设计方法设计该电路。

6.各计数器的计数状态用功能仿真的方法验证,并通过有关波形确认电路设计是否正确。

7.完成电路全部设计后,通过系统实验箱下载验证设计的正确性。

计费器按里程收费,每100米开始一次计费。

各模块功能如下:

(1)车速控制模块

当起停键为启动状态时(高电平),模块根据车速选择和基本车速发出响应频率的脉冲驱动计费器和里程显示模块进行计数;当处于停止状态时暂停发出脉冲,此时计费器和里程显示模块相应的停止计数。

(2)里程动态显示模块

其包括计数车速控制模块发出的脉冲以及将计数显示动态显示出来,每来一个脉冲里程值加0.1(控制器每发一个脉冲代表运行了0.1公里)。

(3)计费动态显示模块

其初值为10元,当里程超过3公里后才接受计数车速控制模块发出的脉冲的驱动,并且计数显示动态显示出来,每来一个脉冲(代表运行了0.5公里)其数值加1元,当收费超过20时数值加1.5元。

三实验报告要求

1.画出顶层原理图;

2.用VHDL语言设计各子模块;

3.叙述各子模块和顶层原理图的工作原理;

4.给出各模块和顶层原理图的仿真波形图;

5.给出硬件测试流程和结果。

四:

设计说明:

实际设计共五个模块,分别为分频模块(每一百米送一个脉冲以方便计数)、计算里程模块、里程取整模块(不足一公里的按一公里算)、计费模块、显示模块。

详细功能如下:

1、分频模块:

假设车轮每转一圈为2米,送一个脉冲,则需要50分频(共100米),同理,若知道车轮直径,即可算出分频比

2、里程模块:

每一百米记一次数,最大可以计999.9公里,精确到0.1公里。

3、取整模块:

现实中出租车的精确度为0.1公里,计算价格的时候不足一公里的按一公里算,所以加了这一个模块,输出的是计算价格时的里程数。

4、计费模块:

按行驶里程收费,起步费为11.00元(包括1元得燃油附加费),并在车行3公里后再按2元/公里,当计费器计费达到或超过一定收费(20元)时,每公里加收50%的车费,车停止不计费。

5、显示模块:

通过动态扫描显示车费和里程数,将十进制数转化为四位十进制数(如将9999转化为四个9)以方便显示

设计流程图如下

50分频器

里程计算模块

计费模块

取整模块

显示模块

脉冲输入

流程说明:

车轮每转一圈送一个脉冲波,假设每转一圈为2米,则经过50分频器后是每100米送一个脉冲到里程计算模块,里程计算模块可以精确到0.1公里,将计算的里程数送至取整模块进行判断,若小数部分不为零则整数部分加1,即不足一公里的部分按一公里计算,取整后的里程送至计费模块计费,同时和计算的费用用过显示模块进行转化和显示

顶层原理图如下:

五、实验结果:

通过maxplusII将sof文件下载到试验箱上,运行正常,与实验目的一致,可以通过调整输入的脉冲频率来调整计费的速度。

初始价格为11元,超过3公里每公里加收2元,价格超过20每公里3元。

六、一些问题和改进:

总的来说本次试验是顺利的,过程中主要遇到了这几点问题:

1、刚开始没有完全想好要用几个模块做,没画好流程图,所以模块数量显得有点多,许多模块显得有些不必要,如取整模块完全可以合并到计费模块中。

2、对其中的管脚定义太过于随意,造成很大空间的浪费,而且在使用较早的芯片时出现管脚不足的现象,这和模块过多也有很大关系。

一些改进的想法:

1、在本次设计中,假设车轮每转一圈为2米,刚好50分频,但是显然现实中不会刚好每圈2米,极可能出现有小数的分频,所以分频器需要改进,或者使用其他模块使得没100送一个脉冲。

2、将里程数送到显示模块时,已经是经过取整,所以没有小数部分,但是里程模块的小数部分又不能和整数部分一起送到显示模块进行转化,所以需要想办法将小数和整数部分合并且不影响取整。

3、可以再加上按时间收费的模块以便出租车在较长时间等待的过程中也能计费

附:

程序清单

1、

moduleFDIV(CLK,K); //分频器设计

inputCLK;

outputK;

reg[12:

0]count; regM1;

parameterratio=50; //定义分频比为50,若是不同规格的轮胎,调整此参数

always@(posedgeCLK)

begin

if(count==ratio-1) count<=0; elsecount<=count+1;

if(count==0) M1<=~M1; elseif(count==ratio/2) M1<=~M1;

end

assignK=M1;

endmodule

2、

moduleMileage(CLK,RST,Mile_int,Mile_dec); //里程模块

inputCLK,RST;

output[12:

0]Mile_int;

output[3:

0]Mile_dec; //定义小数和整数的里程以便取整

reg[3:

0]count1;reg[12:

0]count2;

always@(posedgeCLKorposedgeRST)

begin

if(RST) begin count1<=0;count2<=0;end //里程清零

elseif(count1==9) begincount1<=0;count2<=count2+1; end

else count1<=count1+1; //每一个脉冲小数里程加1,满十后整数部分加1

end

assignMile_dec=count1; assignMile_int=count2;

endmodule

3、

modulequzheng(M_int,M_dec,Mile); //取整模块

input[12:

0]M_int;//输入的里程整数

input[3:

0]M_dec; //输入的里程小数

output[12:

0]Mile;

reg[12:

0]Mile;

always@(M_int,M_dec)

begin

if(M_dec!

=0) Mile<=M_int+1; //不满一公里的,按一公里计算,即整数部分加一

elseMile<=M_int; //为零则整数不变

end

endmodule

4、

moduleFare(CLK,RST,Mile,T_fare); //计费模块

parameterS_price=10,Fuel=1; //起步价10元,燃油附加费1元

inputCLK,RST;

input[12:

0]Mile; //取整后的里程输入

output[12:

0]T_fare; //总的车费

reg[12:

0]Q1;

always@(posedgeCLKorposedgeRST)

begin

if(RST) Q1<=0;

elseif(Mile<=3) Q1<=S_price+Fuel; //小于3公里,起步价11元

elseif(Q1<20) Q1<=S_price+Fuel+2*(Mile-3); //大于11小于20元每公里加收2元

else Q1<=S_price+Fuel+3*(Mile-3);//大于20元每公里加收3元

end

assignT_fare=Q1;

endmodule

5、显示模块

moduledeceder(scan,seg7,dp,clk20mhz,money_in,distance_in);

output[7:

0]scan;//数码管地址选择信号

output[6:

0]seg7;//7段显示控制信号

outputdp;//小数点

inputclk20mhz;//系统时钟20MHZ

input[12:

0]money_in;//车费

input[12:

0]distance_in;//路程

reg[7:

0]scan;

reg[6:

0]seg7;

regdp;

regclk1khz;//1KHZ分频时钟,用于扫描数码管地址

reg[3:

0]data;

reg[3:

0]m_one,m_ten,m_hun,m_tho;//车费钱数的4位十进制表示

reg[3:

0]d_one,d_ten,d_hun,d_tho;//路程的4位十进制表示

reg[15:

0]count;

reg[15:

0]comb1;

reg[3:

0]comb1_a,comb1_b,comb1_c,comb1_d;

reg[15:

0]comb2;

reg[3:

0]comb2_a,comb2_b,comb2_c,comb2_d;

reg[2:

0]cnt;

//1khz分频,用于扫描数码管地址

always@(posedgeclk20mhz)

begin

if(count==1'd10000)

beginclk1khz<=~clk1khz;count<='d0;end

else

begincount<=count+1;end

//将车费转化为4位十进制数

if(comb1

begin

if(comb1_a=='d9&&comb1_b=='d9&&comb1_c=='d9)

begin

comb1_a<='b0000;

comb1_b<='b0000;

comb1_c<='b0000;

comb1_d<=comb1_d+1;

comb1<=comb1+1;

end

elseif(comb1_a=='d9&&comb1_b=='d9)

begin

comb1_a<='b0000;

comb1_b<='b0000;

comb1_c<=comb1_c+1;

comb1<=comb1+1;

end

elseif(comb1_a=='d9)

begin

comb1_a<='b0000;

comb1_b<=comb1_b+1;

comb1<

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 工作计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1