1. 상태 전이를 분리한 코드

  • 상태 전이 로직이 별도의 always @(*) 블록에서 처리됩니다.
    • always @(*) 블록에서 상태 전이를 계산하고, 그 결과를 next_state에 저장한 후, 클럭 신호와 비동기 리셋 신호에 따라 state 값이 업데이트됩니다.

2. 상태 전이를 통합한 코드

  • 상태 전이 로직이 상태 저장 블록인 always @(posedge clk, posedge areset) 내부에서 처리됩니다.
    • state 값이 조건에 따라 직접 업데이트되며, 상태 전이와 상태 저장이 한 블록에서 이루어집니다.

3. 코드 구조 차이

  • 상태 전이를 분리한 코드에서는 상태 전이와 상태 저장이 각각의 블록에서 독립적으로 처리됩니다.
    • always @(*) 블록에서 상태 전이를 결정하고, 그 이후 클럭 신호에 따라 state가 업데이트되는 2단계 구조입니다.
  • 상태 전이를 통합한 코드는 상태 전이와 상태 저장이 하나의 블록에서 이루어집니다.
    • 전이 및 상태 저장이 동시에 처리되어 더 간결한 형태입니다.

4. 장단점 비교

  • 상태 전이를 분리한 코드의 장점은 상태 전이와 상태 저장이 분리되어 있어 가독성이 좋고, 복잡한 상태 전이 로직을 다룰 때 유지보수하기 용이하다는 점입니다. 상태 전이와 저장이 각각 독립적으로 이루어져 명확한 구조를 가지고 있습니다.
  • 상태 전이를 통합한 코드의 장점은 코드가 더 간단하고 짧다는 점입니다. 단순한 상태 전이를 표현할 때는 더 효율적이고, 필요 없는 복잡성을 줄여줍니다.

5. 어떤 코드가 더 나은가?

  • 복잡한 상태 전이 로직이 필요한 경우에는 상태 전이를 분리한 코드가 더 적합합니다. 상태 전이와 저장이 명확히 구분되어 있어 복잡한 FSM을 구현하거나 유지보수하기에 용이합니다.
  • 단순한 상태 전이 로직이 필요한 경우에는 상태 전이를 통합한 코드가 더 적합합니다. 코드가 간결해지고, 이해하기 쉬운 것이 장점입니다.

결론적으로, 상태 전이가 단순하다면 상태 전이를 통합한 코드, 복잡한 상태 전이를 처리해야 한다면 상태 전이를 분리한 코드가 더 적합합니다.

 


- Verilog Code

https://github.com/Vamosssss/HDLbits_Solutions/tree/main/3.%20Circuit/2.Sequential%20Logic/05.%20FSM

+ Recent posts