/*
 * 동기 (Synchronous) vs 비동기 (Asynchronous) 차이점
 * 
 * ========================================
 * 1. 동기 (Synchronous)
 * ========================================
 * - 클럭 신호에 의해 제어됨
 * - 클럭 엣지(상승/하강)에서만 동작
 * - 모든 동작이 클럭에 맞춰 일어남
 * - 예측 가능한 타이밍
 * - 설계가 안정적이고 타이밍 분석이 용이
 * 
 * ========================================
 * 2. 비동기 (Asynchronous) 
 * ========================================
 * - 클럭과 무관하게 즉시 동작
 * - 입력 신호 변화 시 바로 반응
 * - 빠른 응답 속도
 * - 타이밍이 예측하기 어려움
 * - 글리치나 레이스 컨디션 발생 가능
 */

✅ 1.D Filp Flop

image.png

image.png

// 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

상승엣지에서 D=1이니까 Q = 1 엣지가 없음 Q 유지 상승엣지에서 D=0이니까 Q = 0

👉 Negative

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

Sim

👉 Positive

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

✅ 2. SR Filp Flop

image.png

✅ 3. T Filp Flop

T → toggle

T → toggle