本篇文章包含FPGA循环点亮流水灯程序的思路和代码,看完这一篇就能学会循环控制流水灯咯!
创作不易,求赞赞~~
点亮流水灯几乎是所有编程学习的必经之路,在设计程序之前,首先我们要先对 “ 流水灯” 进行了解:
流水灯如下图所示分为共阴极和共阳极,共阴极接法需要用高电平(led_out=1)去驱动;共阳极接法需要低电平(led_out=0)去驱动
下面分为共阴极和共阳极,以4个流水灯举例实现依次点亮,我采用的更简单的拼位实现方法:
共阴极4个流水灯依次点亮(从led_3到led_0):
led_2 | led_1 | led_0 | |
1 | 0 | 0 | 0 |
0 | 1 | 0 | 0 |
0 | 0 | 1 | 0 |
0 | 0 | 0 | 1 |
依次点亮即为原led_3到led_1的三个状态变到led_2到led_0,原led_0的状态变到led_3
如果把led看做是一个4位2进制数,下个状态的led就是上个状态的( led_0 , led_3到led_1) 拼起来
共阴极4个流水灯依次点亮(从led_0到led_3):
led_2 | led_1 | led_0 | |
0 | 0 | 0 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 0 | 0 |
1 | 0 | 0 | 0 |
依次点亮即为原led_2到led_0的三个状态变到led_3到led_1,原led_3的状态变到led_0
下个状态的led就是上个状态的( led_2到led_0 , led_3 ) 拼起来
共阳极4个流水灯依次点亮(从led_0到led_3):
led_3 | led_2 | led_1 | led_0 |
1 | 1 | 1 | 0 |
1 | 1 | 0 | 1 |
1 | 0 | 1 | 1 |
0 | 1 | 1 | 1 |
依次点亮即为原led_2到led_0的三个状态变到led_3到led_1,原led_3的状态变到led_0
下个状态的led就是上个状态的( led_2到led_0 , led_3 ) 拼起来
共阳极4个流水灯依次点亮(从led_3到led_0):
led_3 | led_2 | led_1 | led_0 |
0 | 1 | 1 | 1 |
1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 |
1 | 1 | 1 | 0 |
依次点亮即为原led_3到led_1的三个状态变到led_2到led_0,原led_0的状态变到led_3
下个状态的led就是上个状态的( led_0 , led_3到led_1) 拼起来
弄懂流水灯原理之后,就可以开始设计程序,我们要设计一个每隔一定时间就能循环点亮的流水灯
所以我们需要根据需要写一个定时器程序,定时器实现的方法在我上一篇文章中有详细介绍:
系统框图如下:
时钟经过锁相环,进入定时器模块,定时器每隔1s,time_en拉高一次,4个led循环一次
代码如下:
module led_cycle(
input clk_25m,
input reset,
input time_en,
output reg[3:0] led_out
);
//eg1:共阴极从右向左
always@(posedge clk_25m)begin
if(reset)begin
led_out<=4'b1000;
end
else if(time_en==1)begin
led_out<={led_out[0],led_out[3:1]};
end
else begin
led_out<=led_out;
end
end
/*eg1:共阴极从左向右
always@(posedge clk_25m)begin
if(reset)begin
led_out<=4'b0001;
end
else if(time_en==1)begin
led_out<={led[2:0],led[3]};
end
else begin
led_out<=led_out;
end
end
//eg1:共阳极从右向左
always@(posedge clk_25m)begin
if(reset)begin
led_out<=4'b0111;
end
else if(time_en==1)begin
led_out<={led[0],led[3:1]};
end
else begin
led_out<=led_out;
end
end
//eg1:共阳极从左向右
always@(posedge clk_25m)begin
if(reset)begin
led_out<=4'b1000;
end
else if(time_en==1)begin
led_out<={led[2:0],led[3]};
end
else begin
led_out<=led_out;
end
end
*/
endmodule
对代码进行仿真,每个time_en到来时,LED右移一位
这样我们就完成了LED循环点亮的设计,我们只需要根据自己需求,更换led_out位数(led个数),更换定时器时间即可
ps,完整工程已经上传! 后面会更新花式流水灯设计,点赞支持Thanks♪(・ω・)ノ