题解 | #交通灯#不看答案不知道系列(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

全部评论

相关推荐

野猪不是猪🐗:现在的环境就是这样,供远大于求。 以前卡学历,现在最高学历不够卡了,还要卡第一学历。 还是不够筛,于是还要求得有实习、不能有gap等等... 可能这个岗位总共就一个hc,筛到最后还是有十几个人满足这些要求。他们都非常优秀,各方面都很棒。 那没办法了,看那个顺眼选哪个呗。 很残酷,也很现实
点赞 评论 收藏
分享
好像有点准
我推的MK:感觉这个表格呢好像有用又好像没用,真有offer了不管加班多么严重也得受着,没offer管他加班什么样也只能看看,反正轮不到我选
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务