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

📄 seller.v

📁 假设饮料只有一种价格为2.5元
💻 V
字号:
Module softdrink(rst,clk,op_start,coin_val,cancel_flag, hold_ind,charge_ind,drinktk_ind,charge_val);  
/*时钟信号clk,复位信号rst,开始信号op_start,硬币值coin_val,取消按钮cancel_flag,,机器使用标志hold_ind,找钱按钮charge_ind,取饮料drinktk_ind,找钱的值charge_val*/

     input clk,rst;
     input op_start,cancel_flag;
     input [1:0] coin_val;                //01,10,11表示0.5,1.0,1.5元
     output hold_ind;                   //1表示使用,0表示空闲  
     output charge_ind;                  //1表示找钱,0不找零
     output drinktk_ind;                  //1表示出饮料,0不出
     output [2:0]charge_val;          //001,010,011,100表示找0.5,1,1.5,2元
     reg hold_ind;                                                    
     reg charge_ind;   
     reg drinktk_ind; 
     reg [2:0]charge_val;                                       
          
     reg[2:0]currentstate,nextstate;                               
     parameter S0=3'b000;                                          //0元
     parameter S1=3'b001;                                          //0.5元
     parameter S2=3'b010;                                          //1.0元
     parameter S3=3'b011;                                          //1.5元
     parameter S4=3'b100;                                          //2.0元
     parameter S5=3'b101;                                          //2.5元
     parameter S6=3'b110;                                          //3.0元
              
always@(posedge clk or posedge rst)
     if(rst)
        currentstate<=S0;
     else
        currentstate<=nextstate;
        
always@(rst or currentstate or op_start or cancel_flag or coin_val)
    if(rst)  nextstate=S0;
    else case(currentstate)
       S0:
           if(op_start)
             if(coin_val==2'b01) nextstate=S1;
             else if (coin_val==2'b10) nextstate=S2;
       S1:
           if(cancel_flag) nextstate=S0;
            else if(coin_val==2'b01) nextstate=S2;
                 else if (coin_val==2'b10) nextstate=S3;
              
       S2: 
            if(cancel_flag) nextstate=S0;
            else if(coin_val==2'b01) nextstate=S3;
                 else if (coin_val==2'b10) nextstate=S4;
       S3:
           if(cancel_flag) nextstate=S0;
            else if(coin_val==2'b01) nextstate=S4;
                 else if (coin_val==2'b10) nextstate=S5;
       S4:
           if(cancel_flag) nextstate=S0;
            else if(coin_val==2'b01) nextstate=S5;
                 else if (coin_val==2'b10) nextstate=S6;
       S5:  nextstate=S0;
       S6:   nextstate=S0;
       default:
            nextstate=S0;
      endcase
      
  always@(currentstate)
     if(currentstate==S0)                             //s0时hold_ind为0,其余时为1
         hold_ind=1'b0;
     else
         hold_ind=1'b1;
         
  always@(currentstate)
     if((currentstate==S5)||(currentstate==S6))      //2.5和3.0元时,取饮料,其余不取饮料
         drinktk_ind=1'b1;
     else
         drinktk_ind=1'b0;
         
    always@(currentstate or cancel_flag)
     if(currentstate==S0)
             charge_ind=1'b0;         //只有s6和cancel时有找零功能,其余时段不找零
     else if(currentstate==S6)
             charge_ind=1'b1;
           else if(cancel_flag)
                   charge_ind=1'b1;     
               else
                   charge_ind=1'b0;
     
     always@(currentstate or cancel_flag )
       if(currentstate==S0) charge_val=3'b000;
       else if(currentstate==S6)                                 //s6找0.5元,
       
                charge_val=3'b001;
            else if(cancel_flag)
            begin 
              case(currentstate)
                    S1: charge_val=3'b001;               //中途退出,投多少,退多少
                    S2:charge_val=3'b010;
                    S3:charge_val=3'b011;
                    S4:charge_val=3'b100;
                    default:charge_val=3'b000;
             endcase
            end         
           else
             charge_val=3'b000;     
     
endmodule

⌨️ 快捷键说明

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