题解 | #交通灯#

交通灯

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 RST=3'd0,GREEN=3'd1,YELLOW=3'd2,RED=3'd3;
    
    reg [1:0] state,next_state;
    reg [7:0] clock_1;
    
    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)
            state <= RST;
        else
            state <= next_state;
          
    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)
                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
该题为交通灯切换,但题目描述错误,该题的实际信号流程为红灯10个周期=>黄灯5个周期=>绿灯60周期,题解需要再rst状态等待两个时钟周期再跳转到第一状态,故需要在复位后等待两个时钟再进入工作状态,且等待过程中时钟计数不停止
全部评论
红灯后是黄灯不符合逻辑啊
1 回复 分享
发布于 2023-03-11 16:21 安徽
为什么要判断clock_1==8呢
1 回复 分享
发布于 2023-02-10 16:01 陕西
计数器转移那里用next_state判断也可以
点赞 回复 分享
发布于 2023-03-11 16:22 安徽
这个题目描述的很正确
点赞 回复 分享
发布于 2022-07-01 11:06

相关推荐

2025-12-18 11:59
广州南方学院 C++
牛客78682892...:直接点还好,总比要了简历也不回的强
点赞 评论 收藏
分享
评论
21
1
分享

创作者周榜

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