본문 바로가기

Verilog/HDLbits

[HDLBits] Lemmings4

1.    문제 및 설명

     A.     Lemmings은 걷기와 낙하뿐 아니라, 때때로 파기(digging)을 수행할 수 있다.

  • 오른쪽으로 걷는 상태
  • 왼쪽으로 걷는 상태
  • 떨어지는 상태
  • 땅 파기 상태
  • 터진 상태

     B.     Lemmings는 장애물에 부딪히면 이동 방향을 바꾼다.

  • 왼쪽에서 부딪히면 -> 오른쪽으로
  • 오른쪽에서 부딪히면 -> 왼쪽으로
  • 양쪽에서 동시에 부딪혀도 이동 방향을 바꾼다.
  • 바닥이 없어지는 상태가 되면 낙하상태가 되며, aaah를 외친다.
    • 낙하 중에 장애물에 부딪혀도 걷는 방향에는 영향을 주지않는다.
    • 바닥이 사라지는 순가에 동시에 충돌이 발생해도 방향은 바뀌지 않는다.
    • 낙하 중 바닥이 다시 생기는 순간에도 충돌이 발생하더라도 방향에는 영향을 주지 않는다.
    • 바닥이 다시 생기면, 낙하를 멈추고 낙하하기 전의 방향 그대로 다시 걷기 시작한다.
  • 현재 땅 위에서 걷고 있을 때만 파기를 시작 할 수 있다.
    • 한 번 파기 시작하면, 반대편에 도달할 때 까지 계속 파기를 수행한다.(ground=0)일 될 때까지
    • 땅이 없어지는 순간 낙하상태로 전환된다.
    • 이후 다시 땅을 만나면, 원래 걷던 방향으로 다시 걷기 시작한다.
    • 파는 중에 장애물에 부딪혀도 아무런 영향이 없다.
  • 20 clk 초과하여 낙하한 뒤 땅에 떨어지면 Splatter 상태가 된다.
    • Splatter 상태가 되면 더 이상 걷기, 낙하, 파기를 하지 않는다.
    • 이 상태에서는 모든 출력이 0이 된다.
    • 이 상태는 reset 될 때까지 유지된다.
    • Lemming이 얼마나 오래 낙하할 수 있는지에 대한 상한은 없다.
    • 땅에 도달할 때만 Splatter 여부가 결정된다.

 

2.    요구사항

     A.     위의 동작을 모델링하는 FSM을 설계하시오.

 

 

3.    문제 풀이

     A.     State

  • WL (Walk Left)
  • WR (Walk Right)
  • FWL (Falling Walk Left)
  • FWR (Falling Walk Right)
  • DIGL (Digging Walk Left)
  • DIGR (Digging Walk Right)
  • Splatter

     B.     output

  • walk_left (state == WL)
  • walk_right (state == WR)
  • aaah (state == FWL | state == FWR)
  • digging ( state == DIGL | state == DIGR)

4. 모듈 정의

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 );

 

 

5. 답

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 WL = 3'b000, WR = 3'b001, FWL = 3'b010, FWR = 3'b011, DIGL = 3'b100, DIGR = 3'b101, Splatter = 3'b111;
    reg [2:0] state, next_state;
    reg [4:0] cnt;
    always@(*)
        begin
            case(state)
                WL: next_state = (ground)?(dig?DIGL:(bump_left?WR:WL)):FWL;
                WR: next_state = (ground)?(dig?DIGR:(bump_right?WL:WR)):FWR;
                FWL: next_state = (ground)?(cnt>=20?Splatter:WL):FWL;
                FWR: next_state = (ground)?(cnt>=20?Splatter:WR):FWR;
                DIGL: next_state = (ground)?DIGL:FWL;
                DIGR: next_state = (ground)?DIGR:FWR;
                default: next_state <= state;
            endcase
        end
    
    always@(posedge clk, posedge areset)
        begin
            if(areset)
                begin
                state <= WL;
                    cnt <=5'b0;
                end
            else
                begin
                	state <= next_state;
                    if(((state==FWL)|(state==FWR))&cnt<=5'd20)
                        cnt <= cnt + 5'b1;
                    else if(cnt>5'd20)
                        cnt <= cnt;
                    else
                        cnt <= 5'b0;
                end            
        end
    
    assign walk_left = (state==WL);
    assign walk_right = (state==WR);
    assign aaah = (state==FWL)|(state==FWR);
    assign digging = (state==DIGL)|(state==DIGR);


endmodule

 

'Verilog > HDLbits' 카테고리의 다른 글

[HDLBits] Fsm ps2  (2) 2026.04.20
[HDLBits] Fsm onehot  (1) 2026.04.13
[HDLBits] Lemmings3  (0) 2026.04.11
[HDLBits] Lemmings2  (0) 2026.04.11
[HDLBits] Lemmings1  (0) 2026.04.10