科研训练报告基于FPGA的出租车计价器设计

上传人:仙*** 文档编号:37460387 上传时间:2021-11-03 格式:DOC 页数:19 大小:1.02MB
返回 下载 相关 举报
科研训练报告基于FPGA的出租车计价器设计_第1页
第1页 / 共19页
科研训练报告基于FPGA的出租车计价器设计_第2页
第2页 / 共19页
科研训练报告基于FPGA的出租车计价器设计_第3页
第3页 / 共19页
点击查看更多>>
资源描述
西安邮电学院科研训练报告基于FPGA的出租车计价器设计院系:电子工程学院姓名: 专业班级:微电子(05)学号: 81目录摘要21引言:22系统规范:22.1,出租车计价器的要求:22.2 ,系统组成框图:23 .各模块设计:33.1分频模块:33.1.1,计数器的分频模块:33.1 .3,计数器的分频模块VerilogHDL源代码:43.1 .4,仿真的结果:43.1.5,数码管的分频模块:43.1 .6 ,具体框图:43.1 .7,数码管的分频模块VerilogHDL源代码:53.2,计程模块:53.2.1,计程模块的框图:53.2.2计程模块的VerilogHDL源代码:53.2.3计程模块的仿真结果:63.3计时模块:73.3.1,计时模块的框图:73.3.2,计时模块的VerilogHDL源代码:73.3.3计时模块的仿真结果:83.4,控制模块:83.4.1, 控制模块的框图:93.4.2,控制模块的VerilogHDL源代码:93.4.3,控制模块的仿真结果:93.5,计费模块:93.5.1计费模块的框图:93.5.2,计费模块的VerilogHDL源代码如下所示:103.5.3,计费模块的仿真结果:103.6,数码管显示模块:113.6.1,数码管显示模块的框图:113.6.2,数码管显示的VerilogHDL源代码:113.7,顶层模块:133.7.1,顶层模块的VerilogHDL源代码:134.验证方案:144.1,验证的流程图:144.2,验证的VerilogHDL源代码:154.3,系统仿真:155.综合:175.1, Quartus II软件综合的报表:175.2,综合的RTL级电路:176. 结束语:187.参考文献:18基于FPGA的出租车计价器设计2系统规范:2.1,出租车计价器的要求: 行程3公里内(包括3公里),且等待累计时间2分钟内(包括2分钟),起步费为10元; 3公里外(不包括3公里)以每公里2元,等待累计时间2分钟外(不包括2分钟)以每分钟以1.0元计费。 能显示行驶公里数、等待累计时间和最后的总费用。本计费器的显示范围为099元,计价分辨率为1元;计程器显示范围为099公里,分辨率为1公里;计时器的显示范围是分钟的显示范围是099, 辨率为1分钟。秒的显示范围是059。辨率为1秒。2.2 ,系统组成框图:出租车的一般计费过程为:出租车载客后,启动计费器,整个系统开始运行,里程计数器和时间计数器从0开始计数,费用计数器从10开始计算。再根据行驶里程或停止等待的时间按以上的标准计费。若在行驶状态,则计程器开始加计数,当路程超过三公里后,计费器以每公里2元累加。若出租车停止等待状态,则计时器开始加计数,当时间超过两分钟后,计费器以每分钟1元累加。出租车到达目的地停止后,停止计费器,显示总费用。根据出租车计费器的工作过程,本系统采用分层次、分模块的方式设计,其本系统组成框图如下所示。其中行驶路程计数模块、等待时间计数模块和计费模块,用来统计路程、等待时间和总费用,控制模块是用来控制计费模块,数码管显示模块用来显示行驶的公里数、等待累计时间和总费用等信息。系统框图如下所示:3 .各模块设计:本系统采用层次化、模块化的设计方法,设计顺序为自下向上。首先实现系统框图中的各子模块,然后由顶层模块调用各子模块来完成整个系统。为了便于显示,这里的路程、时间和费用计数器均用十六进制表示。3.1分频模块:3.1.1,计数器的分频模块:3.1 .2 ,计数器的分频模块具体框图: 此模块的功能是对总的时钟进行分频,分出的频率是让计数器用的,因为总的时钟是50M的。设计该模块的时候用了一个32位的计数器,当计数器计到25_000000的时候产生时钟。在仿真的时候为了方便观察设计了一个8分频的电路。当下载的时候用的是2HZ的时钟 。3.1 .3,计数器的分频模块VerilogHDL源代码:module div(clk_50M,clk,reset);/ 端口的定义input clk_50M,reset;/ 总的时钟是50Moutput clk;/分频后输的时钟 reg clk;reg 31:0 count;/32位的计数器always (posedge clk_50M or negedge reset)/异步复位begin if(!reset) begin clk=d0; count=32d0;endelse if(count=32d25_000000)/ 判断计时器记到了25_000000吗 begin count=32d0;/计到25_000000计数器清零 clk=clk;/输出的时钟取反 end/end begin else count=count+1d1;/ 没计到25_000000计数器加一end/end alwaysendmodule / 结束分频模块3.1 .4,仿真的结果: 从波形可以看出当reset为低电平的时候clk为零,当为高电平的时候clk的高电平占了clk_50M的八个周期,低电平也占了clk_50M的八个周期。3.1.5,数码管的分频模块:3.1 .6 ,具体框图: 此模块的功能是对总的时钟进行分频,分出的频率是让数码管用的,因为总的时钟是50M的。设计该模块的时候用了一个32位的计数器,当计数器计到50_000的时候产生时钟。在仿真的时候为了方便观察设计了一个8分频的电路。3.1 .7,数码管的分频模块VerilogHDL源代码:module div1(clk_50M,clk1,reset);/ 端口的定义input clk_50M,reset;/ 总的时钟是50Moutput clk1;/分频后输的时钟 reg clk1;reg 31:0 count;/32位的计数器always (posedge clk_50M or negedge reset)/异步复位begin if(!reset) begin clk1=d0; count=32d0;endelse if(count=32d50_000)/ 判断计时器记到了50_000吗 begin count=32d0;/计到50_000计数器清零 clk1=clk1;/输出的时钟取反 end/end begin else count=count+1d1;/ 没计到50_000计数器加一end/end alwaysendmodule / 结束分频模块3.2,计程模块:3.2.1,计程模块的框图:此模块的功能是计算出租车行驶的路程。在出租车启动并行驶的过程中(即复位/启动信号reset为0,行驶/停止信号start为1),当时钟clk是上升沿的时候,系统即对路程计数器distance的里程计数器进行加计数,当路程超过三公里时,系统将输出标志正脉冲distance_enable。3.2.2计程模块的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=8d0; end else if(start)/ start 高电平有效 begin if(distance3:0=9)/判断distance的低四位计到了9没有 begin distance3:0=4d0;/计到9清零 if(distance7:4=9) /判断distance的高四位计到了9没有 distance7:4=4d0;/ /计到9清零 else distance7:4= distance7:4+1d1;/ distance的高四位没有计到9的时候加一 end/end begin else distance3:0=distance3:0+1d1;/ distance的低四位没有计到9的时候加一 end/end startend/end always/*产生distance_enable信号*/always(posedge clk or negedge reset)beginif(!reset)begin distance_enable8d1)/ 公里大于三的时候 begin distance_enable=1d1;/输出distance_enable信号 end/end beginend/end alwaysendmodule/结束计程模块3.2.3计程模块的仿真结果:从波形图可以看出在时钟的控制下当reset为低电平的时候distance,distance为零,当reset为高电平且start为高电平的时候distance开始计数,当计到大于三的时候输出了distancedistance_enable为高电平。3.3计时模块:3.3.1,计时模块的框图:此模块用于计算停车等待的时间。在出租车行进中,如果车辆停止等待,计数器则在1 Hz信号clk的上升沿进行加计数,每60次产生进位脉冲使分钟计数器位进行加计数,当累计等待时间超过2(不包括2分钟)分钟时,输出标志time_enable正脉冲信号。3.3.2,计时模块的VerilogHDL源代码:module timemokuai(clk,reset,start,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=8d0;m=8d0;endelse if(!start)/start 信号低电平有效beginif(s3:0=9)/ 秒的低四位是9 begin s3:0=4d0;/清零 if(s7:4=5) / 秒的高四位是5 begin s7:4=4d0; /清零 if(m3:0=9) / 分的低四位是9 begin m3:0=4d0; /清零 if(m7:4=9) / 分的高四位是9 m7:4=4d0; /清零 else m7:4=m7:4+1d1; / 分的高四位不是9加一endelse m3:0=m3:0+1d1; /分的低四位不是9加一endelse s7:4=s7:4+1d1; / 秒的高四位不是5加一endelse s3:08d2)&(s7:0=8d0)?1d1:1d0;/产生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源代码:module control(start,distance_enable,time_enable,select_clk);input start,distance_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,控制模块的仿真结果:公里计费的仿真结果如下所示:从波形图可以看出当start高电平的时候输出的信号是distance_enable。时间计费的仿真结果如下所示:从波形图可以看出当start低电平的时候输出的信号是time_enable。3.5,计费模块:3.5.1计费模块的框图:费用计数器模块用于出租车启动后,根据行驶路程和等待时间计算费用。当出租车停车时,时钟select_clk用于将费用计数器复位为起步价10元;当车处于行驶状态且满3公里时,select_clk信号选择distans_enable,此后路程每满1公里,费用计数器加1元;当出租车处于停止等待状态且时钟满2分钟时,select_clk信号选择time_enable信号,时间每满1分钟,费用计数器加1元。3.5.2,计费模块的VerilogHDL源代码如下所示: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=8h10;/起步为十元 end else if(select_clk=1d1) begin if(fee3:0=4d9)/费用的低四位是不是计到了9 begin fee3:0=4d0;/计到9清零 if(fee7:4=4d9)/ 费用的高四位是不是计到了9fee7:4=4d0; /计到9清零 else fee7:4=fee7:4+1d1;/ 费用的高四位没有计到9加1endelse fee3:0=fee3:0+1d1;/ 费用的低四位没有计到9加1end/end beginend/end alwaysendmodule /结束计费模块3.5.3,计费模块的仿真结果:公里计费的仿真结果如下所示:时间计费的仿真结果如下所示:两分钟之内(包括两分钟)的计费仿真结果如下所示:两分钟之外(不包括两分钟)的仿真结果如下所示:3.6,数码管显示模块:3.6.1,数码管显示模块的框图:数码管有两种显示方式动态显示与静态显示,由于在本文中用到了七个数码管所以选择了动态显示,在时钟的控制下,当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 a;assign dig=r_dig;assign seg=r_seg;always(posedge clk1)begin a=a+1d1;/数码管的选择endalways(posedge clk1)begincase(a) 4d0: disp_dat=distance7:4;/公里的高四位用第一个数码管显示4d2: disp_dat=m7:4; /时间分的高四位用第三个数码管显示。4d3: disp_dat=m3:0; /时间分的低四位用第四个数码管显示4d4: disp_dat=s7:4; /时间秒的高四位用第五个数码管显示。4d5: disp_dat=s3:0; /时间秒的低四位用第六个数码管显示。4d6: disp_dat=fee7:4;/费用的高四位用第七个数码管显示。4d7: disp_dat=fee3:0; /费用的低四位用第八个数码管显示。default: disp_dat=4b1010;endcasecase(a)4d0:r_dig=8b01111111;/ 选择第一个数码管4d1:r_dig=8b10111111;/ 选择第二个数码管4d2:r_dig=8b11011111; / 选择第三个数码管4d3:r_dig=8b11101111; / 选择第四个数码管4d4:r_dig=8b11110111; / 选择第五个数码管4d5:r_dig=8b11111011; / 选择第六个数码管4d6:r_dig=8b11111101; / 选择第七个数码管4d7:r_dig=8b11111110; / 选择第八个数码管default:r_dig=8b11111111;endcaseend/ *译码结果*/always(disp_dat)begin case(disp_dat) 4h0: r_seg=8hc0;/ 显示0 4h1: r_seg=8hf9;/ 显示1 4h2: r_seg=8ha4;/ 显示2 4h3: r_seg=8hb0;/ 显示3 4h4: r_seg=8h99;/ 显示4 4h5: r_seg=8h92;/ 显示5 4h6: r_seg=8h82;/ 显示6 4h7: r_seg=8hf8;/ 显示7 4h8: r_seg=8h80;/ 显示8 4h9: r_seg=8h90;/ 显示9 default: r_seg=8hbf;endcaseendendmodule/结束译码模块3.7,顶层模块:各模块设计仿真实现后,可分别创建成元件符号。顶层就是将各分模块用Verilog HDL语言或者是图形方法连接起来,便可实现系统电路。3.7.1,顶层模块的VerilogHDL源代码:module taximeter(clk_50M, reset,start,seg,dig);/ 端口的定义input clk_50M,reset,start;/总的时钟信号,复位信号,开始信号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_50M),.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(distance_enable),.time_enable(time_enable),.select_clk(select_clk);/调用控制模块feemokuai u5(.reset(reset),.fee(fee),.select_clk(select_clk),.clk(clk);/调用计费模块scan_led (.clk1(clk1),.dig(dig),.seg(seg),.distance(distance),.s(s),.m(m),.fee(fee);/调用数码管显示模块endmodule/结束顶层模块4.验证方案:4.1,验证的流程图:设计规范结束 Testbench的创建验证规范 不满足运行,调试检查验证规范 不合格所有测试都满足覆盖要求 合格 验证规范结束满足 创建回归测试4.2,验证的VerilogHDL源代码: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;/时钟的周期是20initialbegin/激励 reset=0; clk_50M=0; #1000 reset=1; start=1; #10000 start=0; #1000000 $finish;/结束仿真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 taximeter wsm(.clk_50M(clk_50M),.reset(reset),.start(start),.distance(distance),.s(s),.fee(fee),.m(m);/调用被测试的模块 endmodule/结束测试模块4.3,系统仿真:初步设计完成后,即可将分模块和顶层模块进行仿真测试,同时可根据设计要求加入测试输入条件。仿真后得到的相应输出结果如与预先的结果不相符,则应修改设计,直到相符为止。没有译码的仿真结果如下所示: (a)为行驶中未停时的系统电路仿真结果:(b)为行驶中停止时(在两分钟之内)的系统电路仿真结果:(c)为行驶中停止时(在两分钟之外)的系统电路仿真结果:从(a)可以看出当reset=1时,系统复位,路程计数器、和等待时间计数器均为0,费用计数器为10元;当reset为0时,系统启动,start=1表示出租车行驶, distance_enable每产生一个脉冲,路程计数器加1;路程3公里内,费用保持10不变,超过3公里,费用计数器进行加计数,每增加1公里费用加1元,此时等待时间计数器不变。而根据 (b) ,(c)的仿真波形可知,当reset为0时,系统启动,start=0表示出租车处于停止等待状态,此时等待时间计数器计数,在2分钟等待时间内,费用计数器不变;等待时间超过2分钟后,每增加1分钟,费用计数器增加1元,此时路程计数器保持不变。5.综合: 5.1, Quartus II软件综合的报表:5.2,综合的RTL级电路: 从综合的RTL级电路可以看出完全符合系统规范。6. 结束语:本文介绍了一种全新的出租车计价器计费系统的FPGA设计方法。如果将该设计再结合到实际应用中,那么,只需改变设计中计费要求,就可以应用到出租车上。另外,如果再任意输入该出租车计价器的计费标准,那么,它的适用范围可能就更广泛了。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 成人自考


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!