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~~~~라니,,,,ㅋㅋ 너무 기엽다ㅏㅏㅏㅏ
그래서 내 점수도 그렇게 작고 귀여웠나
기분이 안 좋아졌다 오늘 공부는 여기까지
'Quality control (1) > Verilog' 카테고리의 다른 글
Verilog 결과값 저장 / fopen / fwrite (0) | 2024.01.25 |
---|---|
Verilog - LFSR( Linear feedback shift register ) / Fibonacci & Galois LFSR (0) | 2023.05.23 |
Verilog - 4bit Ripple Carry Adder (0) | 2023.03.21 |
Verilog - Synthesis (full_adder_dataflow) / LUT / truth table (2) | 2023.03.20 |
Verilog - mux4_to_1 & test bench (0) | 2023.03.16 |