設計一個自動飲料售賣機,共有兩種飲料,其中飲料 A 每個 10 分錢,飲料 B 每個 5 分錢,硬幣有 5 分和 10 分兩種,並考慮找零--verilog實現。


//設計一個自動飲料售賣機,共有兩種飲料,其中飲料 A 每個 10 分錢,飲料 B 每個 5 分錢
//硬幣有 5 分和 10 分兩種,並考慮找零。
//要求用狀態機實現,定義狀態,畫出狀態轉移圖,並用 Verilog 完整描述該識別模塊。 
//sel為1.表示選擇飲料A,sel為0,表示選擇飲料B。//輸入2'b01--表示5分錢,2'b10--表示10分錢。
//d_in表示投入錢的數量,d_out高表示輸出飲料,d_c表示找零。
module sel_fsm ( input clk, input rst, input sel, input [1:0]d_in, output reg d_out, output reg [1:0]d_c ); reg [1:0]state,nextstate; parameter s0=2'b00; parameter s1=2'b01; parameter s2=2'b10; always @(posedge clk or negedge rst) begin if(!rst) begin state <= s0; end else begin state <= nextstate; end end always @(state or sel or d_in) begin nextstate = 2'bxx; case (state) s0: begin if(d_in==2'b01 && sel == 1'b1) begin nextstate = s1; {d_c,d_out} = 3'b0; end else if(d_in == 2'b10 && sel == 1'b1) begin nextstate = s0; {d_c,d_out} = 3'b001; end else if(d_in == 2'b01 && sel == 1'b0)begin nextstate = s0; {d_c,d_out} = 3'b001; end else if(d_in == 2'b10 && sel == 1'b0)begin nextstate = s0; {d_c,d_out} = 3'b011; end else begin nextstate = s0; {d_c,d_out} = 3'b0; end end s1:begin if(d_in == 2'b01 && sel == 1'b1) begin nextstate = s0; {d_c,d_out} = 3'b001; end else if (d_in == 2'b10 && sel == 1'b1) begin nextstate = s0; {d_c,d_out} = 3'b011; end else if(sel == 1'b0)begin nextstate = s0; {d_c,d_out} = 3'b001; end else begin nextstate = s1; end end default: nextstate = s0; endcase end endmodule
`timescale 1ns/1ps
module test_tb;
    
    reg clk;
    reg rst;
    reg sel;
    reg [1:0]d_in;
    wire d_out;
    wire [1:0]d_c;

    sel_fsm u1(
   .clk(clk),
   .rst(rst),
   .sel(sel),
   .d_in(d_in),
   .d_out(d_out),
   .d_c(d_c)
    );

    initial begin
        clk = 1'b1;
        rst = 1'b0;
        #7;
        rst = 1'b1;
    end
    always #5 clk = ~clk;
    initial begin
    #10;
        sel = 1'b1;
        d_in = 2'b01;
        #10 d_in = 2'b01;
        #10 d_in = 2'b01;
        #10 d_in = 2'b01;
        #10 d_in = 2'b10;
        #10 d_in = 2'b00;
        #10 d_in = 2'b01;
        #10 sel = 1'b0;
        #10 d_in = 2'b01;
        #10 d_in = 2'b00;
        #10 d_in = 2'b10;
        #10 d_in = 2'b00;
        #10;
    end
endmodule

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM