标题:
FPGA按键控制流水灯
[打印本页]
作者:
栀子忍冬艳蔷薇
时间:
2021-3-26 22:15
标题:
FPGA按键控制流水灯
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2020/12/05 12:01:14
// Design Name:
// Module Name: led_flowing
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
//由按键控制的流水灯左移右移,暂停,复位功能。
module led_flowing(clk,led,rst_n,key_1,key_2,key_3
);
input clk;
input rst_n;//复位按键
input key_1;///控制起停 低电平停止移动,高电平继续移动
input key_2;///控制左移 流水灯左移 按下按键为0,控制左移,再按一次停止
input key_3;//控制右移 流水灯右移 按下按键为0,控制右移,再按一次停止
output reg[3:0] led;//led power on _0 led power off _1 led灯低电平亮,led灯高电平熄灭
reg [0:0]led_dir; // led left _1 led right _0 该位左移为1,右移为0;
reg [0:0]led_on; //led on_1 off_0
reg[31:0] timer_cout; //计数寄存器
always@(posedge clk or negedge rst_n) //achieve timer++
begin
if(rst_n!=1)
begin
timer_cout<=32'd0;
end
else if(timer_cout==32'd49_999_999) //计数50_000_000次为1秒,时钟为50Mhz
begin
timer_cout<=32'd0;
end
else
begin
timer_cout<=timer_cout+32'd1;
end
end
//
always@(posedge clk or negedge rst_n)
begin
if(rst_n!=1)
begin
led<=4'b1110;
end
else if((timer_cout==32'd49_999_999)&&(led_on==1)) //led_on==1开启移位功能
begin
if(led_dir==1) // 右移
begin
led<={led[0],led[3:1]}; //0,3,2,1,0
end //1,0,3,2
else //2,1,0,3
begin
led<={led[2:0],led[3]};//2,1,0,3//左移
end //1,0,3,2,
end //0,3,2,1,
end //3,2,1,0
//3位按键程序
reg [20:1] cnt;
always@(posedge clk or negedge rst_n)
begin
if(rst_n!=1)
begin
cnt<=20'd0;
end
else
begin
cnt<=cnt+20'd1;
end
end
reg[2:0]low_sw;
always@(posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
low_sw <= 3'b111;
end
else if (cnt== 20'hfffff) //满20ms,将按键值锁存到寄存器low_sw中cnt == 20'hfffff
begin
low_sw <= {key_3,key_2,key_1};
end
end
reg[2:0] low_sw_r;
always@(posedge clk or negedge rst_n)// 每个时钟周期的上升沿将low_sw锁存到low_sw_r中
begin
if (!rst_n)
low_sw_r <= 3'b111;
else
low_sw_r <= low_sw;
end
wire [2:0]led_ctrl = low_sw_r[2:0]&(~low_sw[2:0]);//////////////关键之处。
//判断键值与功能
always @(posedge clk or negedge rst_n)
if (!rst_n)
begin
led_on = 1'b0;
led_dir = 1'b0;
end
else
begin
if(led_ctrl[0]) led_on <= ~led_on;
if(led_ctrl[1]) led_dir <= 1'b1;
if(led_ctrl[2]) led_dir <= 1'b0;
end
endmodule
////////////////////////////////////////////////////////////////////////////////
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1