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

关于呼吸的C语言编程Options 1,0,0 // Target 'Target 1' Device (AT89C51) Vendor (Atmel) Cpu (IRAM(0-0x7F) IROM(0-0xFFF) CLOCK(24000000)) FlashUt () StupF ("LIB\STARTUP.A51" ("Standard 8051 Startup Code")) FlashDR () DevID (2976) Rgf (REGX51.H) Mem () C () A () RL () OH () DBC_IFX () DBC_CMS () DBC_AMS () DBC_LMS () UseEnv=0 EnvBin () EnvInc () EnvLib () EnvReg (Atmel\) OrgReg (Atmel\) TgStat=16 OutDir (.\) OutName (a9) GenApp=1 GenLib=0 GenHex=1 Debug=1 Browse=1 LstDir (.\) HexSel=0 MG32K=0 TGMORE=0 RunUsr 0 0 RunUsr 1 0 BrunUsr 0 0 BrunUsr 1 0 SVCSID MODEL5=0 RTOS5=0 ROMSZ5=2 DHOLD5=0 XHOLD5=0 T51FL=80 XT51FL=0 CBANKS5=0 XBANKS5=0 RCB51 { 0,0,0,0,0,0,0,1,0 } RXB51 { 0,0,0,0,0,0,0,0,0 } OCM51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } OCR51 { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } IRO51 { 1,0,0,0,0,0,16,0,0 } IRA51 { 0,0,0,0,0,128,0,0,0 } XRA51 { 0,0,0,0,0,0,0,0,0 } XRA512 { 0,0,0,0,0,0,0,0,0 } IROM512 { 0,0,0,0,0,0,0,0,0 } C51FL=21630224 C51VA=0 C51MSC () C51DEF () C51UDF () INCC5 () AX51FL=4 AX51MSC () AX51SET () AX51RST () INCA5 () PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } IncBld=1 AlwaysBuild=0 GenAsm=0 AsmAsm=0 PublicsOnly=0 StopCode=3 CustArgs () LibMods () BankNo=65535 LX51FL=292 LX51OVL () LX51MSC () LX51DWN () LX51LFI () LX51ASN () LX51RES () LX51CCL () LX51UCL () LX51CSC () LX51UCS () LX51COB () LX51XDB () LX51PDB () LX51BIB () LX51DAB () LX51IDB () LX51PRC () LX51STK () LX51COS () LX51XDS () LX51BIS () LX51DAS () LX51IDS () OPTDL (S8051.DLL)()(DP51.DLL)(-p51)(S8051.DLL)()(TP51.DLL)(-p51) OPTDBG 48125,-1,()()()()()()()()()() ()()()() FLASH1 { 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0 } FLASH2 () FLASH3 () FLASH4 () EndOpt
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值