设计要求:初始状态LED全灭;四个按键分别能够控制LED灯呈现不同的花样显示。
//----------------------------------------------------------------------------------------
// Created by: Active_Zmw
// File name: fkey_led
// Descriptions: 按键控制LED灯
//content: 源代码+仿真
//----------------------------------------------------------------------------------------
//源代码
module key_led(
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) begin
if(!sys_rst_n)
cnt<=24'd9_999_999;
else if(cnt<24'd9_999_999)
cnt<=cnt+1;
else
cnt<=0;
end
//用于led灯状态的选择
always @(posedge sys_clk or negedge sys_rst_n) begin
if (!sys_rst_n)
led_control <= 2'b00;
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 sys_rst_n) begin
if(!sys_rst_n) begin
led<=4'b 0000;
end
else 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;
//led_control共2位,一直累加到11后再次累加会恢复到00,以此来达到控制效果
default : led<=4'b0000;
endcase
else 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;
endcase
else 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;
endcase
else if (key[3]==0) //按键4按下时,LED全亮
led<=4'b1111;
else
led<=4'b0000; //无按键按下时,LED熄灭
end
endmodule
//仿真
1 `timescale 1 ns/ 1 ns
2 module tb_key_led();
3
4 parameter T = 20;
5
6 reg [3:0] key ;
7 reg sys_clk ;
8 reg sys_rst_n;
9 reg key_value;
10
11 wire [3:0] led;
12
13 initial begin
14 key <=4'b1111;//按键初始状态为全断开
15 sys_clk <=1'b0; //初始时钟为低电平
16 sys_rst_n <=1'b0; //复位信号初始为低电平
17 #T sys_rst_n <=1'b1; //一个时钟周期后复位信号拉高
18
19 #600_000_020 key[0] <=0; //0.6s时按下按键1
20 #800_000_000 key[0] <=1;
21 key[1] <=0; //0.8s后松开按键1,按下按键2
22 #800_000_000 key[1] <=1;
23 key[2] <=0; //0.8s后松开按键2,按下按键3
24 #800_000_000 key[2] <=1;
25 key[3] <=0; //0.8s后松开按键3,按下按键4
26 #800_000_000 key[3] <=1; //0.8s后松开按键4
27
28 end
29
30 always # (T/2) sys_clk <= ~sys_clk;
31 key_led u_key_led(
32 .sys_clk(sys_clk),
33 .sys_rst_n(sys_rst_n),
34 .key(key),
35 .led(led)
36 );
37
38 endmodule
在上述设计中,必须使得按键一直按下流水灯才会被触发,如何更改为按键只按一次,流水定就会按照设定的按键模式进行运行。即一个按键控制一种模式,且按键按下生效,抬起按键依然有效。
思考emmmmmm。。。。。。。。。。后续补充一节完善代码。