题解 | #交通灯#
交通灯
https://www.nowcoder.com/practice/b5ae79ff08804b61ad61f749eaf157ba
//cnt 做减法
//交通灯还是用状态机来做 提前给状态赋值,可以取指示灯信号变化的上升沿作为状态转移的触发条件
//考虑取信号上升沿和重置计数器数值所需要的时间,将指示灯延迟一个时钟输出可以实现信号灯颜色和倒计时的对应。
`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 RST=3'd0,GREEN=3'd1,YELLOW=3'd2,RED=3'd3;
reg [1:0] state,next_state;
reg [7:0] clock_1;
always @(posedge clk or negedge rst_n)
if(!rst_n)
state <= RST;
else
state <= next_state;
always @(*)
case(state)
RST :next_state = clock_1==8'd8?RED : RST;
GREEN :next_state = clock_1==8'd1?RED : GREEN;
YELLOW :next_state = clock_1==8'd1? GREEN:YELLOW;
RED :next_state = clock_1==8'd1?YELLOW: RED;
default:next_state = RST;
endcase
always @(posedge clk or negedge rst_n)
if(!rst_n)
clock_1 <= 8'd10;
else begin
if(clock_1==8'd1)
case(state)
GREEN,RST:clock_1 <= 8'd10;
YELLOW :clock_1 <= 8'd60;
RED :clock_1 <= 8'd5 ;
default :clock_1 <= 8'd10;
endcase
else if(clock_1==8'd8&&state==RST)//rst状态等待两个时钟周期再跳转到第一状态,故需要在复位后等待两个时钟再进入工作状态
clock_1 <= 8'd10;
else if(pass_request&&clock_1>8'd10&&state==GREEN)
clock_1 <= 8'd10;
else
clock_1 <= clock_1 - 1'b1;
end
always @(posedge clk or negedge rst_n)
if(!rst_n)begin
red <= 1'd0;
yellow <= 1'd0;
green <= 1'd0;
end else begin
case(next_state)
RST :begin
red <= 1'd0;
yellow <= 1'd0;
green <= 1'd0;
end
GREEN :begin
red <= 1'd0;
yellow <= 1'd0;
green <= 1'd1;
end
YELLOW :begin
red <= 1'd0;
yellow <= 1'd1;
green <= 1'd0;
end
RED :begin
red <= 1'd1;
yellow <= 1'd0;
green <= 1'd0;
end
default:begin
red <= 1'd0;
yellow <= 1'd0;
green <= 1'd0;
end
endcase
end
assign clock = clock_1;
endmodule
