目录
一、前言
连接开发板,上电,调试串口是否正常连接。
目标:实现不按按键时,灯灭,按按键对应的灯亮(闪烁)
对应关系key0---led0,以此类推。
二、硬件连接分析
ax309开关按键部分电路,如图可知按键抬起为高电平、按键按下为低电平,而led是共阴极,高电平输入亮,怎么使按键按下产生高电平输出并且连接到led输入端是我们的设计核心。
三、代码逻辑分析以及编写
代码逻辑设计:按键按下本身低电平输出怎么转换为led的高电平输入——反相器
那么我们都知道按键存在抖动,如何消抖——锁存器
常见的消抖电路、以及消抖原理:Spartan-6 ax309学习日记7——按键消抖电路、原理_永远前进不waiting的博客-CSDN博客
设计图:
在clk控制下, 第一级寄存器的作用是在时钟上升沿时将按键信号锁存。这样,即使按键信号出现短暂抖动,只要在一个完整的时钟周期内抖动结束,在下一个时钟上升沿触发时,将保留稳定的按键状态。第二级寄存器的作用是在第一级寄存器的基础上再次锁存,确保即使在第一个时钟上升沿和第二个时钟上升沿之间的抖动期间,LED的状态仍然是稳定的。这样,可以防止抖动期间的高低电平变化对LED的控制产生干扰。
代码段如下:
`timescale 1ns / 1ps
module key_test
(
input clk, //system clock 50Mhz on board
input [3:0] key, //input four key signal,when the keydown,the value is 0
output[3:0] led //LED display ,when the siganl high,LED lighten
);
reg[3:0] led_r; //define the first stage register , generate four D Flip-flop
reg[3:0] led_r1; //define the second stage register ,generate four D Flip-flop
always@(posedge clk)
begin
led_r <= ~key; //first stage latched data
end
always@(posedge clk)
begin
led_r1 <= led_r; //second stage latched data
end
assign led = led_r1;
endmodule
ucf文件
NET "clk" LOC = T8 | TNM_NET = sys_clk_pin;
TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz;
########LED Pin define#####################
NET led<0> LOC = P4 | IOSTANDARD = "LVCMOS33"; ## LED1
NET led<1> LOC = N5 | IOSTANDARD = "LVCMOS33"; ## LED2
NET led<2> LOC = P5 | IOSTANDARD = "LVCMOS33"; ## LED3
NET led<3> LOC = M6 | IOSTANDARD = "LVCMOS33"; ## LED4
########KEY Pin define#####################
NET key<0> LOC = C3 | IOSTANDARD = "LVCMOS33"; ## KEY1
NET key<1> LOC = D3 | IOSTANDARD = "LVCMOS33"; ## KEY2
NET key<2> LOC = E4 | IOSTANDARD = "LVCMOS33"; ## KEY3
NET key<3> LOC = E3 | IOSTANDARD = "LVCMOS33"; ## KEY4
四、RTL图分析
- 编译成功,三个绿色勾
- 结果和预期一致,接着下载到芯片中即可