
`timescale 1ns/1ns
module triffic_light
(
input rst_n, //异位复位信号,低电平有效
input clk, //时钟信号
input pass_request,
output wire[7:0]clock,
output reg red,
output reg yellow,
output reg green
);
parameter idle = 2'd0, s1_red = 2'd1, s2_yellow = 2'd2, s3_green = 2'd3;
reg [7:0] cnt;
reg [1:0] state;
reg p_red, p_yellow, p_green;
always@(posedge clk or negedge rst_n) begin: reg_state
if(~rst_n) begin
state <= idle;
p_red <= 1'b0;
p_green <= 1'b0;
p_yellow <= 1'b0;
end
else case(state)
idle: begin
p_red <= 1'b0;
p_green <= 1'b0;
p_yellow <= 1'b0;
state <= s1_red;
end
s1_red: begin
p_red <= 1'b1;
p_green <= 1'b0;
p_yellow <= 1'b0;
if(cnt == 3)
state <= s2_yellow;
else
state <= s1_red;
end
s2_yellow: begin
p_red <= 1'b0;
p_green <= 1'b0;
p_yellow <= 1'b1;
if(cnt == 3)
state <= s3_green;
else
state <= s2_yellow;
end
s3_green: begin
p_red <= 1'b0;
p_green <= 1'b1;
p_yellow <= 1'b0;
if(cnt == 3)
state <= s1_red;
else
state <= s3_green;
end
endcase
end
always@(posedge clk or negedge rst_n) begin: count
if(~rst_n)
cnt <= 7'd10;
else if(pass_request && green && (cnt > 10))
cnt <= 7'd10;
else if(~green && p_green)
cnt <= 7'd60;
else if(~yellow && p_yellow)
cnt <= 7'd5;
else if(~red && p_red)
cnt <= 7'd10;
else
cnt <= cnt - 1;
end
```
assign clock = cnt;
always@(posedge clk or negedge rst_n) begin
if(~rst_n) begin
yellow <= 1'b0;
red <= 1'b0;
green <= 1'b0;
end
else begin
yellow <= p_yellow;
red <= p_red;
green <= p_green;
end
end
endmodule