ZYNQ-PL学习实践(二)按键和定时器控制LED闪烁灯)
- [1 创建工程](#1 创建工程)
- [2 verilog 代码](#2 verilog 代码)
- [3 约束](#3 约束)
- [4 综合](#4 综合)
- [5 生成bit](#5 生成bit)
- 总结
1 创建工程

2 verilog 代码
添加key_led.v
文件,
c
module key_led(
input sys_clk , //系统时钟50MHz
input rst_n , //系统复位
input [1:0] key , //两个按键输入
output reg [1:0] led //;两个led 输出
);
//寄存器定义
reg [24:0] cnt; //25位寄存器
reg led_ctrl; //500ms定时器溢出切换标志
//定时器
always @ (posedge sys_clk or negedge rst_n) begin
if(!rst_n)
cnt <= 25'd0; //定时器清零
else if(cnt < 25'd2500_0000) //定时未满500ms
cnt <= cnt + 1'b1;
else
cnt <= 25'd0; //定时满500ms
end
//每隔500ms就更改LED溢出切换标志
always @ (posedge sys_clk or negedge rst_n) begin
if(!rst_n)
led_ctrl <= 1'b0;
else if(cnt == 25'd2500_0000)
led_ctrl <= ~led_ctrl;
end
//以定时器状态和按键状态,控制两个LED的亮灭
always @ (posedge sys_clk or negedge rst_n) begin
if(!rst_n)
led <= 2'b11;
else case(key)
2'b10 : //如果按键0按下、按键1未按下,则两个LED交替闪烁
if(led_ctrl == 1'b0)
led <= 2'b01;
else
led <= 2'b10;
2'b01 : //如果按键0未按下、按键1按下,则两个LED同时亮灭交替
if(led_ctrl == 1'b0)
led <= 2'b11;
else
led <= 2'b00;
2'b11 : //如果两个按键都未按下,则两个LED都保持点亮
led <= 2'b11;
default: ;
endcase
end
endmodule
3 约束
bash
set_property -dict {PACKAGE_PIN Y9 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]
set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]
set_property -dict {PACKAGE_PIN J21 IOSTANDARD LVCMOS33} [get_ports {key[0]}]
set_property -dict {PACKAGE_PIN L20 IOSTANDARD LVCMOS33} [get_ports key[0]]
set_property -dict {PACKAGE_PIN J20 IOSTANDARD LVCMOS33} [get_ports {key[1]}]
set_property -dict {PACKAGE_PIN A19 IOSTANDARD LVCMOS33} [get_ports {led[0]}]
set_property -dict {PACKAGE_PIN A18 IOSTANDARD LVCMOS33} [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports rst_n]
set_property PACKAGE_PIN A17 [get_ports rst_n]
4 综合

5 生成bit

生成bit路径
总结
本节介绍使用Vivado软件开发fpga 按键和定时器共同控制LED显示状态。
感谢阅读,祝君成功!
-by aiziyou