inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

[HDL 16장] HW 의 동작을 제어하는 FSM 을 이해해보자. (실습편)

FSM은 밀리머신인가 무어머신인가

2133

sam716

작성한 질문수 10

2

안녕하세요 맛비님.

다음과 같은 코드를 보면

always문 안에는 *(asterisk) 로 combination circuit 즉, clock에 의존하지 않습니다.

제가 알기로 무어(MOORE) 머신은 output이 현재 state 에만 의존한다. 클럭 엣지에 의해서만 output이 바뀐다.로 이해하였고,

밀리(MEALY) 머신은 output이 현재 state와 input에 의존한다. 클럭의 한 사이클을 기다리지 않고 같은 사이클에서 입력을 바로 출력에 반영한다. 라고 알고 있습니다.

그럼 위 코드는

clock에 의존하지않고,

1. 현재 상태 = S_IDLE 일 때 현재 입력이 i_run=1이면 clock에 관계없이 바로 output, 즉 다음 상태가 S_RUN으로 되고,

2.현재 상태 = S_RUN 일 때 현재 입력이 is_done=1이면 clock에 관계없이 바로 output, 즉 다음 상태가 S_DONE으로 되고,

3.현재 상태 = S_DONE일 때 현재 입력에 상관없지만 clock에 관계없이 바로 output, 즉 다음 상태가 S_IDLE로 됩니다.

c_state는 clock에 의존하여 변하지만,

"밀리(MEALY) 머신은 output이 현재 state와 input에 의존한다. 클럭의 한 사이클을 기다리지 않고 같은 사이클에서 입력을 바로 출력에 반영한다. 라고 알고 있습니다." 에서

n_state는 같은 사이클에서 입력을 바로 출력에 반영한다. 라고 보이므로, MEALY 머신이 아닌가요?

인터넷에서는 FSM이 MOORE 머신이라고 나와서 질문드립니다!

verilog-hdl 임베디드 fpga

답변 1

1

설계독학맛비

안녕하세요 :)

제가 알기로 무어(MOORE) 머신은 output이 현재 state 에만 의존한다. 클럭 엣지에 의해서만 output이 바뀐다.로 이해하였고,

밀리(MEALY) 머신은 output이 현재 state와 input에 의존한다. 클럭의 한 사이클을 기다리지 않고 같은 사이클에서 입력을 바로 출력에 반영한다. 라고 알고 있습니다.

그런가요? Clock 의 사이클과 밀리 무어가 상관이 있는지는 처음 들었습니다. (출력 State 가 현재 input state 에 영향이 있는지 없는지의 차이라고 알고 있어요. 다시말씀드리지만, Cycle 과 무관합니다.)

여기 다음 링크의 생각이 제 생각과 같고요.

https://se-jung-h.tistory.com/entry/%EB%94%94%EC%A7%80%ED%84%B8-%EB%85%BC%EB%A6%AC%ED%9A%8C%EB%A1%9C-Moore-FSM%EA%B3%BC-Mealy-FSM%EC%9D%98-%EC%9E%A5%EB%8B%A8%EC%A0%90

읽어보시고 다시 질문 남겨주시면 좋을 것 같아요. (답변을 수정하기에, 너무 기네요..ㅠㅠ)

참고로 제가 사용한 실습코드는 moore 입니다. (무어를 많이 사용해요. 밀리는.. 로직을 최소화 하는 장점외에는.. 별로 이점이 없네요. 줄이는게 전체 시스템에 0.00...0001 % 도움이 될 것 같긴한데..;; 가독성이나, 글리치 이슈가 더 크리티컬하여... 아직 필요성은 못느껴봤습니다.)

즐공하세요 :)

0

osia0921

안녕하세요 맛비님.

한 clock 이후에 출력값이 나오게 함으로써 글리치 이슈가 적어지거나 발생하지 않는 이유가 뭔가요?

플립플롭을 거침으로써 noise가 사라지는 건가요?

그리고 글리치에 대해 설명이 잘 나와있는 사이트 추천해주실 수 있을까요?

0

설계독학맛비

안녕하세요 :)

한 clock 이후에 출력값이 나오게 함으로써 글리치 이슈가 적어지거나 발생하지 않는 이유가 뭔가요?

-> Combinational 로직이 관여하지 않은 sync edge 기반의 출력이기 때문입니다. Digital logic 설계 내에서 가장 안전한 출력이죠.

플립플롭을 거침으로써 noise가 사라지는 건가요?

-> 노이즈의 종류 중 외부 요인이 있기때문에, noise 가 사라지진 않습니다. 글리치는 실생활에서 항상 존재합니다.

관련 내용은 석사 수업에서 배우고요. 잘 나와있는 사이트는... 저도 잘... ㅎㅎ 구글링 해서 종합해보시면 좋을 것 같아요. 찾아보시고 공유 해주시면 감사하겠습니다.

즐공하세요 :)

0

osia0921

답변 감사합니다.

그러면 1 clock 이후에 출력값이 나오게 하는 것과

3 clock 이후에 출력값이 나오게 하는 것은 글리치 이슈에 대해서

똑같은 영향력을 지니나요?

(ex. 출력이 나오게 되는 clock을 더 늘림으로써 글리치 이슈가 더 적어지거나 할 수는 없나요?)

0

설계독학맛비

정확한 답변은 어렵겠지만, (경우의 수가 많은지라)

일반적으로 답변을 하자면.

1 clock 이후 출력, 3 clock 이후 출력은 글리티 이슈에서 같은 영향력을 지니지 않습니다.

고속 clock 설계에서는 멀티 cycle 을 사용하기도 하죠.

즐공하세요 :)

0

osia0921

감사합니다 많은 도움이 되었습니다!!

0

osia0921

맛비님. n_state와 c_state로, c_state는 sync_logic, n_state는 comb_logic의 두가지 상태로 나누는 이유를 알 수 있을까요?
n_state만 써도 어떤 block 이든 설계가 가능하지 않을까 싶은데
이렇게 n_state와 c_state로 나누는 이유가 있을까요?

0

설계독학맛비

나누는 이유라...

나누는 이유는 설계하기 쉬워서 입니다.

FSM 은 상태 기반이죠. 즉 현재 상태, 다음 상태가 필요합니다.

이정도면.. 이유는 충분한데요.. 안쓰고 설계하시는게 편하시다면 그렇게 하셔도 됩니다.

 

결론 정답은 없다. (하지만 맛비의 방식을 추천한다. 직접 설계해보다 보면.. 자연스럽게 아시게 되지 않을까..요?)

0

osia0921

음.. 저도 사실 맛비님 방식대로 설계를 하지 않을 때보다 방식대로 설계할 때 하고자 하는 동작을 구현하기 더 쉬웠습니다.

그런데.. 만약 팀끼리 프로젝트를 하다가, 왜 현재 상태와 다음 상태로 굳이 나누었어? 라고 물어보면

현재 상태에서 할 수 있는 동작과 다음 상태에서 할 수 있는 동작을 코드로 구현하기 쉽다라고 말할 것 같은데 뭔가 말이 깔끔하지 않달까.. 싶습니다.

코드를 줄일 수 있어? 왜? F/F만 늘어나는거 아냐? 라고 물어보면 뭐라고 대답하는게 좋을까요?

0

설계독학맛비

알려주신

"현재 상태에서 할 수 있는 동작과 다음 상태에서 할 수 있는 동작을 코드로 구현하기 쉽다"

이 답변이 수긍이 되신다면 이렇게 대답을 해야겠네요. (제 답글의 의도를 잘 정리해주셨...)

 

그런데.. 만약 팀끼리 프로젝트를 하다가, 왜 현재 상태와 다음 상태로 굳이 나누었어? 라고 물어보면

 이런 질문을 현업에서 들어본적은 없는데, 혹여나 누군가 한다면 위에 적어주신 대로 답변할께요 :)

===================

이건 이렇게 하고.. 말보다는

직접 구현해보시면 자연스럽게 해결될 일 같아보여요. (어떤코드와 제 코드를 비교해야 이런 질문이 나오는지 모르겠는데...;;;)

저라면 친구에게 이렇게 이야기하겠습니다.

 

코드를 줄일 수 있어?

"바꿀려고 하는 코딩스타일이 뭐길래...? 생각하는 코드를 구현해보고 비교해볼래?" 라고 답을 할 것 같고요.

"왜? F/F만 늘어나는거 아냐?"

"정말 그럴까? 생각하는 코드를 구현해보고 합성해서 비교해 볼래?" 라고 답을 할 것 같습니다.

그리고... "우리 같이 코드와 합성 결과를 보자 :) "

F/F util 사용량 확인 방법은 보드가 없더라도 다음 영상으로 충분히 커버가 되실꺼에요.

https://www.youtube.com/watch?v=8aBeMae2TqQ&t=1011s

 

방법은 알려드린 것 같아요. 나머지는 궁금증을 해결하고자하는 의지의 차이같습니다.

"본인"이 하실 수 있다면 직접 답을 찾아보시는 건 어떨까요? :)

0

osia0921

명쾌한 답변 감사합니다!!!

0

설계독학맛비

네네, 즐공하셔요 :)

latency 개념 구현

1

96

3

비바도 all os버전

1

79

2

초기화를 reset_n 이 '1'일 때가 아닌 '0' 일 때 실행시키는 이유 질문

1

83

2

다운로드용량

1

75

2

비바도리눅스설치

1

85

2

전체path복사넣기

1

64

2

Vivado 2025.2 리눅스 설치 후 실행 에러와 솔루션 (libxv_commontasks.so)

1

160

2

explorer.exe오류

1

107

3

mobaxterm설치오류

1

96

2

./build시, waveform 'divide color' 사용

1

58

2

Latch와 관련하여 (Time borrowing, Latch-based design)

1

137

2

clean 명령어가 안되는데, 따로 저장해줘야 하는지 궁금합니다.

0

66

1

안녕하세요 설치 관련 질문 드립니다.

1

67

3

16장 mealy 설계.

1

74

2

14장 Cycle 관련, Testbench 코드.

1

65

2

21강(16장) 초기값 설정이 적용되는 시점 질문

1

61

1

20강(15장) - 밀리 머신 관련하여 질문 드립니다.

1

72

2

build에러 질문

0

58

2

1장 ./build에서 에러가 나요

1

75

2

FPGA 강의 보드 문의 드립니다.

1

111

2

5장 DFF특성에 대한 질문

1

78

3

vivado linux 사용 이유.

1

141

2

메모리의 형태가 전체설계에 미치는 영향이 궁금합니다.

1

106

2

디스코드 멤버쉽 등업 관련 문제

1

93

2