目录

背景

Lemmings1

前言

原题复现

我的设计

Lemmings2

Lemmings3


背景

这是一个Lemmings的简单游戏,我们通过状态机可以设计这个游戏,从简单到复杂,一步一步实现这个游戏。


Lemmings1

前言

Lemmings1想要往左走,可是遇到左侧的障碍后,便向右转向;在向右走的过程中,如果遇到右侧的障碍,同理左转向。头脑简单的Lemmings要么左走,要么右走,两种状态。

原题复现

原题点此传送:

The game Lemmings involves critters with fairly simple brains. So simple that we are going to model it using a finite state machine.

In the Lemmings' 2D world, Lemmings can be in one of two states: walking left or walking right. It will switch directions if it hits an obstacle. In particular, if a Lemming is bumped on the left, it will walk right. If it's bumped on the right, it will walk left. If it's bumped on both sides at the same time, it will still switch directions.

Implement a Moore state machine with two states, two inputs, and one output that models this behaviour.

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    output walk_left,
    output walk_right); 

我的设计

设计我的Lemmings:

module top_module(
    input clk,
    input areset,    // Freshly brainwashed Lemmings walk left.
    input bump_left,
    input bump_right,
    output walk_left,
    output walk_right); //  
 
    parameter LEFT=0, RIGHT=1;
    reg state, next_state;
 
    always @(*) begin
        // State transition logic
        case(state)
            LEFT: begin
                if(bump_left) next_state = RIGHT;
                else next_state = LEFT;
            end
            RIGHT: begin
                if(bump_right) next_state = LEFT;
                else next_state = RIGHT;
            end
            default: begin
               next_state = LEFT; 
            end
        endcase
    end
 
    always @(posedge clk, posedge areset) begin
        // State flip-flops with asynchronous reset
        if(areset) begin
            state <= LEFT;
        end
        else begin
           state <= next_state; 
        end
    end
    
    always@(*) begin
        case(state)
            LEFT: begin
                walk_left = 1; 
                walk_right = 0;
            end
            RIGHT: begin
                walk_right = 1;
                walk_left = 0;
            end
            default: begin // almost impossible
                walk_left = 0;
                walk_right = 0;
            end
        endcase
    end
 
    // Output logic
    // assign walk_left = (state == ...);
    // assign walk_right = (state == ...);
 
endmodule

我设计的Lemmings,就是两个状态,处于LEFT状态,则向左走,处于RIGHT状态,也就向右走,复位则向左走。

输出仅仅和当前处于那个状态有关,而状态的切换,也是看当前状态下有没有当前方向的阻碍,例如在LEFT状态下,存在bump_left,则下一个时钟状态切换到RIGHT,固然,Lemmings也就向右走。

测试成功。


Lemmings2

 

 

 

 

 


Lemmings3