FPGA 按键控制流水灯的状态及其仿真

it2025-03-04  25

 第一:项目需求,

    四种按键对应四种不同的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

最新回复(0)