📄 km_counter.v
字号:
module km_counter(pause,clk,start,reset,
km_H,km_L,km_half,
fee_B,fee_H,fee_L);
output [3:0]km_H; //km计时的输出,公里的十位
output [3:0]km_L; //km计时的输出,公里的个位
output [3:0]km_half; //km计时的输出,公里的小数位
output [3:0]fee_B; //fee计时的输出,车费的百位
output [3:0]fee_H; //fee计时的输出,车费的十位
output [3:0]fee_L; //fee计的输出,车费的个位
input clk; //20兆赫兹晶振输入
input start; //开始的标志位,高有效
input reset; //复位标志,高有效。
input pause; //暂停的标志位,高有效
reg [3:0]km_H;
reg [3:0]km_L;
reg [3:0]km_half;
reg [3:0]fee_B;
reg [3:0]fee_H;
reg [3:0]fee_L;
reg fee_B_S; //加1允许标志
reg fee_H_S;
reg fee_L_S;
reg km_H_S; //加1允许标志
reg km_L_S;
reg km_half_S;
reg start_flag; // 开始标志
reg reset_flag; // 复位标志
integer n;
////////////////////////////////////////////////////////////////////////////////////////// 开始/暂停计时与清零标志 裁决
always @(posedge start or posedge reset or posedge pause) //
begin //---->开始/暂停计时标志有效,则将复位清零标志禁止
if(start==1'b1) //
begin start_flag<=1;reset_flag<=1'b0;end //
else if(reset==1'b1) //---->复位清零标志有效,则将开始/暂停计时标志禁止
begin start_flag<=0;reset_flag<=1'b1;end //
else if(pause==1'b1) //---->复位清零标志有效,则将开始/暂停计时标志禁止
begin start_flag<=0;reset_flag<=1'b0;end //
end //
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////计时模块
always @(posedge clk)
begin
if(start_flag==1) //
begin //
if(n==20000000) //
begin km_half_S<=1;n<=0;end //
else //
begin n<=n+1;end //
end //
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////复位清零开始
if(reset_flag==1)
begin
km_H<=4'b0000;km_L<=4'b0000;km_half<=4'b0000;
end
else
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////复位清零结束
if(km_half_S==1)
begin
if(km_L>=4'b0011)
begin
if(km_half==4'b0000)
begin fee_L_S<=1;end
else if(km_half==4'b0101)
begin fee_L_S<=1;end
else
begin fee_L_S<=0;end
end
else if(km_H!=4'b0000)
begin
if(km_half==4'b0001)
begin fee_L_S<=1;end
else if(km_half==4'b0101)
begin fee_L_S<=1;end
else
begin fee_L_S<=0;end
end
else
begin fee_L_S<=0;end
if(km_half==4'b1001)
begin km_half<=4'b0000;km_half_S<=~km_half_S;km_L_S<=1;end
else
begin km_half<=km_half+4'b0001;km_half_S<=~km_half_S;end
end
if(km_L_S==1)
begin
if(km_L==4'b1001)
begin km_L<=4'b0000;km_H_S<=1;km_L_S<=~km_L_S;end
else
begin km_L<=4'b0001+km_L;km_L_S<=~km_L_S;end
end
if(km_H_S==1)
begin
if(km_H==4'b1001)
begin km_H<=4'b0000;km_H_S<=~km_H_S;end
else
begin km_H<=km_H+4'b0001;km_H_S<=~km_H_S;end
end
//////////////////////////////////////////////////////////////////////////////////////////
if(fee_L_S==1)
begin
if(fee_L==4'b1001)
begin fee_L<=4'b0000;fee_L_S<=~fee_L_S;fee_H_S<=1;end
else
begin fee_L<=fee_L+4'b0001;fee_L_S<=~fee_L_S;end
end
if(fee_H_S==1)
begin
if(fee_H==4'b1001)
begin fee_H<=4'b0000;fee_B_S<=1;fee_H_S<=~fee_H_S;end
else
begin fee_H<=4'b0001+fee_H;fee_H_S<=~fee_H_S;end
end
if(fee_B_S==1)
begin
if(fee_B==4'b1001)
begin fee_B<=4'b0000;fee_B_S<=~fee_B_S;end
else
begin fee_B<=fee_B+4'b0001;fee_B_S<=~fee_B_S;end
end
///////////////////////////////////////////////////////////////////////////////////////////
if(km_H==4'b0000 && km_L==4'b0000 && km_half==4'b0000)
begin
fee_B<=4'b0000;fee_H<=4'b0001;fee_L<=4'b0000;
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -