上篇【FPGA实验】流水灯实验记录了如何上手FPGA,实现简单的流水灯效果,本篇将稍微升级一些,通过按钮实现多种形态的流水灯。此次仍使用正点原子的开拓者FPGA开发板,配置和上篇一致。
按键1按下时,从右向左的流水灯效果;
按键2按下时,从左向右的流水灯效果;
按键3按下时,LED闪烁;
按键4按下时,LED全亮;
无按键按下时,LED熄灭 ;
先贴官方给的例程代码:
module flow_light(input sys_clk , //50Mhz系统时钟input sys_rst_n, //系统复位,低有效input [3:0] key, //按键输入信号output reg [3:0] led //LED输出信号);//reg define
reg [23:0] cnt;
reg [1:0] led_control;//用于计数0.2s的计数器
always @ (posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n)cnt<=24'd9_999_999;else if(cnt<24'd9_999_999)cnt<=cnt+1;elsecnt<=0;
end //用于led灯状态的选择
always @(posedge sys_clk or negedge sys_rst_n) beginif (!sys_rst_n)led_control <= 2'b00;else if(cnt == 24'd9_999_999) led_control <= led_control + 1'b1;elseled_control <= led_control;
end//识别按键,切换显示模式
always @(posedge sys_clk or negedge sys_rst_n) beginif(!sys_rst_n) beginled<=4'b 0000;endelse if(key[0]== 0) //按键1按下时,从右向左的流水灯效果case (led_control)2'b00 : led<=4'b1000;2'b01 : led<=4'b0100;2'b10 : led<=4'b0010;2'b11 : led<=4'b0001;default : led<=4'b0000;endcaseelse if (key[1]==0) //按键2按下时,从左向右的流水灯效果case (led_control)2'b00 : led<=4'b0001;2'b01 : led<=4'b0010;2'b10 : led<=4'b0100;2'b11 : led<=4'b1000;default : led<=4'b0000;endcaseelse if (key[2]==0) //按键3按下时,LED闪烁case (led_control)2'b00 : led<=4'b1111;2'b01 : led<=4'b0000;2'b10 : led<=4'b1111;2'b11 : led<=4'b0000;default : led<=4'b0000;endcaseelse if (key[3]==0) //按键4按下时,LED全亮led=4'b1111;elseled<=4'b0000; //无按键按下时,LED熄灭
endendmodule
和之前类似,开发板上共有四个LED灯。
因此用一个四位寄存器led来存储每个灯的状态,1亮0灭。这里值得注意的是,四位存储的状态方向和实际方向是相反的。
开发板上共四个按键,由于按键的信息不需要存贮(直接获取判断即可),因此采用四位的线网类型的key来判断按键是否被按下。若按下,则key获取到的是低电平,即0。
考虑到流水灯的情况,因此最多有4个状态。这里用两位led_control来进行状态的切换,每0.2s切换一次状态,00,01,10,11周而复始。
频率的实现在上篇的流水灯中已经介绍过,这里采用是计数器累加的方式。
这里基于上面的分析,可以进一步拓展功能。
如果需要按下按键,改变流水灯的花样,多设置几个led_control即可。
如果需要改变流水灯的速率,采用不同的cnt即可。
最后基于引脚图进行管脚分配。
本文发布于:2024-02-04 22:38:12,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170717973260333.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |