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

📄 oldaccount.v

📁 卡式计费电话电路,用verilogHDL编写,主要完成模拟真实电话的功能
💻 V
字号:
//信号定义
//clk:		时钟信号,本例中其频率值为1Hz
//decide:	电话局反馈回来的信号,代表话务种类,“01”表示市话,
//		“10”表示长话,“11”表示特话。
//card:		卡是否插入
//state:	电话接通信号
//dispmoney:	用来显示卡内余额,其单位为角,这里假设能显示的最大
//		数额为50元,即500角。
//disptime:	显示本次通话的时长。
//write,read:	当write信号下降沿到来时写卡,当话卡插入,read信号变高读卡。
//warn:		余额过少时的告警信号。本例中,当打市话时,余额少于
//		3角,打长话时,余额少于6角,即会产生告警信号。
//cut:		当告警时间过长时自动切断通话信号。

module account(state,clk,card,decide,disptime,dispmoney,write,read,warn,cut);
output write,read,warn,cut;
input state,clk,card;
input[2:1] decide;
output[11:0] dispmoney;
output[8:0] disptime;
reg[11:0] money;
reg[8:0] dtime;
reg warn,cut,write,t1m; //t1m为分时钟,写卡时间
reg set,reset_ena;
integer num1,temp;

assign dispmoney = card? money:0;
assign disptime = dtime;
assign read = card? 1:0;
//产生分时钟
always @(posedge clk)
  begin
    if(num1==59) begin num1<=0; t1m<=1; end
    else begin
           if(state) num1<=num1+1;
           else num1<=0;
           t1m<=0; 
         end
  end
//下面的always模块完成电话计费功能
always @(negedge clk)
  begin
    if(!set)  begin money<=12'h500;set<=1;end
    if(card && state)
      if(t1m)
         case({state,decide})
         3'b101:begin 
         	 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[11:8]<=money[11: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
          	end      
	 3'b110:begin 
	 	  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[11:8]<=money[11:8]-1;end
	 	   	      else money[7:4]<=money[7:4]-1;
	 	   	  end
	 	  	else money[3:0]<=money[3:0]-6;
	 	   	write<=1;reset_ena<=0;warn<=0;
	 	   	end
	 	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
  end
endmodule	 
                
     

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -