【FPGA】二、LED呼吸灯控制

文章目录

前言

一、LED灯简介

二、LED呼吸灯实验

1.实验目的

2.程序设计

 3、仿真验证

总结


前言

        在FPGA学习中,LED灯实验作为一个经典的入门实验,其地位堪比编程界的“Hello , Word"。对于很多工程师来说,LED灯的亮灭是他们在硬件上观察到的第一个现象。生活当中LED灯的运用也十分广泛,比如报警器,红绿灯等。那么对于FPGA来说,LED灯是如何控制的呢,运用LED灯还可以做那些东西呢,下面我们就用两个小实验对其进行介绍。

一、LED灯简介

        LED也叫做发光二极管,是一种能够将电能转化为可见光的固态半导体器件。LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源正极,使整个晶片被环氧树脂封装起来。

        LED灯工作电流很小,抗冲击和抗震性能好,可靠性高,使用寿命长。正是由于这些优点,LED灯被广泛运用在仪器仪表中做指示灯、液晶屏幕光源等诸多领域。由于不同材料的发光二极管可以发出红、橙、黄、绿、青、蓝、紫、白这八种颜色的光,所以市面上各种颜色的LED光源均有涉足。

二、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呼吸灯的控制是一个比较简单的实验,逻辑比较简单,所以设计起来思路是比较清晰的,这里由于我缺少开发板硬件,所以就没有进行上板展示效果了。

猜你喜欢

转载自blog.csdn.net/weixin_62912626/article/details/127747171