文章目录
前言
在FPGA学习中,LED灯实验作为一个经典的入门实验,其地位堪比编程界的“Hello , Word"。对于很多工程师来说,LED灯的亮灭是他们在硬件上观察到的第一个现象。生活当中LED灯的运用也十分广泛,比如报警器,红绿灯等。那么对于FPGA来说,LED灯是如何控制的呢,运用LED灯还可以做那些东西呢,下面我们就用两个小实验对其进行介绍。
一、LED灯简介
LED也叫做发光二极管,是一种能够将电能转化为可见光的固态半导体器件。LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源正极,使整个晶片被环氧树脂封装起来。
LED灯工作电流很小,抗冲击和抗震性能好,可靠性高,使用寿命长。正是由于这些优点,LED灯被广泛运用在仪器仪表中做指示灯、液晶屏幕光源等诸多领域。由于不同材料的发光二极管可以发出红、橙、黄、绿、青、蓝、紫、白这八种颜色的光,所以市面上各种颜色的LED光源均有涉足。
扫描二维码关注公众号,回复: 15265127 查看本文章
二、LED呼吸灯实验
1.实验目的
LED呼吸灯的原理就是让LED灯在规定的时间进行连续的点亮与熄灭,比如在本次实验中就是让LED灯在1秒内进行亮灭各一次,也就是LED灯亮500ms,灭500ms。在我们的开发板上有4个LED灯可供选择,可以任意选择一个进行控制,在管脚绑定时绑定相应的管脚即可。
2.程序设计
由于人眼的视觉暂留效应,呼吸灯的亮灭状态间隔时间最好不要低于0.1s,否则就不能清晰地观察到效果。这里我们让呼吸灯每间隔0.5s变化一次,在程序设计中运用计数器累加计数来记时,计时达0.5s后计数器清零并重新开始计数,这样就可以得到固定的时间间隔,每当计数器计数满0.5s就让LED灯发光状态改变一次,就得到呼吸灯效果了。
呼吸灯模块代码如下:
/*========================================*
filename : breath_led.v
description : led呼吸灯
time : 2022-11-08
author : 卡夫卡与海
*========================================*/
module breath_led(
input clk ,
input rst_n ,
output reg led
);
//参数定义
parameter TIME_500ms = 25_000_000;//500ms
//信号定义
reg [24:0] cnt_500ms ;//计数器
wire add_cnt_500ms ;
wire end_cnt_500ms ;
//cnt_500ms
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt_500ms <= 0;
end
else if(add_cnt_500ms)begin
if(end_cnt_500ms)begin
cnt_500ms <= 0;
end
else begin
cnt_500ms <= cnt_500ms + 1'b1;
end
end
end
assign add_cnt_500ms = 1'b1;
assign end_cnt_500ms = add_cnt_500ms && cnt_500ms == (TIME_500ms - 1);
//led
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
led <= 0;
end
else if(end_cnt_500ms)begin
led <= ~led;
end
end
endmodule
测试模块代码如下:
`timescale 1ns/1ns //定义仿真时间单位1ns和仿真时间精度1ns
module breath_led_tb(); //测试模块
reg clk ;//时钟信号
reg rst_n ;//复位信号
wire led ;
//参数定义
parameter CYCLE_CLOCK = 20;//时钟周期为20ns
parameter RST_TIME = 40 ;//复位时间定义
//产生时钟
initial begin
clk = 1'b0;
forever
#(CYCLE_CLOCK/2)
clk = ~clk;
end
//产生复位
initial begin
rst_n = 1'b0;
#(RST_TIME);
rst_n = 1'b1;
#10000;
$stop;
end
//模块例化
breath_led u_breath_led(
/*input */.clk (clk ),
/*input */.rst_n (rst_n),
/*output reg */.led (led )
);
endmodule
说明:
本程序中的输入时钟为50MHZ,所以一个时钟周期为20ns。因此计数器在计数0.5s时需要计数25000000个时钟周期,且每当计数器计数到0.5s时计数器进行清零并重新开始计数。同时在计数器计满0.5s时,led灯进行状态切换,这就达到了呼吸灯的实验效果。
3、仿真验证
仿真波形如下:
在这里我是用的Modelsim与Quartus II进行联合仿真的,个人比较习惯将这两个软件关联起来用,这样可以提高开发效率,关于如何将两者进行关联以及如何进行联合仿真,敬请期待后续教程,谢谢!
总结
LED呼吸灯的控制是一个比较简单的实验,逻辑比较简单,所以设计起来思路是比较清晰的,这里由于我缺少开发板硬件,所以就没有进行上板展示效果了。