基于FPGA设计的出租车计价器Word文档格式.docx
- 文档编号:3286920
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:25
- 大小:977.40KB
基于FPGA设计的出租车计价器Word文档格式.docx
《基于FPGA设计的出租车计价器Word文档格式.docx》由会员分享,可在线阅读,更多相关《基于FPGA设计的出租车计价器Word文档格式.docx(25页珍藏版)》请在冰点文库上搜索。
modulediv0(clk_50M,clk0,reset);
//端口的定义
inputclk_50M,reset;
//总的时钟是50M
outputclk0;
//分频后输出的时钟
regclk0;
reg[31:
0]count;
//32位的计数器
always@(posedgeclk_50Mornegedgereset)//异步复位
begin
if(!
reset)
begin
clk0<
='
d0;
count=32'
end
elseif(count==32'
d25_000000)//判断计时器记到了25000000吗?
begin
count<
=32'
//计到25_000000计数器清零
=~clk0;
//输出的时钟取反
end//endbegin
elsecount<
=count+1'
d1;
//没计到25000000计数器加一
end//endalways
endmodule//结束分频模块
3.1.4数码管的分频模块:
3.1.5具体框图:
此模块的功能是对总的时钟进行分频,分出的频率是让数码管用的,因为总的时钟是50M的。
设计该模块的时候用了一个32位的计数器,当计数器计到50.000的时候产生时钟。
3.1.6数码管的分频模块VerilogHDL源代码:
modulediv1(clk_50M,clk1,reset);
outputclk1;
//分频后输出的时钟1KHZ
regclk1;
clk1<
d50_000)//判断计时器记到了50_000吗
//计到50_000计数器清零
=~clk1;
//没计到50_000计数器加一
3.1.7数码管的分频模块的仿真结果:
3.2计程模块:
3.2.1计程模块的框图:
此模块的功能是计算出租车行驶的路程。
在出租车启动并行驶的过程中(即复位/启动信号reset为1,行驶/停止信号start为1),当时钟clk是上升沿的时候,系统即对路程计数器distance的里程计数器进行加计数,当路程超过3公里时,系统将输出标志正脉冲distance_enable。
3.2.2计程模块的VerilogHDL源代码:
moduledistance(clk0,start,reset,distance,distance_enable);
//端口定义
inputclk0,start,reset;
output[7:
0]distance;
//输出的公里
reg[7:
outputdistance_enable;
//控制计费的公里信号
regdistance_enable;
always@(posedgeclk0ornegedgereset)//异步复位
reset)//低电平复位
distance<
=8'
end
elseif(start)//start高电平有效
if(distance[3:
0]==9)//判断distance的低四位计到了9没有
distance[3:
0]<
=4'
//计到9清零
if(distance[7:
4]==9)//判断distance的高四位计到了9没有
distance[7:
4]<
elsedistance[7:
=distance[7:
4]+1'
//distance的高四位没有计到9的时候加一
end
elsedistance[3:
=distance[3:
0]+1'
//distance的低四位没有计到9的时候加一
end//endstart
//*产生distance_enable信号*//
always@(posedgeclk0ornegedgereset)
if(!
distance_enable<
=1'
//复位
else
if(distance>
8'
d2)//大于公里三的时候
//输出distance_enable信号
endmodule//结束计程模块
3.2.3计程模块的仿真结果:
从波形图可以看出在时钟的控制下,当reset为高电平且start为高电平的时候distance开始计数,当计到大于三的时候输出了distancedistance_enable为高电平。
3.3计时模块:
3.3.1计时模块的框图:
此模块用于计算停车等待的时间。
在出租车行进中,如果车辆停止等待,计数器则在1Hz信号clk的上升沿进行加计数,每60次产生进位脉冲使分钟计数器位进行加计数,当累计等待时间超过2(不包括2分钟)分钟时,输出标志time_enable正脉冲信号。
3.3.2计时模块的VerilogHDL源代码:
moduletm(clk0,reset,start,s,m,time_enable);
inputclk0,reset,start;
0]s;
//输出的秒
0]m;
//输出的分
outputtime_enable;
//输出的控制计费的信号
wiretime_enable;
reset)//低电平有效
begin//复位
s<
m<
elseif(!
start)//start信号低电平有效
if(s[3:
0]==9)//秒的低四位是9
s[3:
//清零
if(s[7:
4]==5)//秒的高四位是5
s[7:
//清零
if(m[3:
0]==9)//分的低四位是9
m[3:
if(m[7:
4]==9)//分的高四位是9
m[7:
elsem[7:
=m[7:
//分的高四位不是9加一
elsem[3:
=m[3:
//分的低四位不是9加一
elses[7:
=s[7:
//秒的高四位不是5加一
elses[3:
=s[3:
//秒的低四位不是9加一
end//endalways
assigntime_enable=((m[7:
0]>
d2)&
&
(s[7:
0]==8'
d0))?
1'
d1:
//产生time_enable信号。
endmodule//结束计时模块
3.3.3计时模块的仿真结果:
两分钟之内(包括两分钟)的仿真结果如下所示:
从波形图可以看出在clk的控制下当start为低电平reset为高电平的时候时间计数,time_enable为低电平。
两分钟之外(不包括两分钟)的仿真结果如下所示:
从波形图可以看出在clk的控制下当start为低电平reset为高电平的时候时间计数,当时间大于二分钟的时候,time_enable为输出高电平。
3.4控制模块:
3.4.1控制模块的框图:
控制模块用于为计费模块提供时钟,当start高电平的时候选择公里计费,输出的时钟信号为distance_enable,当start低电平的时候选择时间计费,输出的时钟信号为time_enable。
3.4.2控制模块的VerilogHDL源代码:
modulecontrol(start,distance_enable,time_enable,select_clk);
inputstart,distance_enable,time_enable;
outputselect_clk;
//输出选择的时钟信号
wireselect_clk;
//*当start高电平的时候选择公里计费,输出的时钟信号
为distance_enable,当start低电平的时候选择时间计费,输出的时钟信号为time_enable*//
assignselect_clk=start?
distance_enable:
time_enable;
endmodule//结束控制模块
3.4.3控制模块的仿真结果:
(1)公里计费的仿真结果如下所示:
从波形图可以看出当start为高电平的时候输出的信号是distance_enable。
(2)时间计费的仿真结果如下所示:
从波形图可以看出当start为低电平的时候输出的信号是time_enable。
3.5计费模块:
3.5.1计费模块的框图:
费用计数器模块用于出租车启动后,根据行驶路程和等待时间计算费用。
当出租车停车时,时钟select_clk用于将费用计数器复位为起步价6.0元;
当车处于行驶状态且满3公里时,select_clk信号选择distans_enable,此后路程每满1公里,费用计数器加1元;
当出租车处于停止等待状态且时钟满2分钟时,select_clk信号选择time_enable信号,时间每满1分钟,费用计数器加1元。
3.5.2计费模块的VerilogHDL源代码如下所示:
modulemoney(select_clk,reset,money,clk0);
inputselect_clk,reset,clk0);
output[7:
0]money;
//输出的费用
money<
=8’d6;
//起步为六元
elseif(select_clk==1’d1)
if(money[3:
0]==4'
d9)//费用的低四位是不是计到了9
money[3:
if(money[7:
4]==4'
d9)//费用的高四位是不是计到了9
money[7:
//计到9清零
elsemoney[7:
=money[7:
//费用的高四位没有计到9加1
elsemoney[3:
=money[3:
//费用的低四位没有计到9加1
end//endbegin
endmodule//结束计费模块
3.5.3计费模块的仿真结果:
3.6数码管显示模块:
3.6.1数码管显示模块的框图:
数码管有两种显示方式动态显示与静态显示,由于在本文中用到了八个数码管所以选择了动态显示,在时钟的控制下,当reset为高电平的时候把费用,公里,时间译码输出。
3.6.2数码管显示的VerilogHDL源代码:
modulescan_led(clk1,dig,seg,distance,s,m,money);
inputclk1;
input[7:
0]distance,money;
//输入的公里,费用。
//输入的秒
//输入的分。
0]dig;
//译码结果
0]seg;
//数码管的选择。
0]r_dig;
//译码结果输出寄存器
0]r_seg;
//数码管的选择寄存器。
reg[3:
0]disp_dat;
reg[3:
0]a;
assigndig=r_dig;
assignseg=r_seg;
always@(posedgeclk1)
a<
=a+1'
//数码管的选择
case(a)
4'
d0:
disp_dat=distance[7:
4];
//公里的高四位用第一个数码管显示。
disp_dat=distance[3:
0];
//公里的低四位用第二个数码管显示。
d2:
disp_dat=m[7:
//时间分的高四位用第三个数码管显示。
d3:
disp_dat=m[3:
//时间分的低四位用第四个数码管显示
d4:
disp_dat=s[7:
//时间秒的高四位用第五个数码管显示。
d5:
disp_dat=s[3:
//时间秒的低四位用第六个数码管显示。
d6:
disp_dat=fee[7:
//费用的高四位用第七个数码管显示。
d7:
disp_dat=fee[3:
//费用的低四位用第八个数码管显示。
default:
disp_dat=4'
b1010;
endcase
case(a)
r_dig=8'
b01111111;
//选择第一个数码管
b10111111;
//选择第二个数码管
b11011111;
//选择第三个数码管
b11101111;
//选择第四个数码管
b11110111;
//选择第五个数码管
b11111011;
//选择第六个数码管
b11111101;
//选择第七个数码管
b11111110;
//选择第八个数码管
b11111111;
//*译码结果*//
always@(disp_dat)
case(disp_dat)
4'
h0:
r_seg=8'
hc0;
//显示0
h1:
hf9;
//显示1
h2:
ha4;
//显示2
h3:
hb0;
//显示3
h4:
h99;
//显示4
h5:
h92;
//显示5
h6:
h82;
//显示6
h7:
hf8;
//显示7
h8:
h80;
//显示8
h9:
h90;
//显示9
default:
hbf;
endmodule//结束译码模块
3.7顶层模块:
各模块设计仿真实现后,可分别创建成元件符号。
顶层就是将各分模块用VerilogHDL语言或者是图形方法连接起来,便可实现系统电路。
3.7.1顶层模块的VerilogHDL源代码:
moduletaximeter(clk_50M,reset,start,seg,dig);
//端口的定义
inputclk_50M,reset,start;
//总的时钟信号,复位信号,开始信号
0]seg,dig;
//数码管的输出
wire[7:
0]distance;
//公里
//秒
//分
wire[7:
//费用
wireclk0;
//计数时钟
wiredistance_enable;
//公里控制费用的信号
//时间控制费用的信号
//控制信号
wireclk1;
//数码管显示的时钟
//*模块的调用*//
dv0u0(.clk_50M(clk_50M),.clk0(clk0),.reset(reset));
//调用计数分频模块
div1u1(.clk_50M(clk_50M),.clk1(clk1),.reset(reset));
//调用数码管显示分频模块
distanceu2(.clk0(clk0),.start(start),.reset(reset),
.distance(distance),.distance_enable(distance_enable));
//调用计程模块
controlu3(.start(start),.distance_enable(distance_enable),
.time_enable(time_enable),.select_clk(select_clk));
//调用控制模块
tmu4(.clk0(clk0),.reset(reset),.start(start),.s(s),.m(m)
.time_enable(time_enable));
//调用计时模块
moneyu5(.reset(reset),.money(money),.select_clk(select_clk),
.clk0(clk0))//调用计费模块
ledu6(.clk1(clk1),.dig(dig),.seg(seg),.distance(distance),
.s(s),.m(m),.fee(fee));
//调用数码管显示模块
endmodule//结束顶层模块
4.综合:
4.1QuartusII软件综合的报表:
4.2综合的RTL级电路:
从综合的RTL级电路可以看出完全符合系统规范。
4.3引脚锁定表:
4.4验证实物照片:
八位动态数码管显示:
第1、2位数码管显示:
路程公里distance
第3、4位数码管显示:
时间的分m
第5、6位数码管显示:
时间的秒s
第7、8位数码管显示:
总的费用money
行驶计费:
照片1:
起步价为6元。
照片2:
3公里内(包含3公里)费用一直都是6元。
行驶3公里,没有停止等待时,费用为6元。
照片3:
超过3公里,每公里加1元。
行驶4公里,费用为7元。
等待计费:
照片4:
停止等待时,2分钟内(包含2分钟)起步价是6元。
照片5:
停止等待时,超过2分钟,每分钟加1元。
等待3分钟2秒时,费用为7元。
综合计费:
照片6:
行驶31公里,停止等待10分钟35秒时,总的费用为42元。
5.结束语:
本文介绍了一种全新的出租车计价器计费系统的FPGA设计方法。
如果将该设计再结合到实际应用中,那么,只需改变设计中计费要求,就可以应用到出租车上。
另外,如果再任意输入该出租车计价器的计费标准,那么,它的适用范围可能就更广泛了。
6.参考文献:
[1]夏宇闻,VerlogHDL数字系统设计教程北京航空航天大学出版社
[2]杜慧敏,基于VerilogHDL的FPGA设计基础西安电子科技大学出
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 FPGA 设计 出租车 计价器