HDLBits_Lemmings4

记录一下这道题的解题思路,一开始审题状态机部分很明确,主要是计数器怎么和状态机融合

先贴出最终成功的代码。

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    input ground,
    input dig,
    output walk_left,
    output walk_right,
    output aaah,
    output digging ); 
	parameter LEFT = 3'd0, RIGHT = 3'd1, DIGL = 3'd2, DIGR = 3'd3, AHL = 3'd4, AHR = 3'd5, SPLAT = 3'd6;
    reg [3:0] STATE, NEXT_STATE;
    reg [4:0]count1;
    reg splatter;
    always @ (*) begin
        case(STATE)
            LEFT:NEXT_STATE = ground ? (dig ? DIGL : (bump_left ? RIGHT : LEFT)	): AHL;
            RIGHT: NEXT_STATE = ground ?(dig ? DIGR :(bump_right ? LEFT : RIGHT)) :AHR;
            DIGL: NEXT_STATE = ground ? DIGL : AHL;
            DIGR: NEXT_STATE = ground ? DIGR : AHR;
            AHL: NEXT_STATE = ground ? (splatter ? SPLAT : LEFT) : AHL;
            AHR: NEXT_STATE = ground ? (splatter ? SPLAT : RIGHT) : AHR;
            SPLAT: NEXT_STATE = SPLAT;
                default: NEXT_STATE = LEFT;
                endcase
            end
                always @ (posedge clk,posedge areset)begin
                    if(areset)begin
                        STATE <= LEFT;
                    end
                    else begin
                        STATE <= NEXT_STATE;
                    end
                end
    always @ (posedge clk, posedge areset)begin
        if(areset)begin
            count1 <= 1'b0;
            splatter <= 1'b0;
        end
        else if(count1 == 5'd20)begin
            splatter <= 1'b1;
            count1 <= 5'd0;
        end
        else if(NEXT_STATE == AHL | NEXT_STATE == AHR)begin
            count1 <= count1 + 1'b1;
        end
        else begin
            count1 <= 1'b0;
            
        end
    end
    assign walk_left = (STATE != SPLAT) & (STATE == LEFT);
    assign walk_right = (STATE != SPLAT) & (STATE == RIGHT);
    assign aaah = (STATE == AHL)|(STATE == AHR);
    assign digging =  (STATE == DIGL) | (STATE == DIGR);
             
endmodule

有两个部分导致最后总有一两个mismatch,首先是计数器判断条件(错误代码)

else if(STATE == AHL | STATE == AHR)begin
            count1 <= count1 + 1'b1;
        end

其次是最后的assign部分,一开始用这种条件会偶尔导致mismatch,还是直接用状态判断最稳妥

assign walk_left = (~splatter) & (STATE == LEFT);
assign walk_right = (~splatter) & (STATE == RIGHT);

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值