📄 xiaolizi1588.v
字号:
/*信号定义
clk:时钟信号,取频率值1HZ;
decide:电信局反馈回来的信号,代表话务种类,01表示市话,10表示长话,11表示特话;
dispmoney:用来显示卡内的余额,其单位为角,假定最大数值为500角;
disptime:显示本次通话的时间;
write,read:当write信号下降沿来到时写卡,当话卡插入,read信号变高时读卡;
warn:余额过少时的告警信号,规定当打市话时,余额少于3角,打长话时,余额少于6角时,即产生告警信号;
cut:当告警时间过长时自动切断通话信号*/
module
xiaolizi1588(state,clk,card,decide,disptime,dispmoney,write,read,warn,cut);
output write,read,warn,cut;
input state,clk,card;
input[2:1] decide;
output[10:0] dispmoney;
output[8:0] disptime;
reg[10:0] money;
reg[8:0] dtime;
reg warn,cut,write,tlm;//tlm为分时钟
reg set,reset_ena;
integer numl,temp;
assign
dispmoney=card?money:0;
assign
disptime=dtime;
assign
read=card?1:0;
always @(posedge clk) //产生分时钟
begin if(numl==59)
begin
numl<=0;
tlm<=1;
end
else begin if(state)
numl<=numl+1;
else
numl<=0;
tlm<=0;
end
end
always @(negedge clk) //该进程完成电话计费功能
begin if (!set)
begin
money<=11'h500;
set<=1;
end
if(card&state)
if (tlm)
case({state,decide})
3'b101:if(money<3)
begin
warn<=1;
write<=0;
reset_ena<=1;
end
else begin //市话计费
if(money[3:0]<4'b0011)
begin
money[3:0]<=money[3:0]+7;
if(money[7:4]!=0)
money[7:4]<=money[7:4]-1;
else begin money[7:4]<=9;
money[10:8]<=money[10:8]-1;
end
end
else money[3:0]<=money[3:0]-3;
write<=1; //市话通话记时
if (dtime[3:0]==9)
begin
dtime[3:0]<=0;
if(dtime[7:4]==9)
begin dtime[7:4]<=0;
dtime[8]<=dtime[8]+1;
end
else dtime[7:4]<=dtime[7:4]+1;
end
else
begin dtime[3:0]<=dtime[3:0]+1;
warn<=0;
reset_ena<=0;
end
end
3'b110:if(money<6)
begin
warn<=1;
write<=0;
reset_ena<=1;
end
else begin //通话计时
if(dtime[3:0]==9)
begin
dtime[3:0]<=0;
if(dtime[7:4]==9)
begin
dtime[7:4]<=0;
dtime[8]<=dtime[8]+1;
end
else
dtime[7:4]<=dtime[7:4]+1;
end
else
dtime[3:0]<=dtime[3:0]+1; //长话计费
if(money[3:0]<4'b0110)
begin
money[3:0]<=money[3:0]+4;
if(!money[7:4])
begin
money[7:4]<=9;
money[10:8]<=money[10:8]-1;
end
else
money[7:4]<=money[7:4]-1;
end
else
money[3:0]<=money[3:0]-6;
end
endcase
else write<=0;
else begin
dtime<=0;
warn<=0;
write<=0;
reset_ena<=0;
end //取卡后对一些信号复位
end
always @(posedge clk) //告警一段时间后切断本次通话
begin if(warn) temp<=temp+1;
else temp<=0;
if(temp==15)
begin
cut<=1;
temp<=0;
end
if(!card||!reset_ena)
begin
cut<=0;
temp<=0;
end //复位cut信号
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -