enable_latch가 F/F이 아니라 래치인 이유가 궁금합니다.
15
작성한 질문수 65
강사님 안녕하세요. 강의 보다가 궁금한 것이 생겨서 질문 드립니다.
[1. 질문 챕터] : LV1-11. Clock gating 5:26 모범답안 설명
[2. 질문 내용] : enable_latch가 왜 래치로 생성되는지 궁금합니다.
[3. 시도했던 내용, 그렇게 생각하는 이유] : enable_latch 신호는 clk_in에 동기화되어서 출력이 변경되는데 왜 F/F이 아니라 래치인 이유가 궁금합니다.
저는 아래처럼 작성해야 래치가 되는거라 생각했습니다.
`timescale 1ns / 1ps
module clock_gating(
input wire clk_in,
input wire rst_n,
input wire enable,
input wire [7:0] data_in,
output reg [7:0] data_out
);
wire w_clk_in;
reg l_enable;
//TODO
always @(posedge w_clk_in or negedge rst_n) begin
if (!rst_n) data_out <= 8'd0;
else data_out <= data_in;
end
always @(*) begin
if (!clk_in) begin
l_enable = enable;
end
end
assign w_clk_in = clk_in & l_enable;
endmodule답변 2
0
안녕하세요 김상현님,
열심히 달리고 계시는군요!
아마
"그래서 여기서 보시는 것처럼 negedge clk 에 enable 를 래치로 채서 & 처리하면 글리치가 생기지않겠죠?"
라고 제가 헷갈리게 말씀드린 부분 때문에 다르게 이해하신 것 같습니다.
정정 하자면 아래와 같습니다.
"그래서 여기서 보시는 것처럼 negedge clk 에 enable_latch 로 채서 & 처리하면 글리치가 생기지않겠죠?"
즉 선언된 레지스터 이름을 언급드린거며, 래치가 아니라 리셋이없는 플립플롭이맞습니다.
따라서 김상현님께서 이해하신게 맞습니다!
열심히 달리시다가 또 다른 질문 있으시면 언제든지 말씀 부탁 드립니다!
화이팅!
0
안녕하세요, 인프런 AI 인턴입니다. 김상현님.
enable_latch가 F/F이 아니라 래치로 합성되는 이유는 always @(*) 블록에서 clk_in이 Low일 때만 값을 대입하고, High일 때는 대입하지 않기 때문입니다.
always @(*) begin
if (!clk_in) begin
l_enable = enable;
end
end
위 코드는 다음과 같이 동작합니다.
clk_in == 0:l_enable이enable을 따라감
clk_in == 1:l_enable에 새로운 값을 대입하지 않고 기존 값을 유지함
즉, clk_in이 High가 되면 l_enable은 마지막 값을 저장해야 하므로, 합성 도구가 이를 레벨 센서티브 래치로 해석합니다.
중요한 점은 clk_in의 변화에 반응한다고 해서 F/F이 되는 것은 아니라는 점입니다.
- F/F:
posedge또는negedge와 같은 클럭 엣지에서만 값을 샘플링
- Latch: 특정 클럭 레벨 동안 입력을 통과시키고, 반대 레벨에서는 값을 유지
따라서 위 코드의 l_enable은 clk_in이 Low인 동안에는 enable의 변화가 그대로 반영됩니다. clk_in의 상승 엣지에서 한 번만 저장되는 구조가 아니므로 F/F이 아니라 래치입니다.
이 래치를 사용하는 이유는 클럭 게이팅에서 clk_in이 High인 동안 enable이 변해 게이트 클럭에 글리치가 발생하는 것을 방지하기 위해서입니다. clk_in이 Low인 구간에만 enable을 반영하고, High 구간에서는 값을 고정하여 다음과 같은 게이트 클럭을 안정적으로 생성합니다.
assign w_clk_in = clk_in & l_enable;
질문자님께서 작성하신 코드처럼 always @(posedge w_clk_in or negedge rst_n)로 작성한 data_out은 상승 엣지에서 동작하는 F/F입니다. 반면 l_enable을 생성하는 always @(*) 블록은 조건이 만족되지 않을 때 값을 유지하므로 래치가 됩니다.
관련 개념은 아래 기존 답변에서도 확인하실 수 있습니다.
Latch에 관련한 질문
조합 논리에서 조건에 따라 값을 대입하지 않으면 래치가 생성되는 이유와, 클럭 기반 F/F과의 차이를 설명합니다.c_state와 n_state의 F/F, Latch
always @(posedge clk)에서 동작하는 상태 레지스터와always @(*)에서 계산되는 조합 논리의 차이를 다룹니다.
정리하면, enable_latch는 clk_in에 동기화된 F/F이 아니라 clk_in의 Low 레벨 동안 투명하고 High 레벨 동안 값을 유지하는 래치입니다. 클럭 게이팅에서는 클럭이 High일 때 enable이 바뀌지 않도록 하기 위해 이러한 구조를 사용합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
인터럽트 컨트롤러 요청 처리와 처리 완료 구문 중 이해가 안되는 내용이 있습니다.
0
6
0
output.txt가 이상하게 나옵니다.
1
78
2
season 2 코딩테스트 강의에 대한 문의드립니다.
1
71
1
4:1먹스 구현방식에 대한 질문입니다.
1
69
2
Windows 기능 켜기
1
86
2
[L1-P02] 멀티플렉서 실전 결과 확인하는데 시간이 너무 걸립니다.
0
76
2
환경설정 문
2
119
2
환불 문의
1
162
2
[LV1_P4_REGISTER ] Non-Blocking
1
106
2
조건문에서 if 연속 사용
1
130
2
vivado 설치
2
153
1
LV1-21 Edge Detector 구현 방법 질문
1
135
1
학교에서 사용하는 툴
1
141
2
[L1-P16 clog2 with memory] clog2 function 질문
1
168
4
fsm 설계 방식에 대한 질문
1
131
2
Level0_P12_verification_testbench
1
124
2
mobaxterm 완전 삭제법
1
407
2
155ns 타이밍 이슈에 관한 궁금증(?)
1
134
2
build 오류
1
175
2
VIVADO 환경
1
151
2
코딩테스트
1
120
2
vscode 환경세팅 방법
2
276
2
L1-P12 인터럽트 제어 질문
2
136
2
L0-P03 design에 예제 코드가 그대로 실려있습니다.
2
119
2





