题解 | #自动贩售机1#

自动贩售机1

https://www.nowcoder.com/practice/dcf59e6c51f6489093495acb1bc34dd8

`timescale 1ns/1ns
module seller1(
	input wire clk  ,
	input wire rst  ,
	input wire d1 ,
	input wire d2 ,
	input wire d3 ,
	
	output reg out1,
	output reg [1:0]out2
);
/*
//这是一个不完全正确的mealy状态机,输出取决于当前输入和状态。单状态图值得学习
localparam s0=0,s05=1,s1=2,s15=3,s2=4,s25=5,s3=6;
reg [2:0] state,next_state;

always@(posedge clk or negedge rst)
	if(~rst)
		state<=0;
	else
		state<=next_state;

always@(*)begin
	next_state=s0;
	case(state)
		s0:next_state=d1?s05:
						d2?s1:
						d3?s2:s0;
		s05:next_state=d1?s1:
						d2?s15:
						d3?s25:s05;
		s1:next_state=d1?s15:
						d2?s2:
						d3?s3:s1;
		s15, s2, s25, s3: next_state = s0;
	endcase
end

always@(*)
	if(~rst)
		out1=0;
	else
		out1=state==s15||state==s2||state==s25||state==s3;


//这个输出方法也值得学习,少写了很多状态
always@(*) begin
        if(~rst)
            out2 <= 0;
        else
            case(state)
                s2                : out2 <= 1;
                s25               : out2 <= 2;
                s3                : out2 <= 3;
                default           : out2 <= 0;
            endcase
    end
*/

    parameter S0=0, S0_5=1, S1=2, S1_5=3, S2=4, S2_5=5, S3=6;
    reg [2:0] state, nstate;
    
    always@(negedge clk or negedge rst) begin
        if(~rst)
            state <= S0;
        else
            state <= nstate;
    end
    
    always@(*) begin
        case(state)
            S0                : nstate = d1? S0_5:
                                         d2? S1  :
                                         d3? S2  :
                                         nstate;
            S0_5              : nstate = d1? S1  :
                                         d2? S1_5:
                                         d3? S2_5:
                                         nstate;
            S1                : nstate = d1? S1_5:
                                         d2? S2  :
                                         d3? S3  :
                                         nstate;
            S1_5, S2, S2_5, S3: nstate = S0;
            default           : nstate = S0;
        endcase
    end
    
    always@(posedge clk or negedge rst) begin
        if(~rst)
            out1 <= 0;
        else
            out1 <= state==S1_5||state==S2||state==S2_5||state==S3;
    end
    
    always@(posedge clk or negedge rst) begin
        if(~rst)
            out2 <= 0;
        else
            case(state)
                S0, S0_5, S1, S1_5: out2 <= 0;
                S2                : out2 <= 1;
                S2_5              : out2 <= 2;
                S3                : out2 <= 3;
                default           : out2 <= 0;
            endcase
    end
//*************code***********//


endmodule

关键是要有negedge来更新周期。

全部评论

相关推荐

废铁汽车人:秋招真是牛鬼蛇神齐聚一堂
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务