Menu
Coddy logo textTech

전환 타이밍 설정하기

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

challenge icon

챌린지

이번 레슨에서는 각 신호등이 켜져 있는 시간을 제어하는 `counter` 로직을 추가합니다. 카운터는 설정된 값에서 0까지 카운트다운한 다음, 다음 `state` 전환을 트리거합니다.

`Timing` 요구사항

`State`Duration`Counter` Value
`Green`30 `seconds`30
`Yellow`10 `seconds`10
`Red`40 `seconds`40

카운터 동작 방식

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

수행해야 할 과제는 `state` `machine`에 누락된 `counter` 로직을 추가하는 것입니다.

작업 내용:

  1. reg [5:0] counter 선언을 추가합니다.
  2. `reset` 시 counter를 0으로 설정합니다.
  3. counter == 0일 때:
    • 다음 `state`의 지속 시간을 카운터에 `Load`합니다.
    • 다음 `state`로 전환합니다.
  4. 그렇지 않은 경우, 클록마다 카운터를 1씩 `Decrement`합니다.

직접 해보기

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

기초의 모든 레슨