모든 시스템에서는 제어부와 실행부로 나뉜다. 제어부는 명령을 내리는 부서로 실행부로 하여금 특정한 행동을 하도록 신호를 보낸다. 신호를 받은 실행부는 신호에 따라 해당된 일을 수행한다.
사람으로 따지면 제어부는 사람의 '뇌'이고 실행부는 사람의 '몸'으로 그 기능을 나눌 수 있다.
시스템에서는 제어부가 내린 신호에 따라 실행부의 '상태'가 변하면서 원하는 행동을 한다.
이때 상태가 변함에 따라 실행부에서 나오는 외부 신호가 달라져야 한다.
간단히 그림으로 표현하면 다음과 같이 상태가 변해야 한다.
내가 어떤 버튼을 눌렀을 때는 S0의 상태가 시작되고 그에 따른 버튼들을 누르면 상태가 S1,S2로 변하면서 그 상태에 따른 결과값이 출력 되는 것이다.
Verilog 설계시 FSM하면 가장 먼저 떠오르는 예제는 바로 신호등 제어이다. 신호등을 제어하는 일이 FSM을 설명하기에 있어 가장 적합하기 때문이다. 인터넷에는 많은 예제들이 있지만 가장 간단한 형태인 교차로에서 4개의 신호등이 시간이 되면 각각 파란불, 빨간불로 바뀌는 예제를 설계 해보겠다.
그 전에 FSM 형태의 간단한 설계를 두가지를 해보겠다.
첫 번째로 설계할 FSM의 형태이다. 여기서 상태는 4가지 상태로 IDLE, READ, DLY, DONE의 상태가 있다.
상태는 매 clk마다 변경 되어 출력을 결정한다.
여기서 설계 방식은 두가지 방식이 있다.
하나는 출력되는 신호와 변화되는 상태를 두개의 case문으로 묶는 것이다.
다음과 같이 설계할 수 있다. 그러나 여기서 중요한 점은 always @(posedge cp or posedge go)안에 있는 case 문에 출력을 결정할 때 시뮬레이션 결과가 해당 state보다 한 사이클 delay 돼서 나온다는 것이다.
rd값이 해당 state보다 한 사이클 늦게 나온다. 이 이유는
next<=IDLE; state<=next; 때문이다. 여기서 <= 연산은 always 안에 있는 모든 우항들을 계산하고 그 다음에 좌항에 넣어주는 것이어서 if문이 실행될 때 case문도 동시에 실행 된다. 따라서 state에 값이 들어가기도 전에 case문이 실행되어 출력 신호가 한 사이클 delay 되는 것이다.
보통 <=인 연산은 non-blocking assignment 문으로 =대신 많이 사용한다. 위의 코드에서 <=를 =로 바꾸면
정상적으로 작동 하지만 <=를 쓰는것을 선호하고 추천한다. 따라서 <=연산을 남기면서도 옳바른 값이 나오게 하는 방법은 두가지가 있다.
1. 첫번째 방법
case문에 state를 next로 바꾸는 것이다.
next는 state보다 한 사이클 먼저 계산이 되어 next로 case 조건문을 주면 해당 state에 맞는 해당 출력 시호가 나온다.
2. 두번째 방법
가장 선호하는 방법으로 출력 신호와 다음 상태 신호를 같은 case문안에 써주는 것이다.
신호가 많아지면 복잡해 진다는 단점이 있지만 가장 선호하는 방법으로 이 방법 또한 원하는 시뮬레이션이 나온다.
한번 Schematic도 확인해보자.
next와 state값을 비동기식 레지스터로 저장하는 gate-level-netlist의 모습을 볼 수 있다.
'디지털논리회로' 카테고리의 다른 글
[Verilog] FSM(유한 상태 머신)_3 (0) | 2022.07.15 |
---|---|
[Verilog] FSM(유한 상태 머신)_2 (2) | 2020.04.09 |
[Verilog] 4-bit fulladder (0) | 2020.04.08 |
[Verilog] 인코더, 디코더 (0) | 2020.04.07 |
[Verilog] D flipflop (0) | 2020.03.27 |