1.目的
本节实验目的是板上的触摸键的检测,并驱动LED灯。
2.FPGA芯片型号
XC7A35TFGG484
3.硬件设计
AR101的使用(https://www.docin.com/p-972138456.html),如下描述,当前电路连接方式为输出高电平有效、同步模式。
4.软件设计
//
//prj_top.v
//
`timescale 1ns / 1ps
module prj_top
(
input sys_clk,
input sys_rstn,
input key_tpad,
output led_out
);
wire key_en;
key_touch inst2_key_touch
(
.clk_i(sys_clk),
.rstn_i(sys_rstn),
.key_tpad(key_tpad),
.pos_key_tpad(),
.neg_key_tpad(key_en)
);
led_driver inst2_led
(
.clk_i(sys_clk),
.rstn_i(sys_rstn),
.key_in(key_en),
.led_out(led_out)
);
endmodule
//
//key_touch.v
//
//检测触摸键IC输出状态
module key_touch
(
input clk_i,
input rstn_i,
input key_tpad,
output pos_key_tpad,
output neg_key_tpad
);
reg key_tpad_d0, key_tpad_d1;
always@(posedge clk_i or negedge rstn_i)
begin
if(!rstn_i)
begin
key_tpad_d0 <= 1'b0;
key_tpad_d1 <= 1'b0;
end
else
begin
key_tpad_d0 <= key_tpad;
key_tpad_d1 <= key_tpad_d0;
end
end
assign pos_key_tpad = key_tpad_d0 & (~key_tpad_d1);
assign neg_key_tpad = (~key_tpad_d0) & key_tpad_d1;
endmodule
//
//led_driver.v
//
module led_driver
(
input clk_i,
input rstn_i,
input key_in,
output led_out
);
reg led_o;
always@(posedge clk_i or negedge rstn_i)
begin
if(!rstn_i)
led_o <= 1'b0;
else if(key_in)
led_o <= ~led_o;
else
led_o <= led_o;
end
assign led_out = led_o;
endmodule
5.仿真
`timescale 1ns / 1ps
module tb_top();
parameter T = 20;
reg key ;
reg sys_clk ;
reg sys_rstn;
wire led;
initial
begin
key =1'b0;//按键初始状态为全断开
sys_clk =1'b0; //初始时钟为低电平
sys_rstn =1'b0; //复位信号初始为低电平
#T//
sys_rstn =1'b1; //一个时钟周期后复位信号拉高
#(10000000*T) //200ms
key = 1'b1; //触摸状态
#T
key = 1'b0; //触摸状态
#(10000000*T) //200ms
key = 1'b1; //触摸状态
#T
key = 1'b0; //触摸状态
end
always # (T/2) sys_clk <= ~sys_clk;
prj_top inst_prj_top
(
.sys_clk (sys_clk),
.sys_rstn (sys_rstn),
.key_tpad (key),
.led_out (led)
);
endmodule
仿真结果:
6.应用
信号名 |
方向 |
管脚 |
端口说明 |
电平标准 |
sys_clk |
input |
R4 |
系统时钟,50M |
LVCMOS33 |
sys_rst_n |
input |
U2 |
系统复位,低有效 |
LVCMOS33 |
TPAD |
input |
T5 |
触摸键驱动芯片输出,高有效 |
LVCMOS33 |
led[0] |
output |
R2 |
LED,高点亮 |
LVCMOS33 |
#------------------------------系统时钟和复位-----------------------------------
create_clock -period 20.000 -name sys_clk [get_ports sys_clk]
set_property -dict {PACKAGE_PIN R4 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets sys_clk]
set_property -dict {PACKAGE_PIN U2 IOSTANDARD LVCMOS33} [get_ports sys_rstn]
#----------------------------------触摸按键-------------------------------------
set_property -dict {PACKAGE_PIN T5 IOSTANDARD LVCMOS33} [get_ports key_tpad]
#-----------------------------------LED-----------------------------------------
set_property -dict {PACKAGE_PIN R2 IOSTANDARD LVCMOS33} [get_ports {led_out}]