基于fpga的出租车计费器设计(编辑修改稿)内容摘要:

,行驶/停止信号start为1),当时钟clk是上升沿的时候,系统即对路程计数器distance的里程计数器进行加计数,当路程超过三公里时,系统将输出标志正脉冲distance_enable。 计程模块的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=839。 d0。 end else if(start)// start 高电平有效 begin if(distance[3:0]==9)//判断distance的低四位计到了9没有 begin distance[3:0]=439。 d0。 //计到9清零 if(distance[7:4]==9) //判断distance的高四位计到了9没有 distance[7:4]=439。 d0。 //计到9清零 else distance[7:4]= distance[7:4]+139。 d1。 // distance的高四位没有计到9的时候加一 end else distance[3:0]=distance[3:0]+139。 d1。 // distance的低四位没有计到9的时候加一 end//end startend//end always//*产生distance_enable信号*//always@(posedge clk or negedge reset)beginif(!reset)begin distance_enable=139。 d0。 //复位endelse if(distance839。 d2)// 大于公里三的时候 begin distance_enable=139。 d1。 //输出distance_enable信号 endend//end alwaysendmodule//结束计程模块 计程模块的仿真结果:从波形图可以看出在时钟的控制下,当reset为高电平且start为高电平的时候distance开始计数,当计到大于三的时候输出了distancedistance_enable为高电平。 : 计时模块的框图:此模块用于计算停车等待的时间。 在出租车行进中,如果车辆停止等待,计数器则在1Hz信号clk的上升沿进行加计数,每60次产生进位脉冲使分钟计数器位进行加计数,当累计等待时间超过2(不包括2分钟)分钟时,输出标志time_enable正脉冲信号。 计时模块的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=839。 d0。 m=839。 d0。 endelse if(!start)//start 信号低电平有效beginif(s[3:0]==9)// 秒的低四位是9 begin s[3:0]=439。 d0。 //清零 if(s[7:4]==5) // 秒的高四位是5 begin s[7:4]=439。 d0。 //清零 if(m[3:0]==9) // 分的低四位是9 begin m[3:0]=439。 d0。 //清零 if(m[7:4]==9) // 分的高四位是9 m[7:4]=439。 d0。 //清零 else m[7:4]=m[7:4]+139。 d1。 // 分的高四位不是9加一endelse m[3:0]=m[3:0]+139。 d1。 //分的低四位不是9加一endelse s[7:4]=s[7:4]+139。 d1。 // 秒的高四位不是5加一endelse s[3:0]=s[3:0]+139。 d1。 //秒的低四位不是9加一 end//end alwaysend assign time_enable=((m[7:0]839。 d3)amp。 amp。 (s[7:0]==839。 d0))?139。 d1:139。 d0。 //产生time_enable信号。 endmodule//结束计时模块 计时模块的仿真结果:两分钟之内(包括两分钟)的仿真结果如下所示:从波形图可以看出在clk的控制下当start为低电平reset为高电平的时候时间计数,time_enable为低电平。 两分钟之外(不包括两分钟)的仿真结果如下所示:从波形图可以看出在clk的控制下当start为低电平reset为高电平的时候时间计数,当时间大于二分钟的时候,time_enable为输出高电平。 : 控制模块的框图:控制模块用于为计费模块提供时钟,当start高电平的时候选择公里计费,输出的时钟信号为distance_enable,当start低电平的时候选择时间计费,输出的时钟信号为time_enable, 控制模块的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//结束控制模块 控制模块的仿真结果:(1)公里计费的仿真结果如下所示:从波形图可以看出当start为高电平的时候输出的信号是distance_enable。 (2)时间计费的仿真结果如下所示:从波形图可以看出当start为低电平的时候输出的信号是time_enable。 计费模块: 计费模块的框图:费用计数器模块用于出租车启动后,根据行驶路程和等待时间计算费用。 当出租车停车时,;当车处于行驶状态且满3公里时,select_clk信号选择distans_enable,此后路程每满1公里,费用计数器加1元;当出租车处于停止等待状态且时钟满2分钟时,select_clk信号选择time_enable信号,时间每满1分钟,费用计数器加1元。 计费模块的VerilogHDL源代码如下所示:module feemokuai(select_clk,reset,fee,clk)。 input select_clk,reset,clk。 output[7:0] fee。 //输出的费用reg [7:0] fee。 always@(posedge clk or negedge reset)//异步复位begin if(!reset)//低电平有效 begin fee=839。 d8。 //起步为8元 end else if(select_clk==139。 d1) begin if(fee[3:0]==439。 d8)//费用的低四位是不是计到了8 begin fee[3:0]=439。 d0。 //计到9清零 if(fee[7:4]==439。 d9)// 费用的高四位是不是计到了9fee[7:4]=439。 d0。 //计到9清零 else fee[7:4]=fee[7:4]+139。 d1。 // 费用的高四位没有计到9加1endelse fee[3:0]=fee[3:0]+439。 d2。 // 费用的低四位没有计到8加2end//end beginend//end alwaysendmodule //结束计费模块 计费模块的仿真结果: 数码管显示模块: 数码管显示模块的框图:数码管有两种显示方式动态显示与静态显示,由于在本文中用到了八个数码管所以选择了动态显示,在时钟的控制下,当reset为高电平的时候把费用,公里,时间译码输出。 数码管显示的VerilogHDL源代码:module scan_led(clk1,dig,seg,distance,s,m,fee)。 input clk1。 input[7:0] distance,fee。 //输入的公里,费用。 input[7:0] s。 //输入的秒input[7:0] m。 // 输入的分。 output[7:0] dig。 // 译码结果output[7:0] seg。 // 数码管的选择。 reg [7:0] r_dig。 // 译码结果输出寄存器reg [7:0] r_seg。 //数码管的选择寄存器。 reg [3:0] disp_dat。 reg[3:0] a。 assign dig=r_dig。 assign seg=r_seg。 always@(posedge clk1)begin a=a+139。 d1。 //数码管的选择endalways@(posedge clk1)begincase(a) 439。 d0: disp_dat=distance[7:4]。 //公里的高四位用第一个数码管显示。 439。 d1: disp_dat=distance[3:0]。 //公里的低四位用第二个数码管显示。 439。 d2: disp_dat=m[7:4]。 //时间分的高四位用第三个数码管显示。 439。 d3: disp_dat=m[3:0]。 //时间分的低四位用第四个数码管显示439。 d4: disp_dat=s[7:4]。 //时间秒的高四位用第五个数码管显示。 439。 d5: disp_dat=s[3:0]。 //时间秒的低四位用第六个数码管显示。 439。 d6: disp_dat=fee[7:4]。 //费用的高四位用第七个数码管显示。 439。 d7: disp_dat=fee[3:0]。 //费用的低四位用第八个数码管显示。 default: disp_dat=439。 b1010。 endcasecase(a)439。 d0:r_dig=839。 b01111111。 // 选择第一个数码管439。 d1:r_dig=839。 b10111111。 // 选择第二个数码管439。 d2:r_dig=839。 b11011111。 // 选择第三个数码管439。 d3:r_dig=839。 b11101111。 // 选择第四个数码管439。 d4:r_dig=839。 b11110111。 // 选择第五个数码管439。 d5:r_dig=839。 b11111011。 // 选择第六个数码管439。 d6:r_dig=839。 b11111101。 // 选择第七个数码管439。 d7:r_dig=839。 b11111110。 // 选择第八个数码管default:r_dig=839。 b11111111。 endcaseend// *译码结果*//always@(disp_dat)begin case(disp_dat) 439。 h0: r_seg=839。 hc0。 // 显示0 439。 h1: r_seg=839。 hf9。 // 显示1 439。 h2: r_seg=839。 ha4。 // 显示2 439。 h3: r_seg=839。 hb0。 // 显示3 439。 h4: r_seg=839。 h99。 // 显示4 439。 h5: r_seg=839。 h92。 // 显示5 439。 h6: r_seg=839。 h82。 // 显示6 439。 h7: r_seg=839。 hf8。 // 显示7 439。 h8: r_seg=839。 h80。 // 显示8 439。 h9: r_seg=839。 h90。 // 显示9 default: r_seg=839。 hbf。 endcaseendendmodule//结束译码模块 顶层模块:各模块设计仿真实现后,可分别创建成元件符号。 顶层就是将各分模块用Verilog HDL语言或者是图形方法连接起来,便可实现系统电路。 顶层模块的VerilogHDL源代码:module taximeter(clk_50M,reset,start,seg,dig)。 //端口的定义。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。