本文主要是介绍16 、zedboard之纯PL按键实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
实验基本目的:实验手册PL的流水灯,基本流程参考手册;
逻辑代码解析:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 03/11/2020 07:37:12 PM
// Design Name:
// Module Name: PL
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module PL(
clk,
rst_n,
sw,
led);input clk;input rst_n;input [3:0]sw;output [3:0]led;reg [3:0] sw_reg_0;always@(posedge clk or negedge rst_n)if(!rst_n)beginsw_reg_0<=4'b1111;endelsebeginsw_reg_0<=sw;endreg [3:0] sw_reg_1;always@(posedge clk or negedge rst_n)if(!rst_n)beginsw_reg_1<=4'b1111;endelsebeginsw_reg_1<=sw_reg_0;endreg [19:0]cnt;
wire [3:0]key_an_0; assign key_an_0= sw_reg_0 &(~sw_reg_1);always@(posedge clk or negedge rst_n)
if (!rst_n)beginend // 1/50MHZ=0.02us
else if(cnt==20'h186a0) //20000us/0.02us=1000000begincnt<=20'h00000;end else if(key_an_0)begincnt<=20'h00000;endelse begincnt<=cnt+1'b1;endreg [3:0] sw_reg_2;always@(posedge clk or negedge rst_n)if (!rst_n)beginsw_reg_2<=4'b1111;end
else if(cnt==20'h186a0)beginsw_reg_2<=sw;endreg [3:0] sw_reg_3;always@(posedge clk or negedge rst_n)if(!rst_n)beginsw_reg_3<=4'b1111;endelsebeginsw_reg_3<=sw_reg_2;end
wire [3:0]key_an_1;
assign key_an_1= sw_reg_3& (~sw_reg_2);reg [3:0] led_reg;always@(posedge clk or negedge rst_n)
if (!rst_n)
begin
led_reg<=4'b0000;
end
else
begin
if(key_an_1[0]) led_reg[0]<=~led_reg[0];
if(key_an_1[1]) led_reg[1]<=~led_reg[1];
if(key_an_1[2]) led_reg[2]<=~led_reg[2];
if(key_an_1[3]) led_reg[3]<=~led_reg[3];
endassign led= led_reg;
endmodule
主要是按键消除抖动的时间计算
因为 按键会有20~30ms的抖动时间,因此需要在抖动之后在检测,按键是否真的被按下,
因为FPGA的芯片时钟是50MHZ ,也就是脉冲每0.02us变化一次, 因为抖动时间是20~30ms,
[20ms/0.02us,30ms/0.02us]为消除抖动区间[20'h186a0,24'h16e360]
这篇关于16 、zedboard之纯PL按键实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!