题解 | #自动贩售机2#

自动贩售机2

https://www.nowcoder.com/practice/298dec1c3dce45c881f3e53e02558828

这种方式虽然将输入打了一拍来匹配时序,作为状态机,它没有像别的答案那样(至少明面上)引入latch,但它却莫名可以跑通。不知道是不是编译器自己引入了latch呢?
这种逻辑理解虽然不如计数器简单,但输出没有使用组合逻辑来匹配testbench的时序,也算有它的独特优势。
`timescale 1ns/1ns

module seller2(
	input wire clk  ,
	input wire rst  ,
	input wire d1 ,
	input wire d2 ,
	input wire sel ,
	
	output reg out1,
	output reg out2,
	output reg out3
);
//*************code***********//
    localparam S0 = 0;
    localparam S0_5 = 1;
    localparam S1 = 2;
    localparam S1_5 = 3;
    localparam S2 = 4;
//     localparam S2_5 = 4;
    
    
    reg [2:0] state, nexts;
    reg [2:0] dreg;
    
    always@(posedge clk or negedge rst)
        begin
            if(!rst)
                dreg <= 0;
            else
                dreg <= {sel,d2,d1};
        end
    
    always@(posedge clk or negedge rst)
        begin
            if(!rst)
                state <= S0;
            else
                state <= nexts;
        end
    
    always@(*)
        begin
            if(!rst)
                nexts = S0;
            else
                case(state)
                    S0: case(dreg[1:0])
                        2'b01: nexts = S0_5;
                        2'b10: nexts = S1;
                        default: nexts = state;
                    endcase
                    S0_5: case(dreg[1:0])
                        2'b01: nexts = S1;
                        2'b10: nexts = sel?S1_5:S0;
                        default: nexts = state;
                    endcase
                    S1: case(dreg[1:0])
                        2'b01: nexts = sel?S1_5:S0;
                        2'b10: nexts = sel?S2:S0;
                        default: nexts = state;
                    endcase
                    S1_5: case(dreg[1:0])
                        2'b01: nexts = sel?S2:S0;
                        2'b10: nexts = sel?S0:S0;
                        default: nexts = state;
                    endcase
                    S2: case(dreg[1:0])
                        2'b01: nexts = sel?S0:S0;
                        2'b10: nexts = sel?S0:S0;
                        default: nexts = state;
                    endcase
                    default : nexts = S0;
                endcase
        end
    
    always@(posedge clk or negedge rst)
        begin
            if(!rst)
                begin
                    out1 <= 0;
                    out2 <= 0;
                    out3 <= 0;
                end
            else if (state==S0_5)
                case(dreg)
                    3'b010: out1 <= 1;
                    default: begin out1 <= 0; out2 <= 0; out3 <= 0; end
                endcase
            else if (state==S1)
                case(dreg)
                    3'b001: out1 <= 1;
                    3'b010: begin out1 <= 1; out3 <= 1; end
                    default: begin out1 <= 0; out2 <= 0; out3 <= 0; end
                endcase
            else if (state==S1_5)
                case(dreg)
                    3'b110: out2 <= 1;
                    default: begin out1 <= 0; out2 <= 0; out3 <= 0; end
                endcase
            else if (state==S2)
                case(dreg)
                    3'b101: out2 <= 1;
                    3'b110: begin out2 <= 1; out3 <= 1; end
                    default: begin out1 <= 0; out2 <= 0; out3 <= 0; end
                endcase
            else
                begin
                    out1 <= 0;
                    out2 <= 0;
                    out3 <= 0;
                end
        end


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


全部评论

相关推荐

2024-12-26 20:46
复旦大学 C++
国棉17厂丶小王:拿了offer的那个周末晚上去网吧通宵,去网吧不知道玩什么刷了lc的每日一题,然后试着第一次打开了三角洲行动,从此少了一个已经刷了700道题的lc用户,但是烽火地带多了一只🐭🐭
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务