状态机逻辑
本课属于 Coddy Verilog 学习旅程的“基础知识”单元。第 80 课,共 90 课。
挑战
在这节课中,你将为交通灯控制器添加状态转换逻辑。状态机决定何时从一个状态切换到下一个状态。
状态机逻辑控制交通灯何时以及如何切换状态。
状态顺序
绿灯 → 黄灯 → 红灯 → 绿灯 → …
你的任务是将状态机逻辑添加到模块中。
在这一步中,新的输入信号 next 会触发每次状态变化;计时计数器会在下一步加入。保留你在上一步编写的所有内容(state 寄存器、未使用的 counter 声明,以及输出 always @(*) 块)。
要做什么:
- 在模块头部的
reset后添加一个名为next的 1 位输入端口:input next,。测试平台会发送脉冲来请求切换到下一个状态 - 添加一个
always @(posedge clk or posedge reset)块 - 复位时,将
state设为红灯(2) - 当
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 在线编译器