基于Verilog用状态机设计交通灯控制器

1.题目:用状态机设计交通灯控制器,设计要求:A路和B路都有红、黄、绿三种灯,持续时间为红灯45s、黄灯5s、绿灯40s。A路和B路交通灯的状态转移为
(1)A红,B绿(持续时间40s);
(2)A红,B黄(持续时间5s);
(3)A绿,B红(持续时间40s);
(4)A黄,B红(持续时间5s)。

2.Verilog代码(仅供参考!!!)

module traffic_lights(input clk50M,rst,//时钟、复位输入信号
                      output reg[5:0] lout);//输出六位2进制数点亮对应的灯
reg[30:0] count;//存计的数用的约21亿>20亿,基于50M的晶振最多可计时40多s
reg state;//灯的状态
parameter S0=2'b00,S1=2'b01,S2=2'b10,S3=2'b11;//灯的4种状态用4种不同的2进制表示
parameter extinguish_all=6'b000000,red_green=6'b100010,red_yellow=6'b100001,green_red=6'b010100,yellow_red=6'b001100;//点亮对应状态的灯的程序,不同的FPGA板子可能不一样
//计数
always@(posedge clk50M or posedge rst)
begin if(rst) count<=0;//如果复位,计数清零
      else count<=count+1;//否则每来一个时钟上升沿count+1
end       
//状态机
always@(posedge clk50M or posedge rst)
begin if(rst) begin//如果复位
              state<=S0;//灯状态变为S0
              lout<=extinguish_all;//暂时灯全部熄灭
              end
      else begin
           case(state)
           S0:begin lout<=red_green;//输出灯的状态为A红灯、B绿灯,并让它们保持40s
                    if(count>=2000_000_000)//如果计时到40s
                    begin
                        state<=S1;//灯进入S1状态
                        count<=0;//count归0
                    end
                    else state<=S0;//否则,灯保持S0状态
              end                      
           S1:begin lout<=red_yellow;//输出灯的状态为A红灯、B黄灯,并让它们保持5s
                    if(count>=250_000_000)//如果计时到5s
                    begin
                        state<=S2;//灯进入S2状态
                        count<=0;//count归0
                    end
                    else state<=S1;//否则,灯保持S1状态
              end               
           S2:begin lout<=green_red;//输出灯的状态为A绿灯、B红灯,并让它们保持40s
                    if(count>=2000_000_000)//如果计时到40s
                    begin
                        state<=S3;//灯进入S3状态
                        count<=0;//count归0
                    end
                    else state<=S2;//否则,灯保持S2状态
              end            
           S3:begin lout<=yellow_red;//输出灯的状态为A黄灯、B红灯,并让它们保持5s
                    if(count>=250_000_000)//如果计时到5s
                    begin
                        state<=S0;//灯回到S0状态
                        count<=0;//count归0
                    end
                    else state<=S3;//否则,灯保持S3状态
              end
           default: begin//出故障
                    state<=S0;//灯状态变为S0
                    count<=0;//计数清零
                    lout<=extinguish_all;//暂时灯全部熄灭
                    end
           endcase            
           end              
end        
endmodule

​
  • 20
    点赞
  • 202
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值