Menu
CoddyTech

状态机逻辑

本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 80 课,共 90 课。

challenge icon

挑战

在这节课中,你将为交通灯控制器添加状态转换逻辑。状态机决定何时从一个状态切换到下一个状态。

状态机逻辑控制交通灯何时以及如何切换状态。

状态顺序

绿灯 → 黄灯 → 红灯 → 绿灯 → …

你的任务是将状态机逻辑添加到模块中。

在这一步中,新的输入信号 next 会触发每次状态变化;计时计数器会在下一步加入。保留你在上一步编写的所有内容(state 寄存器、未使用的 counter 声明,以及输出 always @(*) 块)。

要做什么:

  1. 在模块头部的 reset 后添加一个名为 next 的 1 位输入端口:input next,。测试平台会发送脉冲来请求切换到下一个状态
  2. 添加一个 always @(posedge clk or posedge reset) 块
  3. 复位时,将 state 设为红灯(2)
  4. 当 next 为 1 时,切换到下一个状态:
    • 如果状态是绿灯(0):切换为黄灯
    • 如果状态是黄灯(1):切换为红灯
    • 如果状态是红灯(2):切换为绿灯

亲手试试

module traffic_light (
  input clk,
  input reset,
  input next,           // 触发状态切换
  output reg red,
  output reg yellow,
  output reg green
);

  reg [1:0] state;

  // 输出赋值
  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

  // TODO: 添加状态机逻辑(不考虑时序)
  // always @(posedge clk or posedge reset) begin
  //   if (reset) begin
  //     state <= 2;
  //   end else if (next) begin
  //     case (state)
  //       0: state <= 1;
  //       1: state <= 2;
  //       2: state <= 0;
  //     endcase
  //   end
  // end

endmodule

基础知识中的所有课

自己练习: Verilog 在线编译器