FPGA 按键key

异或符号 ^ 可以用来取反

一级文件

`timescale 1 ns / 1 ps

module key_test(
	clk,
	rst_n,
	key_in,
	led_out
);

parameter led_num = 3;

input clk, rst_n;
input [led_num - 1:0] key_in;
output[led_num - 1:0] led_out;

key #(
	.led_num(led_num)	
)
key_inst(
	.clk(clk),
	.rst_n(rst_n),
	.key_in(key_in),
	.led_out(led_out)
);

endmodule

二级文件

`timescale 1 ns / 1 ps

module key(
	clk,
	rst_n,
	key_in,
	led_out
);

parameter led_num = 4;

input  clk , rst_n;
input  [led_num - 1:0] key_in;
output [led_num - 1:0] led_out;

reg  [7:0] cnt;
reg  [led_num - 1:0]  led_out;
reg  [led_num - 1:0]  key_scan_1;
reg  [led_num - 1:0]  key_scan_2;
wire [led_num - 1:0]  key_flag;

always @(posedge clk or negedge rst_n)
begin
	if(~rst_n)
	begin
		cnt <= 8'd0;
		key_scan_1 <= {led_num{1'b1}};
	end
	else
	begin
		if(key_in != {led_num{1'b1}})
		begin
			if((cnt >= 8'd0) && (cnt < 8'd199))
			begin
				cnt <= cnt + 8'd1;
				key_scan_1 <= key_scan_1;
			end
			else if(cnt == 8'd199)
			begin
				cnt <= 8'd0;
				key_scan_1 <= key_in;
			end
			else
			begin
				cnt <= 8'd0;
				key_scan_1 <= {led_num{1'b1}};
			end
		end
		else
		begin
			cnt <= 8'd0;
			key_scan_1 <= {led_num{1'b1}};
		end
	end	
end 

always @(posedge clk or negedge rst_n)
begin
	if(~rst_n)
		key_scan_2 <= {led_num{1'b1}};
	else
		key_scan_2 <= key_scan_1;
end

assign key_flag = key_scan_2 & (~key_scan_1);

always @(posedge clk or negedge rst_n)
begin
	if(~rst_n)
		led_out <= {led_num{1'b0}};
	else
		led_out <= led_out ^ key_flag;  //当按键按下对应的LED等反转
end

endmodule
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值