题解 | #交通灯#

交通灯

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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务