题解 | #交通灯#
交通灯
https://www.nowcoder.com/practice/b5ae79ff08804b61ad61f749eaf157ba
//题目文案有问题,实则是红黄绿红的循环跳转;初始的时候还有2拍的计数
`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
);
//define
reg [7 :0] cnt ;
reg [1 :0] state ;
localparam IDLE = 2'd0;
localparam GREEN = 2'd1;
localparam YELLOW = 2'd2;
localparam RED = 2'd3;
//main
always @(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
state <= IDLE ;
cnt <= 8'd10 ;
red <= 1'b0 ;
yellow<= 1'b0 ;
green <= 1'b0 ;
end
else
begin
case(state)
IDLE:
begin
if(cnt == 8'd8) begin
state <= RED ;
cnt <= 8'd10 ;
red <= 1'b1 ;
end
else
cnt <= cnt- 1'b1;
end
GREEN:
begin
if(pass_request) //行人请求
begin
if(cnt > 8'd10) //缩短绿灯
cnt <= 8'd10 ;
else if(cnt == 8'd1) //红灯跳转
begin
cnt <= 8'd10 ;
state <= RED ;
red <= 1'b1 ;
green <= 1'b0 ;
end
else
cnt <= cnt- 1'b1; //正常倒数
end
else //正常通车
begin
if(cnt == 8'd1) //红灯跳转
begin
cnt <= 7'd10 ;
state <= RED ;
red <= 1'b1 ;
green <= 1'b0 ;
end
else
cnt <= cnt- 1'b1;
end
end
YELLOW:
begin
if(cnt == 8'd1) //绿灯跳转
begin
cnt <= 7'd60 ;
state <= GREEN ;
yellow<= 1'b0 ;
green <= 1'b1 ;
end
else
cnt <= cnt- 1'b1 ;
end
RED:
begin
if(cnt == 8'd1) //黄灯跳转
begin
cnt <= 7'd5 ;
state <= YELLOW ;
red <= 1'b0 ;
yellow<= 1'b1 ;
end
else
cnt <= cnt- 1'b1;
end
default: state <= GREEN ;
endcase
end
end
assign clock = cnt ;
endmodule
深信服公司福利 832人发布