基于FPGA出租车计费器设计报告(verilog)Word文件下载.doc
- 文档编号:15407578
- 上传时间:2022-10-30
- 格式:DOC
- 页数:9
- 大小:88KB
基于FPGA出租车计费器设计报告(verilog)Word文件下载.doc
《基于FPGA出租车计费器设计报告(verilog)Word文件下载.doc》由会员分享,可在线阅读,更多相关《基于FPGA出租车计费器设计报告(verilog)Word文件下载.doc(9页珍藏版)》请在冰豆网上搜索。
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)
if(RST) begin count1<
count2<
end //里程清零
elseif(count1==9) begincount1<
count2<
=count2+1;
else count1<
=count1+1;
//每一个脉冲小数里程加1,满十后整数部分加1
assignMile_dec=count1;
assignMile_int=count2;
endmodule
3、
modulequzheng(M_int,M_dec,Mile);
//取整模块
input[12:
0]M_int;
//输入的里程整数
input[3:
0]M_dec;
//输入的里程小数
0]Mile;
reg[12:
always@(M_int,M_dec)
begin
if(M_dec!
=0) Mile<
=M_int+1;
//不满一公里的,按一公里计算,即整数部分加一
elseMile<
=M_int;
//为零则整数不变
end
4、
moduleFare(CLK,RST,Mile,T_fare);
//计费模块
parameterS_price=10,Fuel=1;
//起步价10元,燃油附加费1元
0]Mile;
//取整后的里程输入
0]T_fare;
//总的车费
0]Q1;
always@(posedgeCLKorposedgeRST)
begin
if(RST) Q1<
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元
assignT_fare=Q1;
5、显示模块
moduledeceder(scan,seg7,dp,clk20mhz,money_in,distance_in);
output[7:
0]scan;
//数码管地址选择信号
output[6:
0]seg7;
//7段显示控制信号
outputdp;
//小数点
inputclk20mhz;
//系统时钟20MHZ
0]money_in;
//车费
0]distance_in;
//路程
reg[7:
0]scan;
reg[6:
0]seg7;
regdp;
regclk1khz;
//1KHZ分频时钟,用于扫描数码管地址
reg[3:
0]data;
0]m_one,m_ten,m_hun,m_tho;
//车费钱数的4位十进制表示
0]d_one,d_ten,d_hun,d_tho;
//路程的4位十进制表示
reg[15:
0]comb1;
0]comb1_a,comb1_b,comb1_c,comb1_d;
0]comb2;
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;
//将车费转化为4位十进制数
if(comb1<
money_in)
begin
if(comb1_a=='
d9&
&
comb1_b=='
comb1_c=='
d9)
comb1_a<
b0000;
comb1_b<
comb1_c<
comb1_d<
=comb1_d+1;
comb1<
=comb1+1;
end
elseif(comb1_a=='
begin
comb1_a<
comb1_b<
=comb1_c+1;
d9)
=comb1_b+1;
comb1<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 出租车 计费 设计 报告 verilog