题解 | #交通灯#

交通灯

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

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-11 13:34
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
06-26 17:24
已编辑
宁波大学 golang
迷失西雅图:别给,纯kpi,别问我为什么知道
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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