LED流水灯原理
实验原理
LED(Light Emitting Diode) 发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光;它是正向导通(正极到负极)反向截止(负极到正极)的器件。对于直插式LED,长脚为正极,短脚为负极.对于贴片式LED,有绿点的一端为负极。
在正常工作情况下,常规的绿,蓝,白,暖白LED灯的导通电压为3.0-3.5V,红,黄LED灯为2.5-2.8V。电流一般15毫安为宜。一般高亮LED采用的限流电阻是400-500欧姆,普通的采用1K左右的就行了,但不要超过2K。发光二极管的反向击穿电压约5伏。
LED的特点非常明显,寿命长、光效高、低辐射与低功耗。白光LED的光谱几乎全部集中于可见光频段,其发光效率可超过150lm/W。
LED流水灯,无非就是控制8个LED灯亮灭的顺序,通常采用的方法有移位、循环赋值等等。
移位方式:首先产生移位时钟,该时钟的频率不能够高,否则LED的显示速度过快,达不到预期效果,通过移位时钟控制led_temp循环右移。
循环幅值:首先产生显示时钟,该时钟的频率不能够高,否则LED的显示速度过快,达不到预期效果,通过显示时钟,在每个时钟的上升沿向LED幅值。
实验原理图
通过原理图可以看出,当LED的负极为低电平时LED导通,否则截至,通过这我们便知道LED 的驱动原理。
实验程序
移位方式:
/********************************版权声明**************************************
** 大西瓜团队
**
**----------------------------文件信息--------------------------
** 文件名称: led.v
** 创建日期:
** 功能描述:实现LED彩灯显示功能
** 硬件平台:大西瓜logic^3 FPGA开发板,http://daxiguafpga.taobao.com
** 版权声明:本代码属个人知识产权,本代码仅供交流学习.
**---------------------------修改文件的相关信息----------------
** 修改人:
** 修改日期:
** 修改内容:
*******************************************************************************/
module(
,//50M时钟输入
,//复位信号,高电平复位?
//led输出
);
input;
input;
output[7:0];
wire,reset;
reg[7:0]led,led_temp;
reg[40:0];//分频计数器
always@(posedgeornegedge)
begin
if(!reset)//复位
begin
<=8'h80;
<=41'h0;
end
else
begin
<=count+1;
if(count==41'hff_ff_ff)
begin
<=led_temp>>1;
<=~led_temp;
<=0;
if(led_temp==8'h01)
<=8'h80;
end
end
end
endmodule
循环幅值:
/********************************版权声明**************************************
** 大西瓜团队
**
**----------------------------文件信息--------------------------
** 文件名称: led_water.v
** 创建日期:
** 功能描述:实现LED显示功能
** 硬件平台:大西瓜第三代开发板,http://daxiguafpga.taobao.com
** 版权声明:本代码属个人知识产权,本代码仅供交流学习.
**---------------------------修改文件的相关信息----------------
** 修改人:
** 修改日期:
** 修改内容:
*******************************************************************************/
module(clk,led,reset);
input;
input;
output[7:0];
reg[7:0];
reg[23:0];
reg[4:0];
reg;
// assign led = 8'h55;
always@(posedge)
begin
if(counter==24'h500000)
begin
<=~clk_div;
<=24'h000000;
end
else
<=counter+1'b1;
end
always@(posedgeornegedge)
begin
if(!reset)
begin
<=8'hff;
<=5'b0;
end
else
begin
case(led_state)
5'b00000:<=8'b1111_1110;
5'b00001:<=8'b1111_1101;
5'b00010:<=8'b1111_1011;
5'b00011:<=8'b1111_0111;
5'b00100:<=8'b1110_1111;
5'b00101:<=8'b1101_1111;
5'b00110:<=8'b1011_1111;
5'b00111:<=8'b0111_1111;
5'b01000:<=8'b1011_1111;
5'b01001:<=8'b1101_1111;
5'b01010:<=8'b1110_1111;
5'b01011:<=8'b1111_0111;
5'b01100:<=8'b1111_1011;
5'b01101:<=8'b1111_1101;
5'b01110:<=8'b1111_1110;
5'b01111:<=8'b1110_0111;
5'b10000:<=8'b1101_1011;
5'b10001:<=8'b1011_1101;
5'b10010:<=8'b0111_1110;
5'b10011:<=8'b1011_1101;
5'b10100:<=8'b1101_1011;
5'b10101:<=8'b1110_0111;
5'b10110:<=8'b1010_1010;
5'b10111:<=8'b0101_0101;
5'b11000:<=8'b1000_0000;
5'b11001:<=8'b0100_0000;
5'b11010:<=8'b0010_0000;
5'b11011:<=8'b0001_0000;
5'b11100:<=8'b0000_1000;
5'b11101:<=8'b0000_0100;
5'b11110:<=8'b0000_0010;
5'b11111:<=8'b0000_0001;
default:led<=8'b1111_1111;
endcase
<=led_state+1'b1;
end
end
endmodule
实验效果