题解 | #交通灯#
交通灯
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 IDEL=0, R=1, Y=2, G=3; reg [1:0] cstate, nstate; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin cstate <= IDEL; end else begin cstate <= nstate; end end reg [5:0] cnt; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin cnt <= 'd0; end else begin if(cstate!=nstate) begin cnt <= 'd0; end else begin case(cstate) G: cnt <= pass_request?'d49:(cnt+'d1); Y, R: cnt <= cnt + 'd1; default: cnt <= 'd0; endcase end end end always@(*) begin case(cstate) IDEL: nstate = R; R: nstate = (cnt=='d9)?Y:cstate; Y: nstate = (cnt=='d4)?G:cstate; G: nstate = (cnt=='d59)?R:cstate; default: nstate = IDEL; endcase end always@(posedge clk or negedge rst_n) begin if(!rst_n) begin {green,yellow,red} <= 3'b000; end else begin case(cstate) G: {green,yellow,red} <= 3'b100; Y: {green,yellow,red} <= 3'b010; R: {green,yellow,red} <= 3'b001; default: {green,yellow,red} <= 3'b000; endcase end end reg [7:0] clock_reg; always@(posedge clk or negedge rst_n) begin if(!rst_n) begin clock_reg <= 'd0; end else begin clock_reg <= (cstate==G)?('d60-cnt):((cstate==Y)?('d5-cnt):('d10-cnt)); end end assign clock = clock_reg; endmodule