Menu
Coddy logo textTech

전환 타이밍 설정하기

Coddy Verilog 여정의 기초 섹션에 포함된 레슨 — 90개 중 81번째.

challenge icon

챌린지

이 레슨에서는 각 신호등이 켜져 있는 시간을 제어하는 카운터 로직(counter logic)을 추가합니다. 카운터는 미리 설정된 값에서 0까지 카운트다운한 다음, 다음 상태 변화를 트리거합니다.

타이밍 요구 사항

상태지속 시간카운터 값
Green30초30
Yellow10초10
Red40초40

카운터 작동 방식

  1. 상태가 시작될 때, 카운터에 지속 시간 값이 로드됩니다.
  2. 각 클록 틱마다 카운터가 1씩 감소합니다.
  3. 카운터가 0에 도달하면 다음 상태로 변경할 시간입니다.

여러분의 과제는 상태 머신에 누락된 카운터 로직을 추가하는 것입니다.

수행할 작업:

  1. reg [5:0] counter 선언을 추가합니다.
  2. 리셋(reset) 시, counter를 0으로 설정합니다.
  3. counter == 0일 때:
    • 다음 상태의 지속 시간을 카운터에 로드합니다.
    • 다음 상태로 변경합니다.
  4. 그렇지 않으면, 각 클록마다 카운터를 1씩 감소시킵니다.

직접 해보기

module traffic_light (
  input clk,
  input reset,
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;
  // TODO: 카운터 레지스터 선언 (6비트)
  

  // 출력 할당
  always @(*) begin
    case (state)
      0: begin green = 1; yellow = 0; red = 0; end
      1: begin green = 0; yellow = 1; red = 0; end
      2: begin green = 0; yellow = 0; red = 1; end
      default: begin green = 0; yellow = 0; red = 1; end
    endcase
  end

  // 타이밍을 포함한 상태 머신
  always @(posedge clk or posedge reset) begin
    if (reset) begin
      state <= 2;      // 빨간색에서 시작
      // TODO: 카운터를 0으로 설정
      
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            // TODO: 노란색 카운터 로드 (10초)
            
          end
          1: begin
            state <= 2;
            // TODO: 빨간색 카운터 로드 (40초)
            
          end
          2: begin
            state <= 0;
            // TODO: 초록색 카운터 로드 (30초)
            
          end
        endcase
      end else begin
        // TODO: 카운터를 1씩 감소
        
      end
    end
  end

endmodule

기초의 모든 레슨