题解 | #交通灯#
交通灯
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