📄 account.v
字号:
//--------卡式电话计费器----------//
//信号定义
//clk: 时钟信号
//card: 卡是否插入
//state: 电话接通信号
//decide: 电话局反馈回来的信号,代表话务种类,“01”表示市话,“10”表示长话,“11”表示特话。
//disptime: 显示本次通话的时长,其单位为分钟,这里假设能显示的最大时间为99分钟。
//dispmoney: 显示卡内余额,其单位为角,这里假设能显示的最大数额为50元,即500角。
//write,read: 当write信号下降沿到来时写卡;当话卡插入,read信号变高读卡。
//warn: 余额过少时的告警信号。当打市话时,余额少于3角,打长话时,余额少于6角,即会产生告警信号。
//cut: 当告警时间过长(>15s)时自动切断通话信号。
module account(clk,card,state,decide,disptime,dispmoney,write,read,warn,cut,t1m);
input clk,card,state;
input[1:0] decide;
output[7:0] disptime;
output[11:0] dispmoney;
output write,read,warn,cut,t1m;
reg write,warn,cut;
reg[11:0] money; // 中间变量,用于计费(卡内余额),以t1m为时钟信号!
reg[7:0] dtime; // 中间变量,用于通话计时,以t1m为时钟信号!
reg t1m; // 中间变量——分时钟,写卡的时间
reg set,reset_ena; // set为“0”时置money初值;reset_ena为“0”时复位cut信号
integer num1,temp; // num1——对通话时间计数;temp——用于计告警时间
assign dispmoney = card? money:0;
assign disptime = dtime;
assign read = card? 1:0;
// ----- 1.产生分时钟
always @(posedge clk)
begin
if(num1==59) begin num1<=0; t1m<=1; end // 若计到59s,则num1清零,t1m=1
else
begin
if(state) num1<=num1+1; // 若接通线路,则num1开始加1计数
else num1<=0;
t1m<=0;
end
end
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -