8位流水灯程序verilog_花样流水灯2:双灯左移右移与闪烁
时间: 2023-06-19 17:07:06 浏览: 82
以下一个基于Verilog的8位流水灯程序,实现了双灯左移右移与闪烁的花样流水灯效果:
```
module led_flow(
input clk, //时钟信号
output reg [7:0] led //8位LED灯输出
);
reg [1:0] state; //状态寄存器,用于切换不同的流水灯效果
reg [7:0] pattern; //模式寄存器,用于存储不同的LED灯亮灭模式
always @(posedge clk) begin
case(state)
2'b00: begin //双灯左移
pattern = 8'b00000001;
led = pattern;
#100000; //延时
pattern = 8'b00000010;
led = pattern;
#100000;
pattern = 8'b00000100;
led = pattern;
#100000;
pattern = 8'b00001000;
led = pattern;
#100000;
pattern = 8'b00010000;
led = pattern;
#100000;
pattern = 8'b00100000;
led = pattern;
#100000;
pattern = 8'b01000000;
led = pattern;
#100000;
pattern = 8'b10000000;
led = pattern;
#100000;
end
2'b01: begin //双灯右移
pattern = 8'b10000000;
led = pattern;
#100000;
pattern = 8'b01000000;
led = pattern;
#100000;
pattern = 8'b00100000;
led = pattern;
#100000;
pattern = 8'b00010000;
led = pattern;
#100000;
pattern = 8'b00001000;
led = pattern;
#100000;
pattern = 8'b00000100;
led = pattern;
#100000;
pattern = 8'b00000010;
led = pattern;
#100000;
pattern = 8'b00000001;
led = pattern;
#100000;
end
2'b10: begin //闪烁
pattern = 8'b11111111;
led = pattern;
#500000;
pattern = 8'b00000000;
led = pattern;
#500000;
end
endcase
state <= state + 1; //状态切换
if(state == 2'b11) begin
state <= 2'b00;
end
end
endmodule
```
该程序中,使用了一个状态寄存器和一个模式寄存器,通过不同的状态和模式来控制LED的亮灭情况。具体流程如下:
1. 当状态寄存器为`2'b00`时,表示当前流水灯效果为双灯左移,此时模式寄存器中存储的是一个从右往左移动的双灯亮灭模式。在每个时钟周期内,将模式寄存器中的数据输出到LED灯上,然后延时一段时间,再输出下一个模式。
2. 当状态寄存器为`2'b01`时,表示当前流水灯效果为双灯右移,与双灯左移的流程类似,不同的是模式寄存器中存储的是一个从左往右移动的双灯亮灭模式。
3. 当状态寄存器为`2'b10`时,表示当前流水灯效果为闪烁,此时模式寄存器中存储的是一个全亮或全灭的模式。在每个时钟周期内,将模式寄存器中的数据输出到LED灯上,然后延时一段时间,再输出相反的模式。
4. 程序的最后一步是状态寄存器的状态切换,每输出一种流水灯效果之后,将状态寄存器的状态加1,如果状态达到了`2'b11`,即最后一个状态,就将状态寄存器的状态置为`2'b00`,重新开始循环。
该程序中使用了一个100000个时钟周期的延时,用于控制LED灯的移动速度和闪烁频率,可以根据需要进行调整。