当前位置:   article > 正文

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

【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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

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

时序测试

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号