Quality control (1)/Verilog

Verilog - Finite State Machine (FSM) / Lemming Game

빈그레 2023. 5. 17. 20:04

 

 


FSM(Moore)을 이용한 Lemming Game(1)

 

 

 

 

 

[Problem]

 

 

 


 

 

Design source code

 

//RTL code
module Lemmings1(
    input clk,
    input rst_n,
    input bump_left,
    input bump_right,
    output walk_left,
    output walk_right
    );

//explicit expression
localparam LEFT = 0,
           RIGHT = 1;
 
reg present_state, next_state;

//next_state compuation
always @(*) begin
    //next state computation logic - Combinational Logic
    case (present_state)
        LEFT : next_state = (bump_left) ? RIGHT : LEFT;
        RIGHT : next_state = (bump_right) ? LEFT : RIGHT;
        default : next_state = LEFT;
    endcase     
end       

 //present_state computation   
 always @(*) begin
    //UPdate present state logic - Sequential Logic
    if(!rst_n) present_state <= LEFT;
    else       present_state <= next_state;
 end     
 
 //ouput logic - Combinational logic    
 assign walk_left = ( present_state == LEFT );
 assign walk_right = ( present_stae == RIGHT );
                
endmodule

 


 

 

[코드 분석]

 

1. NEXT_STATE

현재 상태가 LEFT일 때, 현재 바라보고 있는 방향인 좌측에 장애물이 있으면 다음상태는 RIGHT로 할당되고,
현재 상태가 RIGHT일 때, 현재 바라보고 있는 방향인 우측에 장애물이 있으면 다음상태는 LEFT로 할당된다.

2.PRESENT_STATE

RESET 동작을 할 때에는 현재 상태를 LEFT로 초기화하고, 
RESET이 해제되었을 때에는 NEXT_STATE에 들어가 있는 값을 PRESENT_STATE에 CLK에 맞추어 할당해준다.

3. OUTPUT

출력은 WALK_LEFT, WALK_RIGHT가 존재하며, 
PRESENT_STATE가 LEFT일 때에는 WALK_LEFT가 활성화되고,
PRESENT_STATE가 RIGHT일 때에는 WALK_RIGHT가 활성화된다.

 

 

 

 

 

 


 


 

FSM(Moore)을 이용한 Lemming Game(2)

 

 

 

 

귀여운 LEMMING사진을 함께 넣어보았다

 

 

 

Problem(2)

 

 

 

 

 

 

Design Source code

 

 

//RTL code
module Lemmings2(
    input clk,
    input rst_n,
    input bump_left,
    input bump_right,
    input ground,
    output walk_left,
    output walk_right,
    output aaah
    );

//explicit expression ( number of states : 4 )
localparam WALK_LEFT = 2'b00,  //왼쪽으로 가는 상태
           WALK_RIGHT = 2'b01,  //오른쪽으로 가는 상태
           FALL_LEFT = 2'b10,  //왼쪽으로 낭떠러지
           FALL_RIGH = 2'b11;  //오른쪽으로 낭떠러지 
 
reg [1:0] present_state, next_state; //2bits for 4 states expression

//next_state compuation
always @(*) begin
    //next state computation logic - Combinational Logic
    case (present_state)
        WALK_LEFT : 
            if( ground == 0 ) next_state = FALL_LEFT; //GROUND=0 -> 낭떠러지를 만남
            else              next_state = (bump_left) ? WALK_RIGHT : WALK_LEFT;
         WALK_RIGHT : 
            if( ground == 0 ) next_state = FALL_RIGHT; //GROUND=0 -> 낭떠러지를 만남
            else              next_state = (bump_right) ? WALK_LEFT : WALK_RIGHT;  
         FALL_LEFT :
            if( ground == 1 ) next_state = WALK_LEFT;
            else              next_state = FALL_LEFT;
         FALL_RIGHT :
            if( ground == 1 ) next_state = WALK_RIGHT;
            else              next_state = FALL_RIGHT;                  
        default : next_state = WALK_LEFT;
    endcase     
end       

 //present_state computation   
 always @(*) begin
    //UPdate present state logic - Sequential Logic
    if(!rst_n) present_state <= WALK_LEFT;
    else       present_state <= next_state;
 end     
 
 //ouput logic - Combinational logic    
 assign walk_left = ( present_state == WALK_LEFT );
 assign walk_right = ( present_stae == WALK_RIGHT );
 assign aaah = (present_stae == FALL_LEFT) || (present_stae == FALL_RIGHT);
                
endmodule

 

 

 

 

  코드 분석

 

낭떠러지에 떨어져서 소리내는 OUTPUT의 변수값이 AAAH~~~~라니,,,,ㅋㅋ 너무 기엽다ㅏㅏㅏㅏ

그래서 내 점수도 그렇게 작고 귀여웠나

 

기분이 안 좋아졌다 오늘 공부는 여기까지