您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页编程

编程

来源:华佗小知识


网友推荐答案

我去年做过这个,和你的要求差不多,暂停键相当于你的停止计费键,停止键详单与你的归零键,换挡键你就不用管它(按一档的速度运行),晶振的能改成50M就行了,能调的通。

1.设计要求

设计一个出租车计费器,能按路程计费,具体要求如下

(1)实现计费功能,计费标准为:按行驶里程计费,起步价为6.00元,并在车行驶3km后按1.2元/km计费,当计费器达到或超过20元时,每公里加收50%的车费,车停止和暂停时不计费。

(2)现场模拟汽车的启动、停止、暂停、和换档等状态。

(3)设计数码管动态扫描电路,将车费和路程显示出来,各有两位小数。 2.设计原理

设该出租车有启动键、停止键、暂停键、和挡位键。启动键为脉冲触发信号,当其为一个脉冲时,表示汽车以启动,并根据车速的选择和基本车速发出响应频率的脉冲(计费脉冲)来实现车费和路程的计数,同时车费显示起步价;当停止键为高电平时,表示汽车熄火,同时停止发出脉冲,此时车费和路程计数清零;当暂停键为高电平时,表示汽车暂停并停止发出脉冲,此时车费和路程计数暂停;挡位键用来改变车速,不同的挡位对应着不同的车速,同时路程计数的速度也不同。

出租车计费器可分为两大模块:控制模块和译码显示模块,系统框图如图9-9-1所示。控制模块实现了计费和路程的计数,并且通过不同的挡位来控制车速 。译码显示模块实现十进制到4为十进制的转换以及车费和路程的显示 。

module taxi(scan,seg7,dp,clk20mhz,clk,start,stop,pause,speedup); output[7:0] scan; //数码管地址选择信号

output[6:0] seg7; //7段显示控制信号(abcdefg) output dp; //小数点

input clk20mhz; //系统时钟为20MHz input clk; //计费时钟 input start; //汽车起动 input stop; //汽车停止 input pause; //汽车暂停

input[1:0] speedup; //挡位(4个挡位) reg[7:0] scan; reg[6:0] seg7;

reg dp;

reg[15:0] money_reg; //车费寄存器 reg[15:0] distance_reg; //路程寄存器 reg[3:0] num; //控制车速的计数器 reg[15:0] dis; //千米计数器 reg d; //千米标志位

reg clk1khz; //1kHz的分频时钟,用于扫描数码管地址 reg[3:0] data;

reg[3:0] m_one,m_ten,m_hun,m_tho; //钱数的4位十进制表示 reg[3:0] d_one,d_ten,d_hun,d_tho; //路程的4位十进制表示 reg[15:0] count; reg[15:0] comb1;

reg[3:0] comb1_a,comb1_b,comb1_c,comb1_d; reg[15:0] comb2;

reg[3:0] comb2_a,comb2_b,comb2_c,comb2_d; reg[2:0] cnt;

always @(posedge clk) begin

if(stop) //汽车停止,计费和路程清零 begin money_reg<='d0; distance_reg<='d0; dis<='d0; num<='d0; end

else if(start) //汽车起动后,起步价为6元 begin money_reg<='d600; distance_reg<='d0; dis<='d0; num<='d0; end else begin

if(!start&&!speedup&&!pause&&!stop) //1挡 begin

if(num=='d9) begin num<='d0;

distance_reg<=distance_reg+1; dis<=dis+1; end else

begin num<=num+1; end end

else if(!start&&speedup=='b01&&!pause&&!stop) begin

if(num=='d9) begin num<='d0;

distance_reg<=distance_reg+2;

//2挡

dis<=dis+2; end else

begin num<=num+1; end end

else if(!start&&speedup=='b10&&!pause&&!stop) //3挡 begin

if(num=='d9) begin num<='d0;

distance_reg<=distance_reg+5; dis<=dis+5; end else

begin num<=num+1; end end

else if(!start&&speedup=='b11&&!pause&&!stop) //4挡 begin

distance_reg<=distance_reg+1; dis<=dis+1; end end

if(dis>='d100)

begin d<='d1;dis<='d0; end else

begin d<='d0; end

if(distance_reg>='d300) //如果超过3km则按1.2元/km计算 begin

if(money_reg<'d2000&&d=='d1)

begin money_reg<=money_reg+'d120; end else if(money_reg>='d2000&&d=='d1) begin money_reg<=money_reg+'d180; end

end

//-------------------当计费器达到20元时,每千米加收50%的车费------------- end

//---------------------------1kHz的分频时钟,用于扫描数码管地址---------------------- always @(posedge clk20mhz) begin

if(count=='d10000)

begin clk1khz<=~clk1khz;count<='d0; end else

begin count<=count+1; end

//----------------------------将车费的十进制数转化为4位十进制数-----------------------

if(comb1if(comb1_a=='d9&&comb1_b=='d9&&comb1_c=='d9) begin

comb1_a<='b0000; comb1_b<='b0000; comb1_c<='b0000; comb1_d<=comb1_d+1; comb1<=comb1+1; end

else if(comb1_a=='d9&&comb1_b=='d9) begin

comb1_a<='b0000; comb1_b<='b0000; comb1_c<=comb1_c+1; comb1<=comb1+1; end

else if(comb1_a=='d9) begin

comb1_a<='b0000; comb1_b<=comb1_b+1; comb1<=comb1+1; end else begin

comb1_a<=comb1_a+1; comb1<=comb1+1; end end

else if(comb1==money_reg) begin

m_one<=comb1_a; m_ten<=comb1_b; m_hun<=comb1_c; m_tho<=comb1_d; end

else if(comb1>money_reg) begin

comb1_a<='b0000; comb1_b<='b0000; comb1_c<='b0000; comb1_d<='b0000;

comb1<='d0;

end

//---------------------------将路程的十进制转化为4位十进制数----------------------- if(comb2if(comb2_a=='d9&&comb2_b=='d9&&comb2_c=='d9) begin

comb2_a<='b0000; comb2_b<='b0000; comb2_c<='b0000; comb2_d<=comb2_d+1; comb2<=comb2+1; end

else if(comb2_a=='d9&&comb2_b=='d9) begin

comb2_a<='b0000; comb2_b<='b0000; comb2_c<=comb2_c+1; comb2<=comb2+1; end

else if(comb2_a=='d9) begin

comb2_a<='b0000; comb2_b<=comb2_b+1; comb2<=comb2+1; end else begin

comb2_a<=comb2_a+1; comb2<=comb2+1; end end

else if(comb2==distance_reg) begin

d_one<=comb2_a; d_ten<=comb2_b; d_hun<=comb2_c; d_tho<=comb2_d; end

else if(comb2>distance_reg) begin

comb2_a<='b0000;

comb2_b<='b0000; comb2_c<='b0000; comb2_d<='b0000; comb2<='d0; end end

//-----------------------------数码管动态扫描---------------------------------- always @(posedge clk1khz) begin cnt<=cnt+1; end

always @(cnt) begin case(cnt)

'b000:begin data<=m_one;dp<='d0;scan<='b00000001; end 'b001:begin data<=m_ten;dp<='d0;scan<='b00000010; end 'b010:begin data<=m_hun;dp<='d1;scan<='b00000100; end 'b011:begin data<=m_tho;dp<='d0;scan<='b00001000; end 'b100:begin data<=d_one;dp<='d0;scan<='b00010000; end 'b101:begin data<=d_ten;dp<='d0;scan<='b00100000; end 'b110:begin data<=d_hun;dp<='d1;scan<='b01000000; end 'b111:begin data<=d_tho;dp<='d0;scan<='b10000000; end default:begin data<='bx;dp<='bx;scan<='bx; end endcase

end

//---------------------------------7段译码---------------------------------- always @(data) begin

case(data[3:0])

4'b0000:seg7[6:0]=7'b1111110; 4'b0001:seg7[6:0]=7'b0110000; 4'b0010:seg7[6:0]=7'b1101101; 4'b0011:seg7[6:0]=7'b1111001; 4'b0100:seg7[6:0]=7'b0110011; 4'b0101:seg7[6:0]=7'b1011011; 4'b0110:seg7[6:0]=7'b1011111; 4'b0111:seg7[6:0]=7'b1110000; 4'b1000:seg7[6:0]=7'b1111111; 4'b1001:seg7[6:0]=7'b1111011; default:seg7[6:0]=7'b0000000; endcase

end

endmodule

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务