基于FPGA的出租车计价器设计_第1页
基于FPGA的出租车计价器设计_第2页
基于FPGA的出租车计价器设计_第3页
基于FPGA的出租车计价器设计_第4页
基于FPGA的出租车计价器设计_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、华中科技大学文华学院 第18 页 共 18 页华中科技大学文华学院集成电路课程设计报告基于FPGA的出租车计价器设计 姓名:吴响学号:070110011130班级:2007级1班同组者姓名:胡文博,吴响,彭考考院系:信息科学与技术学部 专业: 电子科学与技术 目录摘要31.引言:32.系统规范:32.1出租车计价器的要求:32.2系统组成框图:33.各模块设计:43.1分频模块:43.1.1计数器的分频模块:43.1.3计数器的分频模块VerilogHDL源代码:53.1.4仿真的结果:53.1.5数码管的分频模块:53.1.6具体框图:53.1.7数码管的分频模块VerilogHDL源代码:

2、53.2计程模块:63.2.1计程模块的框图:63.2.2计程模块的VerilogHDL源代码:63.2.3计程模块的仿真结果:73.3计时模块:83.3.1计时模块的框图:83.3.2计时模块的VerilogHDL源代码:83.3.3计时模块的仿真结果:93.4控制模块:93.4.1控制模块的框图:93.4.2控制模块的VerilogHDL源代码:93.4.3控制模块的仿真结果:103.5计费模块:103.5.1计费模块的框图:103.5.2计费模块的VerilogHDL源代码:103.5.3计费模块的仿真结果:113.6数码管显示模块:113.6.1数码管显示模块的框图:113.6.2数码

3、管显示的VerilogHDL源代码:113.7顶层模块:133.7.1顶层模块的VerilogHDL源代码:134.验证方案:144.1验证的流程图:144.2验证的VerilogHDL源代码:144.3系统仿真:145.综合:165.1 Quartus II软件综合的报表:165.2综合的RTL级电路:176.结束语:177.参考文献:18基于FPGA的出租车计价器设计摘要介绍了出租车计费器系统的组成及工作原理,简述了在EDA平台上用FPGA器件构成该数字系统的设计思想和实现过程。论述了计程模块,计费模块,计时模块,译码动态扫描模块等的设计方法与技巧。 1引言:随着EDA技术的高速发展,电子

4、系统的设计技术发生了深刻的变化,大规模可编程逻辑器件CPLDFPGA的出现,给设计人员带来了诸多方便。利用它进行产品开发,不仅成本低、周期短、可靠性高,而且具有完全的知识产权。本文介绍了一个以Altera公司可编程逻辑芯片cyclone2系列的EP2C5T144C8的fpga芯片为控制核心、附加一定外围电路组成的出租车计费器系统。随着社会的不断进步,人们生活水平的不断提高,出租车逐渐成为人们日常生活不可缺少的交通工具。而计价器作为出租车的一个重要组成部分,关系着出租车司机和乘客双方利益,起着重要的作用,因而出租车计价器的发展非常迅猛。2系统规范:2.1出租车计价器的要求: 行程3公里内(包括3

5、公里),且等待累计时间2分钟内(包括2分钟),起步费为6.0元; 3公里外(不包括3公里)以每公里1.0元,等待累计时间2分钟外(不包括2分钟)以每分钟以1.0元计费。 能显示行驶公里数、等待累计时间和最后的总费用。本计费器的显示范围为099元,计价分辨率为1元;计程器显示范围为099公里,分辨率为1公里;计时器的显示范围是分钟的显示范围是099, 辨率为1分钟。秒的显示范围是059。分辨率为1秒。2.2 系统组成框图:出租车的一般计费过程为:出租车载客后,启动计费器,整个系统开始运行,里程计数器和时间计数器从0开始计数,费用计数器从6开始计算。再根据行驶里程或停止等待的时间按以上的标准计费。

6、若在行驶状态,则计程器开始加计数,当路程超过三公里后,计费器以每公里1元累加。若出租车停止等待状态,则计时器开始加计数,当时间超过两分钟后,计费器以每分钟1元累加。出租车到达目的地停止后,停止计费器,显示总费用。根据出租车计费器的工作过程,本系统采用分层次、分模块的方式设计,其本系统组成框图如下所示。其中行驶路程计数模块、等待时间计数模块和计费模块,用来统计路程、等待时间和总费用,控制模块是用来控制计费模块,数码管显示模块用来显示行驶的公里数、等待累计时间和总费用等信息。系统框图如下所示:3 .各模块设计:本系统采用层次化、模块化的设计方法,设计顺序为自下向上。首先实现系统框图中的各子模块,然

7、后由顶层模块调用各子模块来完成整个系统。为了便于显示,这里的路程、时间和费用计数器均用十六进制表示。3.1分频模块:3.1.1计数器的分频模块:3.1.2 计数器的分频模块具体框图: 此模块的功能是对总的时钟进行分频,分出的频率是让计数器用的,因为总的时钟是50M的。设计该模块的时候用了一个32位的计数器,当计数器计到25.000.000的时候产生时钟。在仿真的时候为了方便观察设计了一个5分频的电路。3.1.3 计数器的分频模块VerilogHDL源代码:module div(clk_50M,clk,reset);/ 端口的定义input clk_50M,reset;/ 总的时钟是50Mout

8、put clk;/分频后输出的时钟 reg clk;reg 31:0 count;/32位的计数器always (posedge clk_50M or negedge reset)/异步复位begin if(!reset) begin clk<='d0; count=32'd0;endelse if(count=32'd25_000000)/判断计时器记到了25000000吗? begin count<=32'd0;/计到25_000000计数器清零 clk<=clk;/输出的时钟取反 end/end begin else count<=

9、count+1'd1;/ 没计到25000000计数器加一end/end alwaysendmodule / 结束分频模块3.1.4 仿真的结果:从波形可以看出当reset为低电平的时候clk为零,当为高电平的时候clk的高电平占了clk_50M的5个周期,低电平也占了clk_50M的5个周期。3.1.5 数码管的分频模块:3.1.6 具体框图: 此模块的功能是对总的时钟进行分频,分出的频率是让数码管用的,因为总的时钟是50M的。设计该模块的时候用了一个32位的计数器,当计数器计到50.000的时候产生时钟。3.1 .7 数码管的分频模块VerilogHDL源代码:module div

10、1(clk_50M,clk1,reset);/ 端口的定义input clk_50M,reset;/ 总的时钟是50Moutput clk1;/分频后输出的时钟 1KHZreg clk1;reg 31:0 count;/32位的计数器always (posedge clk_50M or negedge reset)/异步复位begin if(!reset) begin clk1<='d0; count=32'd0;endelse if(count=32'd50_000)/ 判断计时器记到了50_000吗 begin count<=32'd0;/计到5

11、0_000计数器清零 clk1<=clk1;/输出的时钟取反 end/end begin else count<=count+1'd1;/ 没计到50_000计数器加一end/end alwaysendmodule / 结束分频模块3.2 计程模块:3.2.1计程模块的框图:此模块的功能是计算出租车行驶的路程。在出租车启动并行驶的过程中(即复位/启动信号reset为1,行驶/停止信号start为1),当时钟clk是上升沿的时候,系统即对路程计数器distance的里程计数器进行加计数,当路程超过三公里时,系统将输出标志正脉冲distance_enable。3.2.2 计程模

12、块的VerilogHDL源代码:module distancemokuai(clk,start,reset,distance,distance_enable);/端口的定义input clk,start,reset;output 7:0 distance;/ 输出的公里reg 7:0 distance;output distance_enable;/ 控制计费的公里信号reg distance_enable;always(posedge clk or negedge reset)/异步复位begin if(!reset)/低电平复位 begin distance<=8'd0; e

13、nd else if(start)/ start 高电平有效 begin if(distance3:0=9)/判断distance的低四位计到了9没有 begin distance3:0<=4'd0;/计到9清零 if(distance7:4=9) /判断distance的高四位计到了9没有 distance7:4<=4'd0;/计到9清零 else distance7:4<= distance7:4+1'd1;/ distance的高四位没有计到9的时候加一 end else distance3:0<=distance3:0+1'd1;

14、/ distance的低四位没有计到9的时候加一 end/end startend/end always/*产生distance_enable信号*/always(posedge clk or negedge reset)beginif(!reset)begin distance_enable<=1'd0;/复位endelse if(distance>8'd2)/ 大于公里三的时候 begin distance_enable<=1'd1;/输出distance_enable信号 endend/end alwaysendmodule/结束计程模块3.2.

15、3计程模块的仿真结果:从波形图可以看出在时钟的控制下,当reset为高电平且start为高电平的时候distance开始计数,当计到大于三的时候输出了distancedistance_enable为高电平。3.3计时模块:3.3.1计时模块的框图:此模块用于计算停车等待的时间。在出租车行进中,如果车辆停止等待,计数器则在1Hz信号clk的上升沿进行加计数,每60次产生进位脉冲使分钟计数器位进行加计数,当累计等待时间超过2(不包括2分钟)分钟时,输出标志time_enable正脉冲信号。3.3.2 计时模块的VerilogHDL源代码:module timemokuai(clk,reset,st

16、art,s,m,time_enable);/ 端口的定义input clk,reset,start;output 7:0 s;/输出的秒output 7:0 m;/输出的分output time_enable;/输出的控制计费的信号reg 7:0 s;reg 7:0 m;wire time_enable; always(posedge clk or negedge reset)/异步复位beginif(!reset)/低电平有效begin /复位s<=8'd0;m<=8'd0;endelse if(!start)/start 信号低电平有效beginif(s3:0=

17、9)/ 秒的低四位是9 begin s3:0<=4'd0;/清零 if(s7:4=5) / 秒的高四位是5 begin s7:4<=4'd0; /清零 if(m3:0=9) / 分的低四位是9 begin m3:0<=4'd0; /清零 if(m7:4=9) / 分的高四位是9 m7:4<=4'd0; /清零 else m7:4<=m7:4+1'd1; / 分的高四位不是9加一endelse m3:0<=m3:0+1'd1; /分的低四位不是9加一endelse s7:4<=s7:4+1'd1;

18、/ 秒的高四位不是5加一endelse s3:0<=s3:0+1'd1; /秒的低四位不是9加一 end/end alwaysend assign time_enable=(m7:0>8'd2)&&(s7:0=8'd0)?1'd1:1'd0;/产生time_enable信号。endmodule/结束计时模块3.3.3 计时模块的仿真结果:两分钟之内(包括两分钟)的仿真结果如下所示:从波形图可以看出在clk的控制下当start为低电平reset为高电平的时候时间计数,time_enable为低电平。两分钟之外(不包括两分钟)的仿

19、真结果如下所示:从波形图可以看出在clk的控制下当start为低电平reset为高电平的时候时间计数,当时间大于二分钟的时候,time_enable为输出高电平。3.4控制模块:3.4.1 控制模块的框图:控制模块用于为计费模块提供时钟,当start高电平的时候选择公里计费,输出的时钟信号为distance_enable,当start低电平的时候选择时间计费,输出的时钟信号为time_enable,3.4.2 控制模块的VerilogHDL源代码:module control(start,distance_enable,time_enable,select_clk);input start,d

20、istance_enable,time_enable;output select_clk;/输出选择的时钟信号wire select_clk;/*当start高电平的时候选择公里计费,输出的时钟信号为distance_enable,当start低电平的时候选择时间计费,输出的时钟信号为time_enable*/assign select_clk=start?distance_enable:time_enable; endmodule/结束控制模块3.4.3 控制模块的仿真结果:(1)公里计费的仿真结果如下所示:从波形图可以看出当start为高电平的时候输出的信号是distance_enable

21、。(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 计费模块的VerilogHD

22、L源代码如下所示:module feemokuai(select_clk,reset,fee,clk);input select_clk,reset,clk;output7:0 fee; /输出的费用reg 7:0 fee;always(posedge clk or negedge reset)/异步复位begin if(!reset)/低电平有效 begin fee<=8d6;/起步为六元 end else if(select_clk=1d1) begin if(fee3:0=4'd9)/费用的低四位是不是计到了9 begin fee3:0<=4'd0;/计到9清

23、零 if(fee7:4=4'd9)/ 费用的高四位是不是计到了9fee7:4<=4'd0; /计到9清零 else fee7:4<=fee7:4+1'd1;/ 费用的高四位没有计到9加1endelse fee3:0<=fee3:0+1'd1;/ 费用的低四位没有计到9加1end/end beginend/end alwaysendmodule /结束计费模块3.5.3 计费模块的仿真结果:3.6 数码管显示模块:3.6.1 数码管显示模块的框图:数码管有两种显示方式动态显示与静态显示,由于在本文中用到了八个数码管所以选择了动态显示,在时钟的控制

24、下,当reset为高电平的时候把费用,公里,时间译码输出。3.6.2 数码管显示的VerilogHDL源代码:module scan_led(clk1,dig,seg,distance,s,m,fee);input clk1;input7:0 distance,fee;/输入的公里,费用。input7:0 s;/输入的秒input7:0 m; / 输入的分。output7:0 dig; / 译码结果output7:0 seg; / 数码管的选择。reg 7:0 r_dig;/ 译码结果输出寄存器reg 7:0 r_seg; /数码管的选择寄存器。reg 3:0 disp_dat;reg3:0

25、a;assign dig=r_dig;assign seg=r_seg;always(posedge clk1)begin a<=a+1'd1; /数码管的选择endalways(posedge clk1)begincase(a) 4'd0: disp_dat=distance7:4;/公里的高四位用第一个数码管显示。4'd1: disp_dat=distance3:0;/公里的低四位用第二个数码管显示。4'd2: disp_dat=m7:4; /时间分的高四位用第三个数码管显示。4'd3: disp_dat=m3:0; /时间分的低四位用第四个数

26、码管显示4'd4: disp_dat=s7:4; /时间秒的高四位用第五个数码管显示。4'd5: disp_dat=s3:0; /时间秒的低四位用第六个数码管显示。4'd6: disp_dat=fee7:4;/费用的高四位用第七个数码管显示。4'd7: disp_dat=fee3:0; /费用的低四位用第八个数码管显示。default: disp_dat=4'b1010;endcasecase(a)4'd0:r_dig=8'b01111111; / 选择第一个数码管4'd1:r_dig=8'b10111111; / 选择第

27、二个数码管4'd2:r_dig=8'b11011111; / 选择第三个数码管4'd3:r_dig=8'b11101111; / 选择第四个数码管4'd4:r_dig=8'b11110111; / 选择第五个数码管4'd5:r_dig=8'b11111011; / 选择第六个数码管4'd6:r_dig=8'b11111101; / 选择第七个数码管4'd7:r_dig=8'b11111110; / 选择第八个数码管default:r_dig=8'b11111111;endcaseend/ *

28、译码结果*/always(disp_dat)begin case(disp_dat) 4'h0: r_seg=8'hc0;/ 显示0 4'h1: r_seg=8'hf9;/ 显示1 4'h2: r_seg=8'ha4;/ 显示2 4'h3: r_seg=8'hb0;/ 显示3 4'h4: r_seg=8'h99;/ 显示4 4'h5: r_seg=8'h92;/ 显示5 4'h6: r_seg=8'h82;/ 显示6 4'h7: r_seg=8'hf8;/ 显示7 4

29、'h8: r_seg=8'h80;/ 显示8 4'h9: r_seg=8'h90;/ 显示9 default: r_seg=8'hbf;endcaseendendmodule/结束译码模块3.7 顶层模块:各模块设计仿真实现后,可分别创建成元件符号。顶层就是将各分模块用Verilog HDL语言或者是图形方法连接起来,便可实现系统电路。3.7.1 顶层模块的VerilogHDL源代码:module taximeter(clk_50M,reset,start,seg,dig);/端口的定义input clk_50M,reset,start;/总的时钟信号,

30、复位信号,开始信号output7:0 seg,dig;/数码管的输出wire 7:0distance;/公里wire 7:0 s;/秒wire 7:0 m;/分wire7:0 fee;/费用wire clk; /计数时钟wire distance_enable;/公里控制费用的信号wire time_enable; /时间控制费用的信号wire select_clk; /控制信号wire clk1; /数码管显示的时钟/*模块的调用*/div u0(.clk_50M(clk_50M),.clk(clk),.reset(reset);/调用计数分频模块div1 u1(.clk_50M(clk_5

31、0M),.clk1(clk1),.reset(reset);/调用数码管显示分频模块Distancemokuai u2(.clk(clk),.start(start),.reset(reset),.distance(distance),.distance_enable(distance_enable); /调用计程模块timemokuai u4(.clk(clk),.reset(reset),.start(start),.s(s),.m(m),.time_enable(time_enable); /调用计时模块control u3(.start(start),.distance_enable(

32、distance_enable),.time_enable(time_enable),.select_clk(select_clk); /调用控制模块feemokuai u5(.reset(reset),.fee(fee),.select_clk(select_clk),.clk(clk); /调用计费模块scan_led U6(.clk1(clk1),.dig(dig),.seg(seg),.distance(distance),.s(s),.m(m),.fee(fee);/调用数码管显示模块endmodule/结束顶层模块4.验证方案:4.1 验证的流程图:4.2 验证的VerilogHD

33、L源代码:timescale 1ns/100ps/时间的单位与时间的精度module taximeter_tb;/验证的模块名字reg clk_50M,reset,start;/输入wire7:0 distance;/输出的公里wire 7:0 s;/输出的秒wire 7:0 m;/输出的分wire 7:0 fee;/输出的费用always #10 clk_50M=clk_50M;/时钟的周期是20nsinitial /激励设定begin reset=0; clk_50M=0; #1000 reset=1; start=1; #10000 start=0; #1000000 $finish;/

34、结束仿真end initial/实施监控 begin $monitor($time,"clk_50M=%d,reset=%d,start=%d,distance=%d,s=%d, fee=%d,m=%d,n" ,clk_50M,reset,start,distance,s,m,fee); end /调用被测试的模块/div u0(.clk_50M(clk_50M),.clk(clk),.reset(reset); /调用计数分频模块div1 u1(.clk_50M(clk_50M),.clk1(clk1),.reset(reset); /调用数码管分频模块distancemokuai u2(.clk(clk),.start(start),.reset(reset),.distance(distance),.distance_enable(distance_enable); /调用计程模块timemokuai u4(.clk(cl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论