lesson 2 独立按键控制led灯
实现效果:无按键按下时, LED灯全灭;按键1按下时, LED灯显示自右向左的流水效果;按键2按下时, LED灯显示自左向右的流水效果;按键3按下时,四个LED灯同时闪烁;
按键4按下时, LED灯全亮。
设计过程
计数器设计:led在闪烁效果和流水效果实现需要时间间隔至少0.1s,在此我们设置为0.2s,因此需要设计一个0.2s的计数器,每隔0.2s计数器加一。
-
module key_led( input sys_clk, input rst_n, output reg [3:0] key, output reg [3:0] led ); reg [23:0] cnt; reg [1:0] led_control; //系统时钟,计数器计数,计时0.2s always@(posedge sys_clk or negedge rst_n) begin if(!rst_n) cnt <= 0; else if(cnt < 24'd9_999_999)//计数满0.2S。此处与上个流水灯实验不同,上个流水灯实验计数为10_000_000,实际上多计数了一个周期,此处刚好1000_0000个周期 cnt <= cnt + 1'b1; else cnt <= 24'd0; end //led状态选择 always@(posedge sys_clk or negedge rst_n) begin if(!rst_n) led_control <= 0; else if(cnt == 24'd9_999_999) led_control <= led_control + 1'b1; else led_control <= led_control; end //检测按键 always@(posedge sys_clk or negedge rst_n) begin if(!rst_n) led <= 4'b0000; //led全灭 else if(key[0]==0) begin 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; end else if(key[1]==0) begin 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; end else if(key[2]==0) begin 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; end else if(key[3]==0) led <= 4'b1111; else led <= 4'b0000; end endmodule
案列来源:新起点开发板资料