FPGA(二):Verilog状态机实现模拟交通灯

硬件开发板说明:
1、cyclone III:EP3C5E144C8
2、时钟24M

题目:模拟交通灯效果,设LED1为红灯,持续10S,LED2为蓝灯,保持3S,LED3为绿灯,持续15秒,前12S 一直亮,后3S闪烁。(提示,使用状态机)
代码说明:
这个是我上工程教育中级的一道题,要求使用状态机进行实现,当时老师并没有让加上复位信号来写,我就简单这样写了,下面是代码。

代码实现:

module state_machine(
	input clk,  //24M
	output reg[2:0]led
);

// 寄存器变量
reg [1:0]state;
reg [29:0]cnt;
reg [23:0]cnt_p;
reg p;

// 常数定义
parameter T_10 = 30'd239999999;
parameter T_13 = 30'd311999999;
parameter T_25 = 30'd599999999;
parameter T_28 = 30'd671999999;

// 初始化
initial 
begin
	cnt   <= 30'd0;
	cnt_p <= 24'd0;
	p     <= 1'd0;
end

// 状态机实现
always @(posedge clk)
begin
	case(state)
		2'b00:   // 状态1
			begin
				led <= 3'b001;
				if(cnt == T_10) begin
					state <= 2'b01;
				end else begin
					cnt <= cnt + 30'd1;
				end
			end
		2'b01:   // 状态2
			begin
				led <= 3'b100;
				if(cnt == T_13) begin
					state <= 2'b10;
				end else begin
					cnt <= cnt + 30'd1;
				end
			end
		2'b10:   // 状态3
			begin
			   led <= 3'b010;
				if(cnt == T_25) begin
					state <= 2'b11;
				end else begin
					cnt <= cnt + 30'd1;
				end
			end
		2'b11:   // 状态4
			begin
				led[0] <= 0;
				led[1] <= p;  // 使用变量p作为闪烁参考
				led[2] <= 0;
				if(cnt == T_28) begin
					cnt   <= 30'd0;
					state <= 2'b00;
				end else begin
					cnt <= cnt + 30'd1;
				end 
				if(cnt_p == 24'd23999999) begin  // 闪烁
					cnt_p  <= 24'd0;	
					p <= ~p;
				end else begin
					cnt_p <= cnt_p + 24'd1;
				end 
			end
	endcase
end
endmodule

  • 8
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值