/*
* 동기 (Synchronous) vs 비동기 (Asynchronous) 차이점
*
* ========================================
* 1. 동기 (Synchronous)
* ========================================
* - 클럭 신호에 의해 제어됨
* - 클럭 엣지(상승/하강)에서만 동작
* - 모든 동작이 클럭에 맞춰 일어남
* - 예측 가능한 타이밍
* - 설계가 안정적이고 타이밍 분석이 용이
*
* ========================================
* 2. 비동기 (Asynchronous)
* ========================================
* - 클럭과 무관하게 즉시 동작
* - 입력 신호 변화 시 바로 반응
* - 빠른 응답 속도
* - 타이밍이 예측하기 어려움
* - 글리치나 레이스 컨디션 발생 가능
*/
// D Flip-Flop
// 입력된 데이터(D)를 클럭신호(clk)의 엣지(edge)에 맞춰 클럭(Q)에 전달 : 동기식
// 시간 clk D Q
// t0 0 1 0
// t1 1(R) 1 1 <- 상승엣지에서 D=1이니까 Q = 1
// t2 0 0 1 <- 엣지가 없음 Q 유지
// t3 1(R) 0 0 <- 상승엣지에서 D=0이니까 Q = 0
module D_filp_flop_Basic(
input clk, // 클럭 입력
input d, // 데이터 입력
output reg q // 출력
);
always @(posedge clk) begin // 상승엣지 일때
q <= d; // q에 d를 저장
end
endmodule
상승엣지에서 D=1이니까 Q = 1 엣지가 없음 Q 유지 상승엣지에서 D=0이니까 Q = 0
module D_flip_flop_n (
input d,
inout clk,
input reset_p, // 비동기식 reset 신호(상승엣지에서 작동)
input enable, // 1일 때만 데이터 입력 허용
output reg q
);
always @(negedge clk or posedge reset_p) begin
// 비동기 신호인 reset_p가 1이 되면 즉시 q를 0으로
if(reset_p)
q <= 0;
else if (enable) // enable이 1일때만 d를 q로 저장, enable이 0일때는 q를 이전값으로 유지
q <= d;
end
endmodule
Sim
module D_filp_flop_p (
input d,
input clk,
input reset_p,
input enable,
output reg q
);
always @(posedge clk or posedge reset_p) begin
if (reset_p)
q <= 0;
else if (enable)
q <= d;
end
endmodule
T → toggle