강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

이정규님의 프로필 이미지
이정규

작성한 질문수

디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 설계하기

[과제2] Port를 확장하여 High-speed를 위한 Dual-port + Two-port RAM 설계하기

async fifo 질문있습니다!

해결된 질문

작성

·

271

·

수정됨

1

async fifo 예제 코드는 bin counter의 값을 comb logic을 통해 gray형태로 바꾸어서 CDC를 수행하는 것으로 이해했습니다. 하지만 강의 내용에서 Comb logic의 출력을 그대로 CDC한다면, Passing short cdc signal 문제가 발생할 수 있다고 하셨습니다. 그래서 gray 형태를 register에 저장하고, 이 register의 출력을 cdc하는 형태로 바꾸려고 하는데, 이것이 올바른 방식인지 알고 싶습니다!


예제 코드)

image.png




 

답변 2

0

네 안녕하세요, 답변 남겨드립니다.

말씀하신것처럼 passing short 문제가 일어날 수 있고,
이를 방지하기 위해 기본적으로 싱크로나이저를 적용하게 되는데

 

이는 말씀하신 것처럼 register의 형태로 구현됩니다.

따라서 올바른 방식이며, 작성하신 코드도 기능적으로 정상동작 한다면
타이밍적인 이슈가 없을 것으로 보입니다.

0

안녕하세요, 인프런 AI 인턴입니다.

이정규님께서 올려주신 질문은 비동기 FIFO에서의 CDC(Clock Domain Crossing) 문제와 그 해결 방법에 대해 깊은 이해가 필요한 주제입니다. 특히, binary 값을 gray code로 변환하고 이를 CDC하는 과정에서 발생할 수 있는 이슈를 말씀하셨습니다.

CDC 문제와 해결 방법:
1. Passing short CDC signal 문제: Comb logic의 출력을 그대로 CDC하는 경우, 신호가 클록 도메인 간 짧게 변화하면서 발생할 수 있는 metastability 문제가 있습니다. 이는 신호가 안정되지 않고 빠르게 변경될 때 발생할 수 있습니다.

  1. 해결 방법: gray 형태의 출력을 register에 저장 후, 이 register 값을 CDC하는 것이 좋은 방법입니다. 이는 안정성을 높여서 신호가 예기치 않게 변화하는 것을 방지합니다.

  2. Gray Code 사용: Gray Code를 사용하는 이유는, 이진수와 달리 한 비트만 변하기 때문에 비동기 클록 도메인 간의 경쟁 조건을 크게 줄여줍니다. 따라서, CDC 전에 한 비트씩 차근차근 변하도록 되어 신호 전파 지연에 대해 보다 안전하게 처리할 수 있습니다.

제안된 코드 구조:
- wptr_bin 값을 wptr_gray로 변환한 후 직접 CDC하는 대신, wptr_gray를 다른 레지스터에 저장하여 안정적으로 바꾸도록 설정합니다.
- wptr_gray를 위한 임시 레지스터를 사용하여 신호를 동기화하고 이를 기반으로 Clock Domain Crossing을 수행합니다.

이미지에 나온 코드 스니펫 및 설명을 기반으로 볼 때, register를 사용하여 CDC를 수행하려는 구상은 매우 적절한 접근입니다.

관련하여 더 상세한 설명을 원하시면, async fifo 구조와 설계와 같은 주제의 기존 질문을 참고하실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

이정규님의 프로필 이미지
이정규

작성한 질문수

질문하기