다운/퍼 가실 때 댓글 부탁드려요. 그리고 받으신 자료 유료 레포트 사이트에 올리지 말아주세요.




1.

. 유한상태기계(FSM)을 이용하여 고속도로와 농장도로가 서로 엇갈려있는 교차로의 신호등 시스템을 구현한다.

. 신호등의 교환은 클럭 주기 농장도로의 차량 유무로 판단한다.

. 신호등 상태는 4개이며, 초기값은 고속도로가 파란불(HG=1), 농장도로가 빨간불(FR=1) 상태로 시작된다.


2.
알고리즘

. 일반적인 FSM 상태

 

1) 입력은 현재 상태와 함께 조합되어 출력으로 나타난다.

2) 상태는 여러 가지가 존재하며, 해당 상태에 따라서 출력값이 바뀌게 된다.

3) FSM 종류에는 무어기계와 밀리기계가 존재하는데 다음과 같은 차이점이 존재한다.

밀 리 기 계

무 어 기 계

출력값 상태 전이에 표시

(상태와 입력값에 의존)

출력값 상태에 표시

(상태의 원내에 표시되거나 붙어있다.)

각 화살표는 입력값과 상태

전이동안 발생하는 출력값을 나타냄

출력값이 상태와 결합 자신으로

돌아오는 화살표를 없어도 가능

자신으로 되돌아오는

화살표가 반드시 있어야 한다.

출력값이 상태자체에만

의존하는 경우 밀리보다 간단

. 신호등 시스템에서의 FSM 상태

1) 위의 그림은 고속도로와 농장도로의 교차로에서의 신호등 시스템이다.

2) 신호등 시스템은 농장도로에 자동차가 존재하는지 여부를 가지고 판단하여 신호등 상태를 바꾼다.

3) 초기값은 고속도로 신호등이 녹색불이고, 농장도로 신호등이 빨간불인 상태에서 시작하며, 16 클록이 지난 농장도로에 자동차가 존재하면 신호등의 상태를 바꾼다.

4) 신호등의 상태는 4가지가 있으며, 상태를 초기화할 있는 변수(clear) 둔다.

5) 농장에 차가 있는 상태라도 16 클록이 지나게 되면 신호등 상태를 바꾼다. (이는 농장에 차가 계속 존재할 고속도로가 파란불로 변화될 없는 상태에 대한 해결책이다)

 

3.

module fsm(clear, car, clk, count, current_state, HG, HY, HR, FG, FY, FR);

 

input clk; // 클럭

input clear; // 초기화 변수

input car; // 자동자 존재 유무

 

output [7:0] count; // 클럭 카운터

output HG, HY, HR, FG, FY, FR; // 고속도로, 농장 신호등 변수

output [1:0] current_state; // 현재 상태

 

reg [7:0] count;

reg [1:0] current_state;

reg [1:0] next_state; // 다음 상태

reg HG, HY, HR, FG, FY, FR;

 

 

initial // 초기화

begin

HG = 0; // 모든 신호등을 0으로(꺼짐) 초기화

HY = 0;

HR = 0;

FG = 0;

FY = 0;

FR = 0;

count = 2'b00000000; // 클럭 카운터 0으로 초기화

current_state = 2'b00; // 현재 상태 (00)으로 초기화

next_state = 2'b10; // 다음 상태 (10)으로 초기화

end

 

 

always@(posedge clk) // 상승클럭일 때 시행

begin

if(clear == 2'b1) // clear 상태라면

begin

next_state = 2'b00; // 다음 상태를 (00)으로 변환

count = 0; // 클럭 카운터 0으로 변환

end

 

current_state = next_state; // 다음 상태를 현재 상태로 저장

 

count = count + 1; // 클럭 카운터 1 증가

 

case(current_state) // 현재 상태에 따라서 값 설정

2'b00 : // (00) 상태라면

begin

if(car && (count == 16)) // 차가 존재하고, 16 클럭 카운트가 됐다면

begin

count = 0; // 클럭카운터를 0으로 저장

next_state = 2'b01; // 다음 상태를 (01)으로 변환

end

end

 

 

2'b01 : // (01) 상태라면

begin

if(count == 1) // 클럭 카운터가 1이면

begin

next_state = 2'b10; // 다음 상태를 (10)으로 변환

count = 0; // 클럭 카운터 0으로 저장

end

end

2'b10 : // (10) 상태라면

begin

if(16 == count) // 클럭 카운터가 16이라면

begin

count = 0; // 클럭 카운터를 0으로 저장

next_state = 2'b11; // 다음 상태를 (11)으로 변환

end

else if((count<=16) && !car) // 클럭 카운터가 16 이하고 차가 없다면

begin

count = 0; // 클럭 카운터를 0으로 저장

next_state = 2'b11; // 다음 상태를 (11)으로 변환

end

else if(car && (count<=16)) // 클럭 카운터가 16 이하고 차가 존재하면

begin

next_state = 2'b10; // 다음 상태를 (10)으로 변환

end

end

2'b11 : // (11) 상태라면

begin

if(count == 1) // 클럭 카운터가 1이면

begin

next_state = 2'b00; // 다음 상태를 (00)으로 변환

count = 0; // 클럭 카운터를 0으로 저장

end

end

endcase

 

if(count == 16) // 클럭 카운터가 16이라면

count = 0; // 클럭 카운터를 0으로 저장

end

 

 

always@(current_state)

begin

case(current_state) // 현재 상태에 따른 출력값의 변화

2'b00 : // (00) 상태 - 고속도로 파란불, 농장 빨간불

begin HG=1; HY=0; HR=0; FG=0; FY=0; FR=1; end

2'b01 : // (01) 상태 - 고속도로 노란불, 농장 빨간불

begin HG=0; HY=1; HR=0; FG=0; FY=0; FR=1; end

2'b10 : // (10) 상태 - 고속도로 빨간불, 농장 파란불

begin HG=0; HY=0; HR=1; FG=1; FY=0; FR=0; end

2'b11 : // (11) 상태 - 고속도로 빨간불, 농장 노란불

begin HG=0; HY=0; HR=1; FG=0; FY=1; FR=0; end

endcase

end

 

endmodule


4.
파형 분석

. 초기 상태는 HG=1이고 FR=1 상태이며(, 현재 상태는 00이다), 농장에는 자동차가 아직 없는 상태이다.

. (1)에서 car 신호가 1 되면서 농장에 자동차가 들어온다.

. (2)에서 클럭 카운터가 16 되면 현재 상태를 살펴서 농장에 차가 있다면 HG=1 HG=0으로, HY=0 HY=1(고속도로 신호등이 노란불로) 바뀌게 된다.

. (3)에서 농장에 자동차가 있으므로 FG=0 FG=1, HY=1 HY=0(농장 신호등이 파란불로) 바뀌고, 클럭카운터는 다시 1부터 시작된다.

. (4)에서 clear(초기화)=1 신호값이 들어오므로 현재 상태는 HG=1, FR=1 상태(초기상태인 00) 바뀌고 클럭 카운터역시 1부터 시작된다.

. 위 결과에서 보다시피 16클럭 동안 농장에 차가 존재하는지 여부에 따라서 고속도로 및 농장의 신호등이 바뀌게 되며, clear(초기화) 해주면 가장 처음 상태(HG=1, FR=1) 변경된다.

 

 

참고 문헌

. 디지털 시스템(인터비젼 / Alan B. Marcovitz )

. 디지털 시스템 설계(양서각 / 이채봉, 정완영 공저)

. HDL Chip Design(Doone Publications / Douglas J Smith )

. Verilog HDL(영한출판사 / Samir Palnitkar )

저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License