简易自动售货机控制电路

设计电路有两个投币口(1元和5角),货物2元一件,不设找零。out表示是否提供货物。

设计代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2020/07/23 11:30:37
// Design Name: 
// Module Name: Test1130
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module Test1130(reset,clk,jiao,yuan,out);
input clk,reset,jiao,yuan;
output out;
reg out;

reg [2:0] state;
parameter idle=0,half=1,one=2,one_half=3,two=4;
always @(posedge clk or posedge reset)
   if(reset)
      begin
         out <= 1'b0;
         state <= 0;
      end
   else
      case(state)
      idle:begin
              out<=0;
              if(jiao)
                 state<=half;
              else if(yuan)
                 state=one;
              else
                 state<=idle;
           end
      half:begin
              if(jiao)
                 state<=one;
              else if(yuan)
                 state=one_half;
              else
                 state<=half;
           end
      one:begin
              if(jiao)
                 state<=one_half;
              else if(yuan)
                 begin
                    out<=1;
                    state=two;
                 end
              else
                 state<=one;
           end
      one_half:begin
              if(jiao)
                 begin
                    out<=1;
                    state=two;
                 end
              else
                 state<=one_half;
               end
      two:begin
             out<=0;
             state<=idle;
          end
      default:begin
                 out<=0;
                 state<=idle;
              end
      endcase
endmodule

测试代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2020/07/23 16:21:33
// Design Name: 
// Module Name: Test1621
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module Test1621;
reg reset;
reg clk;
reg jiao;
reg yuan;
wire out;
always begin
   #100 clk=1;
   #100 clk=0;
end

initial begin
   reset=1;
   clk=0;
   jiao=0;
   yuan=0;
   #500;
   reset=0;
   
//投入5角
   repeat(2)@(posedge clk);
   #2;   jiao=1;
   repeat(1)@(posedge clk);
   #2;   jiao=0;
//投入5角   
    repeat(2)@(posedge clk);
   #2;   jiao=1;
   repeat(1)@(posedge clk);
   #2;   jiao=0;
//投入5角  
    repeat(2)@(posedge clk);
   #2;   jiao=1;
   repeat(1)@(posedge clk);
   #2;   jiao=0;
//投入5角  
    repeat(2)@(posedge clk);
   #2;   jiao=1;
   repeat(1)@(posedge clk);
   #2;   jiao=0;
   
//投入一元
    repeat(2)@(posedge clk);
   #2;   yuan=1;
   repeat(1)@(posedge clk);
   #2;   yuan=0;
//投入一元   
   repeat(2)@(posedge clk);
   #2;   yuan=1;
   repeat(1)@(posedge clk);
   #2;   yuan=0;
//投入一元 
   repeat(2)@(posedge clk);
   #2;   yuan=1;
   repeat(1)@(posedge clk);
   #2;   yuan=0;
    //投入一元 
   repeat(2)@(posedge clk);
   #2;   yuan=1;
   repeat(1)@(posedge clk);
   #2;   yuan=0;

end

Test1130 x1(.reset(reset),
            .clk(clk),
            .jiao(jiao),
            .yuan(yuan),
            .out(out));
endmodule

仿真波形

在这里插入图片描述

更新一下改进版的自动售货机
增设了售货机的找零功能,将货品价格修改为2.5元一件。

设计代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2020/07/23 11:30:37
// Design Name: 
// Module Name: Test1130
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module Test1130(reset,clk,jiao,yuan,out,change);
input clk,reset,jiao,yuan;
output out,change;
reg out;
reg change;
reg [2:0] state;
parameter idle=0,half=1,one=2,one_half=3,two=4,two_half=5,three=6,cha=7;
always @(posedge clk or posedge reset)
   if(reset)
      begin
         out <= 1'b0;
         state <= 0;
         change<=0;
      end
   else
      case(state)
      idle:begin
              out<=0;
              if(jiao)
                 state<=half;
              else if(yuan)
                 state=one;
              else
                 state<=idle;
           end
      half:begin
              if(jiao)
                 state<=one;
              else if(yuan)
                 state=one_half;
              else
                 state<=half;
           end
      one:begin
              if(jiao)
                 state<=one_half;
              else if(yuan)
                 begin
                    out<=0;
                    state=two;
                 end
              else
                 state<=one;
           end
      one_half:begin
              if(jiao)
                 begin
                    out<=0;
                    state=two;
                 end
              else if(yuan)
                 begin
                    out<=1;
                    state<=idle;
                 end
              else
                 state<=one_half;
               end
      two:begin
             if(jiao)
                begin
                   out<=1;
                   state=idle;
                end
              else if(yuan)
                begin
                   out<=1;
                   state<=three;
                end   
          end
      three:begin
               out<=1;
               change<=1;
               state<=cha;
            end
      cha:begin
             change<=0;
             out<=0;
             state<=idle;
          end
      default:begin
                 out<=0;
                 state<=idle;
                 change<=0;
              end
      endcase
endmodule

测试代码

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2020/07/23 16:21:33
// Design Name: 
// Module Name: Test1621
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module Test1621;
reg reset;
reg clk;
reg jiao;
reg yuan;
wire out;
wire change;
always begin
   #100 clk=1;
   #100 clk=0;
end

initial begin
   reset=1;
   clk=0;
   jiao=0;
   yuan=0;
   #500;
   reset=0;
   
//投入5角
   repeat(2)@(posedge clk);
   #2;   jiao=1;
   repeat(1)@(posedge clk);
   #2;   jiao=0;
//投入5角   
    repeat(2)@(posedge clk);
   #2;   jiao=1;
   repeat(1)@(posedge clk);
   #2;   jiao=0;
//投入5角  
    repeat(2)@(posedge clk);
   #2;   jiao=1;
   repeat(1)@(posedge clk);
   #2;   jiao=0;
//投入5角  
    repeat(2)@(posedge clk);
   #2;   jiao=1;
   repeat(1)@(posedge clk);
   #2;   jiao=0;
//投入5角  
    repeat(2)@(posedge clk);
   #2;   jiao=1;
   repeat(1)@(posedge clk);
   #2;   jiao=0;
//投入一元
    repeat(2)@(posedge clk);
   #2;   yuan=1;
   repeat(1)@(posedge clk);
   #2;   yuan=0;
//投入一元   
   repeat(2)@(posedge clk);
   #2;   yuan=1;
   repeat(1)@(posedge clk);
   #2;   yuan=0;
//投入一元 
   repeat(2)@(posedge clk);
   #2;   yuan=1;
   repeat(1)@(posedge clk);
   #2;   yuan=0;
//投入一元 
   repeat(2)@(posedge clk);
   #2;   yuan=1;
   repeat(1)@(posedge clk);
   #2;   yuan=0;
//投入一元 
   repeat(2)@(posedge clk);
   #2;   yuan=1;
   repeat(1)@(posedge clk);
   #2;   yuan=0;
//投入5角  
    repeat(2)@(posedge clk);
   #2;   jiao=1;
   repeat(1)@(posedge clk);
   #2;   jiao=0;
end

Test1130 x1(.reset(reset),
            .clk(clk),
            .jiao(jiao),
            .yuan(yuan),
            .out(out),
            .change(change));
endmodule

change的指数1表示0.5元。

猜你喜欢

转载自blog.csdn.net/Hennys/article/details/107554438