Menu
Coddy logo textTech

전환 타이밍 설정

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

challenge icon

챌린지

이 레슨에서는 각 신호등이 얼마나 오래 켜져 있을지를 제어하는 카운터 로직을 추가합니다. 카운터는 미리 설정된 값에서 0까지 카운트다운한 다음, 다음 상태 변경을 트리거합니다.

타이밍 요구 사항

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

카운터 작동 방식

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

여러분의 과제는 상태 머신에 누락된 카운터 로직을 추가하는 것입니다. 이전 단계의 next 입력은 더 이상 사용되지 않습니다. 이제 카운터가 상태 변경 시점을 결정하며, 테스트벤치는 더 이상 next를 구동하지 않습니다.

수행할 작업:

  1. 모듈 헤더에서 input next,를 제거하고 else if (next) 조건을 아래의 카운터 로직으로 교체합니다
  2. reg [5:0] counter 선언을 추가합니다(첫 번째 단계에서 이미 선언했다면 그대로 유지합니다)
  3. 리셋 시 counter를 0으로 설정합니다
  4. counter == 0일 때:
    • 다음 상태의 지속 시간을 카운터에 로드합니다
    • 다음 상태로 변경합니다
  5. 그렇지 않으면 각 클록마다 카운터를 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;      // Red에서 시작
      // TODO: 카운터를 0으로 설정
      
    end else begin
      if (counter == 0) begin
        case (state)
          0: begin
            state <= 1;
            // TODO: Yellow용 카운터 로드 (10초)
            
          end
          1: begin
            state <= 2;
            // TODO: Red용 카운터 로드 (40초)
            
          end
          2: begin
            state <= 0;
            // TODO: Green용 카운터 로드 (30초)
            
          end
        endcase
      end else begin
        // TODO: 카운터를 1 감소
        
      end
    end
  end

endmodule

기초의 모든 레슨

직접 연습해 보세요: 온라인 Verilog 컴파일러