【Verilog HDL实践】状态机:8路彩灯控制程序

【Verilog HDL实践】8路彩灯控制程序

使用芯片:Altera Cyclone® IV EP4CE22F17C6N FPGA
开发工具:Quartus Ⅱ
开发项目:

四、设计一个8路彩灯控制程序,要求彩灯重复显示以下6种演示花型,在演示过程中,只有当一种花型演示完毕才能转向其他演示花型。
(1)8路彩灯同时亮灭;
(2)从左至右逐个亮(每次只有1路亮);
(3)8路彩灯每次间隔1路灯亮,1路灯灭,且亮灭相间,交替亮灭。

序列检测分析

使用状态机思想
共3种状态:
没有输入,当前状态演示完毕直接进入下一个状态即可。

代码展示
/*
模块功能:
	四、设计一个8路彩灯控制程序,要求彩灯重复显示以下6种演示花型,在演示过程中,只有当一种花型演示完毕才能转向其他演示花型。
		(1)8路彩灯同时亮灭;
		(2)从左至右逐个亮(每次只有1路亮);
		(3)8路彩灯每次间隔1路灯亮,1路灯灭,且亮灭相间,交替亮灭。
实现方法:
	状态机:共3种状态,分别对应3种演示花型
	以一定周期去切换状态。
	考虑到第二种情况最少需要8个时钟周期,我们以8个时钟周期为一个大周期。
*/

module LED_control8(clk, areset, led);
	input clk;
	input areset;
	output reg[7:0] led;
	
	parameter[31:0] cycle = 32'd12500000;
	reg[31:0] delay_counter;
	reg delay_flag = 1'b0;

	parameter style_one=2'b01, style_two=2'b10, style_three=2'b11;
	parameter duration_style = 4'b1000; //每个演示样式耗费8个时间周期 0.8s
	reg[3:0] duration_style_counter=4'b0000; //记录当前处于8周期中的哪个周期
	
	reg[1:0] current_state=style_one, next_state=style_one;
	
	reg[7:0] style_one_output=8'b0;
	reg[7:0] style_two_output=8'b1;
	reg[7:0] style_three_output=8'b01010101;
	
	always@(posedge clk)begin
		delay_counter <= delay_counter + 1'b1;
		current_state <= next_state;
		if(delay_counter >= cycle-1)begin
			delay_flag <= ~delay_flag;
			delay_counter <= 1'b0;
		end		
	end
	
	//各状态动作
	always@(posedge delay_flag) begin
		case(current_state)
			style_one:begin
				style_one_output<=~style_one_output;
				led <= style_one_output;
				duration_style_counter <= duration_style_counter + 1'b1;
				if(duration_style_counter >= duration_style) begin
					duration_style_counter <= 0;	
					next_state <= style_two;
				end
			end
			style_two:begin
				style_two_output<={style_two_output[6:0], style_two_output[7]};
				led <= style_two_output;
				duration_style_counter <= duration_style_counter+1'b1;
				if(duration_style_counter >= duration_style) begin
					duration_style_counter <= 0;	
					next_state <= style_three;
				end
			end
			style_three:begin
				style_three_output<=~style_three_output;
				led <= style_three_output;
				duration_style_counter <= duration_style_counter + 1'b1;
				if(duration_style_counter >= duration_style) begin
					duration_style_counter <= 0;	
					next_state <= style_one;
				end
			end
		endcase
	end
	
endmodule

代码流程比较简单,先引入一个500ms的定时器作为样式内的循环周期,如状态2需要从左至右逐个亮(共8路),故每次切换耗时500ms;同时规定一个样式最多消耗8个周期,即状态切换需要4秒。按顺序切换即可。

时序测试

没做时序测试,烧入到开发板效果与预期一致。

  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Arduino的8彩灯控制程序,包含上述三种演示花型: ```c++ const int LED_PIN_1 = 2; const int LED_PIN_2 = 3; const int LED_PIN_3 = 4; const int LED_PIN_4 = 5; const int LED_PIN_5 = 6; const int LED_PIN_6 = 7; const int LED_PIN_7 = 8; const int LED_PIN_8 = 9; void setup() { pinMode(LED_PIN_1, OUTPUT); pinMode(LED_PIN_2, OUTPUT); pinMode(LED_PIN_3, OUTPUT); pinMode(LED_PIN_4, OUTPUT); pinMode(LED_PIN_5, OUTPUT); pinMode(LED_PIN_6, OUTPUT); pinMode(LED_PIN_7, OUTPUT); pinMode(LED_PIN_8, OUTPUT); } void loop() { // 彩灯演示花型1:8彩灯同时亮灭 for (int i = 0; i < 2; i++) { digitalWrite(LED_PIN_1, HIGH); digitalWrite(LED_PIN_2, HIGH); digitalWrite(LED_PIN_3, HIGH); digitalWrite(LED_PIN_4, HIGH); digitalWrite(LED_PIN_5, HIGH); digitalWrite(LED_PIN_6, HIGH); digitalWrite(LED_PIN_7, HIGH); digitalWrite(LED_PIN_8, HIGH); delay(500); digitalWrite(LED_PIN_1, LOW); digitalWrite(LED_PIN_2, LOW); digitalWrite(LED_PIN_3, LOW); digitalWrite(LED_PIN_4, LOW); digitalWrite(LED_PIN_5, LOW); digitalWrite(LED_PIN_6, LOW); digitalWrite(LED_PIN_7, LOW); digitalWrite(LED_PIN_8, LOW); delay(500); } // 彩灯演示花型2:从左至右逐个亮 for (int i = 1; i <= 8; i++) { digitalWrite(i + 1, HIGH); delay(100); } for (int i = 1; i <= 8; i++) { digitalWrite(i + 1, LOW); delay(100); } // 彩灯演示花型3:8彩灯每次4灯亮,4灯灭,且亮灭相间,交替亮灭 for (int i = 0; i < 4; i++) { digitalWrite(LED_PIN_1, HIGH); digitalWrite(LED_PIN_3, HIGH); digitalWrite(LED_PIN_5, HIGH); digitalWrite(LED_PIN_7, HIGH); digitalWrite(LED_PIN_2, LOW); digitalWrite(LED_PIN_4, LOW); digitalWrite(LED_PIN_6, LOW); digitalWrite(LED_PIN_8, LOW); delay(500); digitalWrite(LED_PIN_1, LOW); digitalWrite(LED_PIN_3, LOW); digitalWrite(LED_PIN_5, LOW); digitalWrite(LED_PIN_7, LOW); digitalWrite(LED_PIN_2, HIGH); digitalWrite(LED_PIN_4, HIGH); digitalWrite(LED_PIN_6, HIGH); digitalWrite(LED_PIN_8, HIGH); delay(500); } } ``` 这段代码使用了 `digitalWrite()` 函数来控制每个彩灯的开关状态,并使用 `delay()` 函数来控制彩灯的亮灭时间和演示花型之间的间隔时间。请注意,此代码是针对Arduino开发板的,如果你使用其他控制器,则需要根据具体情况进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值