题解 | #交通灯#不看答案不知道系列(idle->red)

交通灯

https://www.nowcoder.com/practice/b5ae79ff08804b61ad61f749eaf157ba?tpId=302&tqId=5000636&ru=/exam/oj&qru=/ta/verilog-advanced/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3DVerilog%25E7%25AF%2587%26topicId%3D302

`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
    );

//写个状态机,题出的有误导性,按照红黄绿红循环
//1
parameter idle = 6'b000001,s_green = 6'b000010,s_yellow = 6'b000100,s_red = 6'b001000,s0 = 6'b010000,s1=6'b100000;
reg [5:0] state_c,state_n;
always@(posedge clk or negedge rst_n)begin
    if(~rst_n)begin
        state_c <= idle;
    end
    else begin
        state_c <= state_n;
    end
end


reg [7:0] clock_temp;
always@(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        clock_temp <= 8'd10;
    end
    else if(state_c == s_red && clock_temp > 8'd1)begin
        clock_temp <= clock_temp - 1'b1;        
    end
    else if(state_c == s_red && clock_temp == 8'd1)begin
        clock_temp <= 8'd5;
    end
    else if(state_c == s_yellow && clock_temp > 8'd1)begin
        clock_temp <= clock_temp - 1'b1;
    end
    else if(state_c == s_yellow && clock_temp == 8'd1)begin
        clock_temp <= 8'd60;
    end
    else if(state_c == s_green && pass_request && clock_temp > 8'd10)begin
        clock_temp <= 8'd10;
    end
    else if(state_c == s_green && clock_temp > 8'd1)begin
        clock_temp <= clock_temp - 1'b1;
    end
    else if(state_c == s_green && clock_temp == 8'd1)begin
        clock_temp <= 8'd10;
    end
    else begin
        clock_temp <= clock_temp;
    end
end 
// 看答案 idle ->red 中间还要打两拍,不知道为什么
//2
always@(*)begin
    case(state_c)
        idle:begin
            state_n = s0;
        end
        s0:begin
            state_n = s1;
        end
        s1:begin
            state_n = s_red;
        end
        s_green:begin
            if(clock_temp == 8'd1)begin
                state_n = s_red;
            end
            else begin
                state_n = s_green;
            end
        end
        s_yellow:begin
            if(clock_temp == 8'd1)begin
                state_n = s_green;
            end
            else begin
                state_n = s_yellow;
            end
        end
        s_red:begin
            if(clock_temp == 8'd1)begin
                state_n = s_yellow;
            end
            else begin
                state_n = s_red;
            end
        end
        default:state_n = idle;
    endcase
end
//3
assign clock = state_c == s0?8'd9:(state_c == s1?8'd8:clock_temp);
always@(*)begin
    if(state_c == s_green) green = 1'b1;else green = 1'b0;
    if(state_c == s_yellow) yellow = 1'b1;else yellow = 1'b0;
    if(state_c == s_red) red = 1'b1;else red = 1'b0;
end
endmodule

全部评论

相关推荐

02-12 17:30
已编辑
字节跳动_实习生(实习员工)
要怎么办呢牛:我觉得大厂日常实习最大的意义就是给自己背书,一个好公司的实习就像一个好学历似的,能够给自己增加一个标签,让别人觉得你可以。(至于真正实习干了啥,这个感觉并不太重要)。当然一家之言,仅供参考。另外,楼主已经很强了,实习毕业双双拿下,已经领先好多好多人了,羡慕啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务