seller.v

来自「假设饮料只有一种价格为2.5元」· Verilog 代码 · 共 102 行

V
102
字号
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 + =
减小字号Ctrl + -
显示快捷键?