- Top 코드
- FSM을 설계하기전에 간단하게 KeyPad를 활용해 FSM을 설계하는 법을 익히고자합니다.
FSM장단점
- FSM설계 이전의 KeyPad 설계
상승엣지에서
col값을 읽어오면row값은 하강엣지에서 읽어와야한다. 이 둘을 모두 같은 엣지에서 받으면 pdt가 존재하기 때문에 문제가 발생할 수 있다. 이를 방지하기 위해서 상승엣지에서col값을 받고row값은 하강엣지에서 받으면 pdt로 인한 문제를 해결할 수 있다.- col값을 처음엔 링카운터를 이용해서 8ms마다 col값을 Shift했습니다.
Pull Down 저항을 외부에서 브래드보드에 연결하지 않아도 보드 내부의 풀다운 저항을 연결시켜줄 수 있다.
FSM사용한 설계
링카운터로 col을 8ms마다 shift하여 col값을 on 시켯는데 이를 FSM으로 대체하여 정의
- SL, CL 따로 always문으로 구현
- 두개를 합쳐서 정의..
FSM상태천이도 작성후 재설계
SCAN이라는 상태는col값이 8ms마다 shift하는 상황을 State로 표현을 했습니다. 그리고 버튼을 누르면 어떠한SCAN상태여도KEY_PROCESS로 상태가 넘어가고SCAN은 다음SCAN으로 이동하지 않고 그SCAN state를 유지합니다. 그리고 key를 누르고 때면, 즉KEY_PROCESS상태에서 빠져나오면 항상SCAN0상태로 이동합니다.- 사진 처럼(
노란색 clk_8msec_n,p) 엣지 디텍터의 상승엣지에서 state를 변경합니다. 이는 상승엣지에서col값이 8ms마다 쉬프트되는 것을 링카운터 대신 FSM을 사용한 것이다. 그리고 하강엣지에서 키패드의 입력을 받았을때 어떤 버튼이 눌렸냐를(row 입력)파악하여key_value에 값을 전달합니다. 이를 모두 상승엣지에서 이루어지게 하면 pdt 문제가 발생하여 오류가 발생할 수 있어서 서로 다른 엣지에서 동작하도록 합니다.- 원래 위 두번째 사진처럼 키패드의 버튼에 해당하는 값을 나타냅니다. 하지만 만약 계산기나 전화기 같이 동작하게하려면 패드에 해당하는 결과를 변경해줘야합니다. 이는 위 첫번째 사진의 노란색 값만 바꿔준다면 해결할 수 있습니다.