概述
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
最后
以上就是细心咖啡为你收集整理的基于Verilog用状态机设计交通灯控制器的全部内容,希望文章能够帮你解决基于Verilog用状态机设计交通灯控制器所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复