题解 | #自动贩售机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
);
//*************code***********//
parameter IDLE = 3'b001;
parameter S0   = 3'b010;
parameter S1   = 3'b100;

reg [2:0] cs, ns;
always @ (posedge clk or negedge rst) 
begin
    if( ~rst ) begin
        cs <= IDLE;
    end
    else begin
        cs <= ns;
    end 
end 

always @ (d1, d2, d3, rst) 
begin
    if( ~rst ) begin
        ns = IDLE;
    end 
    else begin
        case( cs )
            IDLE : begin
                case({d1, d2, d3}) 
                    3'b000 : ns = ns;
                    3'b100 : ns = S0;
                    3'b010 : ns = S1;
                    3'b001 : ns = IDLE;
                    default : ns = IDLE;
                endcase
            end 
            S0 : begin
                case({d1, d2, d3}) 
                    3'b000 : ns = ns;
                    3'b100 : ns = S1;
                    3'b010 : ns = IDLE;
                    3'b001 : ns = IDLE;
                    default : ns = IDLE;
                endcase
            end 
            S1 : begin
                if({d1, d2, d3} == 3'b000)
                    ns = ns;
                else 
                    ns = IDLE;     
            end
            default : begin
                if({d1, d2, d3} == 3'b000)
                    ns = ns;
                else 
                    ns = IDLE;  
            end 
        endcase
    end 
end 

reg out1_reg;
reg [1:0] out2_reg;
always @ (posedge clk or negedge rst) 
begin
    if( ~rst ) begin
        out1_reg <= 1'b0;
        out2_reg <= 2'b0;
    end
    else begin
        case(cs) 
            IDLE : begin
                if({d1, d2, d3} == 3'b001) begin
                    out1_reg <= 1'b1; 
                    out2_reg <= 2'd1; 
                end     
                else begin
                    out1_reg <= 1'b0; 
                    out2_reg <= 2'd0;
                end 
            end 
            S0 : begin
                case({d1, d2, d3}) 
                    3'b010 : begin
                        out1_reg <= 1'b1; 
                        out2_reg <= 2'd0; 
                    end 
                    3'b001 : begin
                        out1_reg <= 1'b1; 
                        out2_reg <= 2'd2; 
                    end 
                    default : begin
                        out1_reg <= 1'b0; 
                        out2_reg <= 2'd0; 
                    end 
                endcase
            end 
            S1 : begin
                case({d1, d2, d3}) 
                    3'b100 : begin
                        out1_reg <= 1'b1; 
                        out2_reg <= 2'd0; 
                    end 
                    3'b010 : begin
                        out1_reg <= 1'b1; 
                        out2_reg <= 2'd1; 
                    end 
                    3'b001 : begin
                        out1_reg <= 1'b1; 
                        out2_reg <= 2'd3; 
                    end 
                    default : begin
                        out1_reg <= 1'b0; 
                        out2_reg <= 2'd0; 
                    end 
                endcase     
            end
            default : begin
                out1_reg <= 1'b0; 
                out2_reg <= 2'd0;
            end 

        endcase
    end 
end 

always @ (posedge clk or negedge rst) 
begin
    if( ~rst ) begin
        out1 <= 1'b0;
        out2 <= 2'b0;
    end
    else begin
        out1 <= out1_reg;
        out2 <= out2_reg;
    end 
end	

//*************code***********//
endmodule

全部评论

相关推荐

Lorn的意义:你这种岗位在中国现在要么牛马天天加班,要么关系户进去好吃好喝,8年时间,真的天翻地覆了,对于资本来说你就说一头体力更好的牛马,哎,退伍没有包分配你真的亏了。
点赞 评论 收藏
分享
湫湫湫不会java:先投着吧,大概率找不到实习,没实习的时候再加个项目,然后把个人评价和荣誉奖项删了,赶紧成为八股战神吧,没实习没学历,秋招机会估计不多,把握机会。或者说秋招时间去冲实习,春招冲offer,但是压力会比较大
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务