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

sam716님의 프로필 이미지
sam716

작성한 질문수

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

[HDL 11장] 설계능력 향상을 위한 Counter 제대로 이해해보기 (실습편)

개념 질문드립니다 맛비님.

작성

·

841

3

 
안녕하세요 맛비님
예전부터 헷갈려서 이렇게 질문드립니다.
위에 사진을 1번사진.
아래 사진을 2번사진이라고 하겠습니다.
 
제가 해석한 코드내용은, clk이 rising edge일 때, cnt가 100보다 작으면, o_cnt가 +1씩 되는것으로 이해했습니다.
 
1번사진에서 1095ns에 rising edge일 때, cnt값이 99이므로, +1이 되어, 그 다음 rising edge일 때 cnt값이 100이 되는것인지,
 
아니면 2번사진처럼, 1105ns에 rising edge일 때, cnt값이 99이므로, 바로 +1이 되어 cnt이 100의 결과값이 즉시 나오는지 잘 모르겠습니다.
 
제가 헷갈리는 이유는, 1번사진처럼 1095ns 일때, cnt값이 99라고 나와있지만, 실제로는 rising edge 때 생기는 값(99)이 아닌, 그 전의 값(98)을 받는다?라고 들었기 때문입니다.
이 부분에 있어 1년동안 많이 헷갈렸는데 개념 짚어주시면 정말 감사하겠습니다.
 
 
 
 
- 강의 내용외의 개인 질문은 받지 않아요 (개별 과제, 고민 상담 등..)
- 저 포함, 다른 수강생 분들이 함께보는 공간입니다. 보기좋게 남겨주시면 좋은 QnA 문화가 될 것 같아요. (글쓰기는 현업에서 중요한 능력입니다!)
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

답변 3

0

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

순서대로 정독 부탁드립니다.

1. D F/F 의 동작원리

https://m.blog.naver.com/leeyunghuk1/220981337920 

위 링크에서 D F/F 을 읽어보세요. 

이해 될때까지 이해해보세요. (1년묵은 체증을 해소하기 위해서 가장중요한 단계, 이 내용 이해 안되시면 절대로! 다음단계 넘어가지 마세요)

 

2. Code 를 수정

기존 코드에서 다음과 같이 수정했습니다. 

이유는 D F/F 의 "D" 와 "Q" 를 구분해서 확인하기 위함입니다.  (코드 수정 전, 후 는 같은 회로 입니다. 코딩스타일만 다를 뿐)

위 코드는 다음과 같은 회로를 만듭니다.  (if 문에 해당하는 회로 그림은 제외)

그리고 D F/F 에서, 다음과 같이 맵핑이 됩니다.  (여기까지 이해되시죠..? 안되시면 다시 정독)

(D F/F 회로 port : 코드변수명)

- D : D

- Q : cnt

 

3. 결과 확인

여기까지 잘 이해하셨다고 믿고, waveform 을 확인해보겠습니다.

 

위 파형으로 제 최종 정리 입니다.

1. functional sim 이기 때문에 logic delay 는 없으며,   

2. 그렇기 때문에 (delay 고려 없이) 이미 F/F 의 input D 는 99 로 준비가 되어 있었고, 

3. posivie edge 이전에 현재 f/f 출력값 Q 가 98 임으로 100보다 작으며, (현재 저장된 값으로 if 문의 조건을 검사함) 

4. positive edge 시점에서, 위의 2번 3번으로 D F/F가 동작됩니다. 이미 +1이 완료가 되었던 99 가 F/F 에 저장됩니다.

 

4. 위 지식을 토대로 질문주신 내용의 맛비 답변.

'

 

 

아직도...? 1년 묵은 체증이 남아있으신가요...?

sam716님의 프로필 이미지
sam716
질문자

맛비님께서 친절히 답변을 달아두신 덕분에 이해됐습니다. 정말 감사합니다.

 

마지막으로 질문이 있습니다.

1. always @ (posedge clk or negedge reset_n)

이런 표시가 있으면, 이 문 begin 에서 end로 끝나는 전체가 F/F 한개인지 궁금합니다.

 

2. 수업시간에 배운것은 J/K F/F , D F/F 등등 여러가지 F/F을 배웠는데, 

always @ (posedge clk or negedge reset_n) 문 안의 코드를 보고 어떤 종류의 F/F이 사용되었는지 한눈에 알 수 있는 법이 있는지, 아니면  이 문에서 구현하는 코드는 모두 D F/F인지 궁금합니다!

 

3. 2일전에 질문드렸던 것 중에 하나인데, 예를 들어서 always (*)안의 n_state 같은 경우에는

combinational logic으로 쓰인다고 말씀해주셨는데, F/F이 아니고서, 저장할 수 있는 logic 또한 존재할 수 있나요?

(제 말은, 어찌됐든, 저장해야하기 때문에 latch나 F/F으로 무조건 쓰여야 하지 않나요?)

(단순 저장하는 변수면, n_state는 어떤 소자라고 부르나요?)

 

 

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

자...! 제 역할은 마무리 된 것 같습니다. :) 

 

1,2,3 번 모두 스스로 답을 찾으실 수 있는 것들 입니다. (그리고 개인적인 질문이다 판단되고요)

How?!!! 직접 확인해보세요.

https://www.inflearn.com/questions/200751

 

저는 최선을 다했습니다.

여기서 질문자 스스로 맛비에게 진심으로 감사함을 느끼셨다면, 위 질문의 답을 찾아서 여기에 남겨주시리라 믿습니다.

 

즐공하세요 :)

sam716님의 프로필 이미지
sam716
질문자

답변이 늦었습니다. 

 

1. always @ (posedge clk or negedge reset_n)

이런 표시가 있으면, 이 문 begin 에서 end로 끝나는 전체가 F/F 한개인지 궁금합니다.

 

제 생각 -> always안에 reg가 몇개 쓰였는지에 따라서 F/F의 갯수는 달라진다.

 

 2. 수업시간에 배운것은 J/K F/F , D F/F 등등 여러가지 F/F을 배웠는데, 

always @ (posedge clk or negedge reset_n) 문 안의 코드를 보고 어떤 종류의 F/F이 사용되었는지 한눈에 알 수 있는 법이 있는지, 아니면  이 문에서 구현하는 코드는 모두 D F/F인지 궁금합니다!

 

제 생각 -> 제가 지금까지 실습하면서 schemetic으로 본 F/F은 D F/F이고,

코드 구성상? always @ (posedge clk or negedge reset_n) 꼴이면,

D F/F만 쓰이지 않을까 생각합니다. 

 

3. 2일전에 질문드렸던 것 중에 하나인데, 예를 들어서 always (*)안의 n_state 같은 경우에는

combinational logic으로 쓰인다고 말씀해주셨는데, F/F이 아니고서, 저장할 수 있는 logic 또한 존재할 수 있나요?

(제 말은, 어찌됐든, 저장해야하기 때문에 latch나 F/F으로 무조건 쓰여야 하지 않나요?)

(단순 저장하는 변수면, n_state는 어떤 소자라고 부르나요?)

 

-> always(*) 는 clock 에 동기화되지 않으므로, 단순 combinational logic 으로 쓰입니다. (+, -, and, or ...)

따라서 저장하는 개념이 아니라, 단순히 계산 후 출력으로 내보내주는 역할을 합니다. 

(현재 입력에 따라 출력이 항상 똑같이 결정되는 논리회로이므로)

 

제 답변에 코멘트 해주시면 감사하겠습니다...!

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

음 제생각에는 직접 해봐야 정확할 것 같아요.

저도 질문자님이 적어주신 생각에 동의합니다.

즐공하세요 :)

 

0

sam716님의 프로필 이미지
sam716
질문자

안녕하세요 맛비님! 사실 좀 더 헷갈려서 아이패드에 써서 질문해봅니다!

공개질문하셔도 괜찮습니다!

이렇게 질문하면 혹시 이해하실까요..?

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

와... 이제 이해했습니다!!!  (무엇을 헷갈려하시는지 완벽하게 이해한 것 같아요. )

정리해서 적어볼께요. (내일 중에 적어드리겠습니다. 헨폰으로 적는중인데, 그림까지 추가해서 이 질문을 종결시켜보겠습니다)

 

다음 글이 전부인데, 쫌만 기둘려주세요.

1. functional sim 이기 때문에 logic delay 는 없으며, 

2. 그렇기 때문에 (delay 고려 없이) 이미 F/F 의 input D 는 99 로 준비가 되어 있었고,

3. posivie edge 이전에 현재 f/f 출력값 Q 가 98 임으로 100보다 작으며, (현재 저장된 값으로 if 문의 조건을 검사함)

4. positive edge 시점에서, 위의 2번 3번으로 DFF가 동작됩니다. 이미 +1이 완료가 되었던 99 가 F/F 에 저장됩니다.

제가 이해 시킬꺼에요!! (근성으로 답변 갑니다ㅎ)

날 잡아서 구글 밑이라도 하시죠

sam716님의 프로필 이미지
sam716
질문자

정말 감사합니다 맛비님!

제가 어떻게 하면 될까요??

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

내일까지 기다려주세요 ㅎ 

답변이 완료되지 않았습니다!!

내일 답변까지 봤는데 이해가 안간다 하시면, 구글밑 하시죠 ㅎ

sam716님의 프로필 이미지
sam716
질문자

네! 정말 너무너무 감사합니다.

이것때매 앓고 있었습니다.. ㅎ

0

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

안녕하세요 :)

1년동안 어려움을... 제가 해소해드릴 수 있을지 겁이? 나네요.

저는 질문자님게서 궁금해하시는 내용이.. 저에게는 당연한 내용이라.. 이거를 어떻게 설명해드리면 좋을지.. (고인물.. ㅠ.ㅠ)

 

쉽게 생각해보죠. 코드를 보겠습니다.

32,33 번째를 보시면, 

순서대로 이해해보겠습니다.

1. clock edge 가 positive 일때   (clock 동기화 시점에서 32,33번째 코드를 동작한다. 라는게 중요합니다.)

2. cnt 가 100 보다 작다

3. cnt 에 +1 을 한다.

 

즐공하세요 :)

sam716님의 프로필 이미지
sam716
질문자

답변 감사합니다 맛비님!

 그러면 1095ns에 마우스 커서를 갔다대면 맛비님이 올린 사진과 같이 o_cnt는 99라고 나와있는데

사실상 99가 아니라 98인건가요?

 

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

99 입니다. 참고로 logic delay 가 고려안된 function sim 이기 때문이에요.

회로 딜레이가 추가된 simulation 을 돌리시면 더 정확하게 볼 수 있어요. (이거는 학교공부가 필요한 개념이에요)

즐공하세요 :)

sam716님의 프로필 이미지
sam716
질문자

답변 감사합니다 맛비님!

 

맛비님의 답변에서, 1105ns일때, clock rising edge에서 o_cnt가 99 ( <100 ) 이므로 99+1이 바로 나온다고 하셨는데, 1095ns일때 o_cnt를 99로 볼 수 있는 이유가 있을까요?

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

이유라.. 음..

"F/F 의 출력 값"을 보고 계신거고요.

"어떤 원인 혹은 이유가 필요한 문제" 인가....;; 제가 이해가 잘 안되고 있어요. ㅠ

sam716님의 프로필 이미지
sam716
질문자

답변 감사합니다 맛비님.

제가 궁금한 것은 다음과 같습니다.

 

위 simulation 사진에서

1105ns인 순간

--> cnt, 즉 F/F의 입력값이 99이므로, DUT 코드에 의해 99<100 이기 때문에 1105ns 순간의 clock rising edge에서 99 + 1인 100인 F/F의 출력값이 생성된다.

로 이해하고있는데,

 

실제로 vivado simulation 에서 1105ns에 마우스 커서를 갖다가 대면, cnt값이 100으로 나오는지 궁금합니다. 

그러면, 1105ns인 순간에 F/F의 입력값은 99가 아닌 100이 아닌가요? 그래서 DUT 코드에 의해 100<100인 조건을 만족하지 못하기 때문에,

1105ns 순간의 clock rising edge에서 그대로 100인 F/F의 출력값이 생성되는 것이 아닌지 궁금합니다.

 

 

1. 1095ns인 순간에

cnt의 입력 값(?), 출력 값(?), 마우스 커서를 올리면 나오는 값(99)

2. 1105ns인 순간에

cnt의 입력 값(?), 출력 값(?), 마우스 커서를 올리면 나오는 값(100)

 

위에서 ?의 값을 모르겠습니다.

 

질문 받아주셔서 감사합니다.

 

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

당연히!!! 질문이 오면 (제가 아는 범위내에서) 답변을 드려야죠.  :)

사람이기에 제 답변이 틀릴 수 있습니다.

제 답변을 항상 의심하셔야 하고요. 주변 지인 (교수님, 친구 등) 분들하고 논의를 해보는 것도 좋은 방법같습니다.

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

Q1.

- 1105ns 순간의 clock rising edge에서 99 + 1인 100인 F/F의 출력값이 생성된다.

- 1105ns에 마우스 커서를 갖다가 대면, cnt값이 100으로 나오는지 궁금합니다. 

"1105ns 순간" == "1105 ns" 로 치환하면 위 두 문장은 동일하죠..? (지금 이 순간....;;; 좋아하는 노래입니다.)

일단 윗 질문은 넘어가겠습니다. (당연한 이야기기 때문에, 설명을 드리기 버겁네요 ㅠ 왜 나는 맛비인가..? 이거 설명하는 느낌;;) 

Q2.

1. 1095ns인 순간

cnt의 입력 값(?), 출력 값(?), 마우스 커서를 올리면 나오는 값(99)

2. 1105ns인 순간

cnt의 입력 값(?), 출력 값(?), 마우스 커서를 올리면 나오는 값(100)

 

다음 질문의 "?" 는

delay 정보가 없는 function sim 이기 때문에, "cnt 입력 값" == "F/F 의 출력 값" 이라고 생각하고 있어요.

즉, 

"마우스 커서를 올리면 나오는 값" == "cnt 입력 값" == "F/F 의 출력 값 "

이렇게 답변드립니다. 

 

답이 되셨을까.....요...?;;;;;;;;

ps.

제가 답변드리기 너무 버거운데 이 내용 전부 캡쳐해서, 그대로 공개질문으로 올려볼까요....?;;;;;

누군가는 설명을 잘해줄 것 같다는....;;; (제가 놓치고 있는 무언가가 있는건가...;;;)

"1년동안 헷갈리셨다"는 내용인지라..  "하루" 보고 있는제가 부족할 수 있어요 ㅠ 이해 부탁드립니다.

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

최선을 다해보겠습니다 ㅎ

그림 그려봤어요.

다시 말씀드리지만 Functional sim (현 코드에서는 logic delay 없음) 입니다. 이점을 상기하고 다음그림 봐주세요.

 

sam716님의 프로필 이미지
sam716

작성한 질문수

질문하기