题解 | #交通灯#
交通灯
https://www.nowcoder.com/practice/b5ae79ff08804b61ad61f749eaf157ba
`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 CNT_MAX=75;
parameter CNT_RED=10;
parameter CNT_YELLOW=5;
parameter CNT_GREEN=60;
parameter idle=2'd0,R=2'd1,Y=2'd2,G=2'd3;
reg [7:0] cnt;
reg[1:0] cs,ns;
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
cs<=idle;
else
cs<=ns;
end
always@(*)begin
case(cs)
idle: ns=(cnt>CNT_MAX-2)?idle:R;
R: begin
ns= (cnt==CNT_MAX-CNT_RED+1)? Y:R;
end
Y: ns= (cnt==CNT_MAX-CNT_RED-CNT_YELLOW+1)? G:Y;
G: ns= (cnt==1)? R:G;
default: ns= idle;
endcase
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
red<=0;
yellow<=0;
green<=0;
end
else begin
case(ns)
idle:begin
red<=0;
yellow<=0;
green<=0;
end
R:begin
red<=1;
yellow<=0;
green<=0;
end
Y:begin
red<=0;
yellow<=1;
green<=0;
end
G:begin
red<=0;
yellow<=0;
green<=1;
end
endcase
end
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
cnt<=CNT_MAX;
else if(ns==R & cs==idle)
cnt<=CNT_MAX;
else if(cs==idle)begin
cnt<=cnt-1;
end
else if(pass_request)begin
if(cs==G)begin
if(cnt>10)
cnt<=10;
else
cnt<=cnt-1;
end
else
cnt<=cnt-1;
end
else if(cnt==1)
cnt<=CNT_MAX;
else
cnt<=cnt-1;
end
assign clock = (cs==idle)?(cnt-CNT_GREEN-CNT_YELLOW) : (cs==R)? (cnt-CNT_GREEN-CNT_YELLOW): (cs==Y)?(cnt-CNT_GREEN):cnt;
endmodule
科大讯飞公司氛围 425人发布