⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xiaolizi1588.v

📁 ic读卡器 能读ic电话卡并按时记费
💻 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 + -