目录
1 LED 灯简介
单向导电性。
一般将电流限定在 3~20mA
之间,电流过大就会烧坏二极管。
2 实验任务
使领航者底板上的 PL LED0
和
PL LED1
以固定的频率交替闪烁。
3 硬件设计
本实验中,系统时钟、按键复位以及两个 LED
端口的管脚分配如下表所示,其中复位按键和两个LED 位于底板上,时钟位于核心板上:
对应的 XDC
约束语句如下所示:
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports sys_clk]set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports sys_rst_n]set_property -dict {PACKAGE_PIN H15 IOSTANDARD LVCMOS33} [get_ports {led[0]}]set_property -dict {PACKAGE_PIN L15 IOSTANDARD LVCMOS33} [get_ports {led[1]}]
4 程序设计
本次设计的模块端口及信号连接如下图所示:
其中,计数器对 50MHz
时钟进行计数,从而达到计时的目的。计数器在每次计时到
1
秒之后清零,然后重新开始计数,计数的值用于控制 LED
的显示状态。当计数器的值小于
0.5s
时,就把
LED0
点亮并把 LED1
熄灭;每当计数器的值大于
0.5s
时,就把
LED0
熄灭并把
LED1
点亮,以此实现两个
LED
的交替闪烁。
LED 闪烁模块的代码如下:
module led_twinkle(
input sys_clk , //系统时钟
input sys_rst_n, //系统复位,低电平有效
output [1:0] led //LED 灯
);
//reg define
reg [25:0] cnt ;
//*****************************************************
//** main code
//*****************************************************
//对计数器的值进行判断,以输出 LED 的状态
assign led = (cnt < 26'd2500_0000) ? 2'b01 : 2'b10 ;
//计数器在 0~5000_000 之间进行计数
always @ (posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
cnt <= 26'd0;
else if(cnt < 26'd5000_0000)
cnt <= cnt + 1'b1;
else
cnt <= 26'd0;
end
endmodule
本程序中输入时钟为 50MHz
,所以一个时钟周期为
20ns
(
1/50MHz
)。因此计数器
cnt
通过对
50MHz 系统时钟计数,计时到 1s
,需要累加
1s/20ns=5000_0000
次。在代码第
23
行,每当计时到
1s
计数器清零一次。
同时,在代码的第 16
行,对根据计数器的计数值来赋值两个
LED
的状态。当计数值小于
26'd2500_000
即计时到
1s
中的前
500ms
时,
LED0
点亮
LED1
熄灭;当计数值大于等于
26'd2500_000
,即 计时到 1s
中的后
500ms
时,
LED0
熄灭
LED1
点亮。当计数到
1s
时,计数器又会回
0
,重复此过程。以此实现两个 LED
的交替闪烁。