高中生
最后登录1970-1-1
在线时间 小时
注册时间2020-12-19
|
/*
*出租车计价器
*功能:1、初始化计价 10元
2、数码管按键切换显示价格和里程
3、速度300m/s
4、可以通过拨码开关进行清零和保持当前价格和里程
5、当里程十位无数据时,不显示
6、数码管最高位分别显示当前显示的内容字母,d显示距离,C显示价格
*匀速状态
*By:鱼芯工作室
*更多请关注微信公众号:智能车杂谈
*/
module taxi_prj(clkin,rstn,led,dataout,dot,en,Key);
input clkin,rstn;
input [2:0] Key;
output led;
output[7:1] dataout;
output dot;
output[3:0] en;//COM使能输出
reg led;
reg [10:0] cnt;
reg[7:1] dataout;//各段数据输出
reg dot;//各段数据输出.
reg[3:0] en;
reg[1:0] cnt_scan;//扫描频率计数器
reg[3:0] dataout_buf;
reg [4:0] data_ten,data_ge,data_dot,init_cost;
reg [16:0] distance;
reg [16:0] cost;
gen_div U1(.clkin(clkin),.rstn(rstn),.clkout(clkout));//1ms
always@(posedge clkout or negedge rstn)
begin
if(!rstn)
begin
cnt <= 0;
distance <= 0;
data_ten<=0;
data_ge<=0;
data_dot<=0;
init_cost <= 10;
cost<=0;
end
else if(cnt == 2000)
begin
cnt <= 0;
led <= ~led;
if(Key[2]==1 || Key[1] == 1)
begin
if(Key[1] == 1)
begin
distance <= 0;
data_ten<=0;
data_ge<=0;
data_dot<=0;
init_cost <= 10;
cost<=0;
end
else
begin
distance <= distance ;
data_ten<=data_ten;
data_ge<=data_ge;
data_dot<=data_dot;
cost<=cost;
end
end
else
begin
distance <= distance+300;
data_ten<=distance/10000%10;
data_ge<=distance/1000%10;
data_dot<=distance/100%10;
if(distance<=3000 && distance >0)
begin
init_cost <= 10;
cost = init_cost *10;
end
else
cost <=init_cost *10+2*(distance-3000)/100;
end
end
else cnt <= cnt + 1;
end
//segment
always@(posedge clkout or negedge rstn)
begin
if(!rstn)
begin //低电平复位
cnt_scan<=0;
end
else
begin
cnt_scan<=cnt_scan+1;
end
end
always @(cnt_scan)//段码扫描频率
begin
case(cnt_scan[1:0])
2'b00 :
en = 4'b1110;
2'b01 :
en = 4'b1101;
2'b10 :
en = 4'b1011;
2'b11 :
en = 4'b0111;
default :
en = 4'b1110;
endcase
end
always @ (Key[0],en) //对应COM信号给出各段数据,段码
case(Key[0])
1'b0:
begin
case(en)
4'b1110:
begin
dataout_buf<= 13;//输入将要显示的数字
dot <= 1;
end
4'b1101:
begin
if(data_ten!==0)
begin
dataout_buf<=data_ten;
dot <= 1;
end
else
begin
dataout_buf<=7'b1111_111;
dot <= 1;
end
end
4'b1011:
begin
dataout_buf <= data_ge;
dot <= 0;
end
4'b0111:
begin
dataout_buf<=data_dot;
dot <= 1;
end
default:
dataout_buf=1;
endcase
end
1'b1:
begin
case(en)
4'b1110:
begin
dataout_buf<= 12;//输入将要显示的数字
dot <= 1;
end
4'b1101:
begin
dataout_buf<=cost/100;
dot <= 1;
end
4'b1011:
begin
dataout_buf <= cost/10%10;
dot <= 0;
end
4'b0111:
begin
dataout_buf<=cost%10;
dot <= 1;
end
default:
dataout_buf=1;
endcase
end
default:dataout_buf=0;
endcase
always@(dataout_buf)
begin
case(dataout_buf) //将要显示的数字译成段码
4'b0000://0
dataout=7'b0000_001;
4'b0001://1
dataout=7'b1001_111;
4'b0010://2
dataout=7'b0010_010;
4'b0011://3
dataout=7'b0000_110;
4'b0100://4
dataout=7'b1001_100;
4'b0101://5
dataout=7'b0100_100;
4'b0110://6
dataout=7'b0100_000;
4'b0111://7
dataout=7'b0001_111;
4'b1000://8
dataout=7'b0000_000;
4'b1001://9
dataout=7'b0000_100;
4'b1010://A
dataout=7'b0001_000;
4'b1011://B
dataout=7'b1100_000;
4'b1100://C
dataout=7'b0110_001;
4'b1101://D
dataout=7'b1000_010;
4'b1110://E
dataout=7'b0010_000;
default://这里仅编译了0-9这几个数字
dataout=7'b1111_111;//全灭
endcase
end
endmodule
|
|