第一:项目需求,
四种按键对应四种不同的LED灯状态。,不同状态变化时间间隔是0.2s。
第二:运行的代码
//右下角坐标,如何改变时间尺度
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;
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
按键3不使用 led<=~led,取反的原因是,这样就不能满足0.2s的间隔。
按键3采用led<=~led 的仿真结果如图所示,
key[2]==0 时,led 的状态处于一种无法确定的状态。
第三:测试文件
`timescale 1ns/1ns
module key_led_tb();
reg clk;
reg rst_n;
reg [3:0] key;
reg key_value;
wire [3:0] led;
parameter T=20;
//初始化的过程首先要复位 //是否可以使用==赋值
initial begin
key =4'b1111;//按键初始状态为全断开
clk =1'b0; //初始时钟为低电平
rst_n =1'b0; //复位信号初始为低电平
#T rst_n =1'b1; //一个时钟周期后复位信号拉高
#600_000_020 key[0] =0; //0.6s时按下按键1
#800_000_000 key[0] =1;
key[1] =0; //0.8s后松开按键1,按下按键2
#800_000_000 key[1] =1;
key[2] =0; //0.8s后松开按键2,按下按键3
#800_000_000 key[2] =1;
key[3] =0; //0.8s后松开按键3,按下按键4
#800_000_000 key[3] =1; //0.8s后松开按键4
end
always #(T/2) clk=~clk;
key_led key_led_u1(
.sys_clk (clk),
.sys_rst_n (rst_n),
.key (key),
.led (led)
);
endmodule
请注意: 在测试文件中<= 和 = 都可以。建议采用=。
仿真结果
总结:运行代码中使用了led_control