[Verilog 문법] 2.2 순차 논리

YUN·2026년 1월 21일

디지털 회로 설계

목록 보기
7/20
post-thumbnail

1. 순차 논리

현재의 입력 + 현재의 상태(과거의 입출력 정보가 반영된 현재의 상태)가 현재의 출력을 결정하는 논리

(1) 특징

  • 메모리가 존재해서 이전 상태를 기억한다.
  • 클럭 엣지에서 동작한다.
    • 조합 논리회로는 입력 변화하면 출력이 즉시 변화하지만,
      순차 논리회로는 클럭 엣지가 들어왔을때만 출력이 변화한다.

2. 플립 플롭 (Flip-Flop)

1비트를 저장하는 최소 메모리 소자

플립 플롭은 클럭의 엣지에서 입력을 샘플링하여 저장한다.

(1) always @(posedge clk 또는 negedge clk)

always 블록을 활용하여 플립 플롭을 구현할 수 있다.

always @(posedge clk) begin
    // 클럭 상승 엣지에서 실행
end

always @(negedge clk) begin
    // 클럭 하강 엣지에서 실행
end

이렇게 sensitivity list에 posedge clk 또는 negedge clk를 적어주면 엣지트리거 Flip Flop 으로 동작한다.

예시

module d_flip_flop (
    input  wire clk,
    input  wire d,
    output reg  q
);

    always @(posedge clk) begin
        q <= d;     // 상승 엣지에서 d를 q에 저장
    end

endmodule

D flip flop 의 구현이다.

(2) 리셋(Reset) 신호

회로를 초기화하는 기능

동기 리셋과 비동기 리셋

리셋에는 동기 리셋, 비동기 리셋이 존재한다.

  • 동기 리셋 : 클럭 엣지에서 리셋을 수행
  • 비동기 리셋 : 리셋 신호 들어오는 즉시 리셋을 수행
// 동기 리셋의 구현
module sync_reset_ff (
    input  wire clk,
    input  wire rst,    // 동기 리셋 (active high)
    input  wire d,
    output reg  q
);

    always @(posedge clk) begin
        if (rst)
            q <= 1'b0;  // 리셋
        else
            q <= d;     // 정상 동작
    end

endmodule

동기 리셋은 위와 같이 클럭에 동기화되어, 클럭의 상승 엣지에서만 리셋이 일어난다.

// 비동기 리셋의 구현
module async_reset_ff (
    input  wire clk,
    input  wire rst_n,  // 비동기 리셋 (active low)
    input  wire d,
    output reg  q
);

    // 감지 리스트에 리셋 추가!
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            q <= 1'b0;  // 리셋 (즉시!)
        else
            q <= d;     // 정상 동작
    end

endmodule

비동기 리셋은 클럭과 비동기적으로 동작한다. 즉, 리셋 신호가 들어오는 즉시 리셋이 실행된다.

(3) Enable 신호

플립 플롭의 동작 여부를 제어하는 신호

예시

module enabled_register (
    input  wire       clk,
    input  wire       rst_n,
    input  wire       en,       // enable 신호
    input  wire [7:0] d,
    output reg  [7:0] q
);

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            q <= 8'b0;
        else if (en)            // enable일 때만 갱신
            q <= d;
        // else: q 유지 (암묵적)
    end

endmodule

위와같이 클럭이 들어오더라도 if문을 한번 더 거치도록해서

-> enable 신호가 들어왔을때만 플립플롭이 동작하도록 설계한다

3. 순차 회로의 예시

(1) 카운터

module counter_8bit (
    input  wire       clk,
    input  wire       rst_n,
    input  wire       en,
    output reg  [7:0] count
);

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            count <= 8'b0;
        else if (en)
            count <= count + 1'b1;
    end

endmodule

(2) 시프트 레지스터 (SIPO)

module shift_register (
    input  wire       clk,
    input  wire       rst_n,
    input  wire       serial_in,
    output reg  [7:0] parallel_out
);

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            parallel_out <= 8'b0;
        else
            parallel_out <= {parallel_out[6:0], serial_in};
    end

endmodule


  시프트 레지스터 동작:
  
  클럭마다 왼쪽으로 시프트, 오른쪽에 새 비트 입력
  
  초기:    0000_0000
  입력 1:  0000_0001
  입력 0:  0000_0010
  입력 1:  0000_0101
  입력 1:  0000_1011
  ...

profile
안녕하세요. 전자공학부 학부생의 공부 기록입니다.

0개의 댓글