题解 | #交通灯#
交通灯
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=0, GG=1, YY=2, RR=3; reg [1:0] Q_state, D_state; always@(*) case(D_state) RST: Q_state = reg_clock==8 ? RR : RST; GG: Q_state = reg_clock==1 ? RR : GG; YY: Q_state = reg_clock==1 ? GG : YY; RR: Q_state = reg_clock==1 ? YY : RR; default:Q_state = RST; endcase always@(posedge clk or negedge rst_n) if(!rst_n) D_state <= RST; else D_state <= Q_state; reg [7:0] reg_clock; always@(posedge clk or negedge rst_n) if(!rst_n) reg_clock <= 10; else begin if(reg_clock==1) case(D_state) GG,RST: reg_clock<=10; YY:reg_clock<=60; RR:reg_clock<=5; default:reg_clock<=10; endcase else if(pass_request & reg_clock>10 & D_state==GG) reg_clock<=10; else if(reg_clock==8'd8&&D_state==RST) reg_clock <= 8'd10; else reg_clock<=reg_clock - 1; end assign clock = reg_clock; wire red_t = Q_state==RR; wire yellow_t = Q_state==YY; wire green_t = Q_state==GG; always@(posedge clk or negedge rst_n) if(!rst_n) red <= 0; else red <= red_t; always@(posedge clk or negedge rst_n) if(!rst_n) yellow <= 0; else yellow <= yellow_t; always@(posedge clk or negedge rst_n) if(!rst_n) green <= 0; else green <= green_t; endmodule
- 顺序描述有问题,应该是红-黄-绿
- 根据仿真,需要设置rst状态下clock为8
1.颜色的转化 Q_state, D_state
2.转换的条件 clock的变化。
clock的重置,其他时间clock-1