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

全部评论

相关推荐

现在才开始投还有可能吗😭😭😭
牛客621925249号:开秋招了已经
点赞 评论 收藏
分享
舂锋:不能投什么岗都用一份简历,一般都是要看企业的岗位需求来写职业技能或者是项目经历,跟岗位相关的就写多一点。
点赞 评论 收藏
分享
自由水:笑死了,敢这么面试不敢让别人说
点赞 评论 收藏
分享
今天 13:54
湖南大学 Web前端
秋招不是要开始了吗,我都打算润了,看大家还在找不敢润了
一条从:因为不是人人都像佬一样有实习像我们这种二本仔秋招没有实习也是白忙活
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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