其他分享
首页 > 其他分享> > xilinx基础篇Ⅱ(5)Prj1 触摸键驱动LED

xilinx基础篇Ⅱ(5)Prj1 触摸键驱动LED

作者:互联网

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}]

标签:LED,clk,sys,Prj1,key,input,xilinx,led,rstn
来源: https://blog.csdn.net/Roy_tly/article/details/121455128