【FPGA】三、LED流水灯控制

文章目录


前言

        通过前面一章LED呼吸灯的实验,我们已经基本上了解了LED灯的物理特性,也对利用FPGA控制LED灯有了初步的了解,那么这一篇文章就是在上一篇的基础上增加了一些小的功能,不仅需要实现LED灯的亮灭,还要有规律的亮灭,实现多个LED灯的流水灯效果。


一、LED流水灯实验

1.实验目的

        实现开发板上4个LED灯顺序点亮并熄灭,循环往复产生流水的现象。

2.程序设计

        由于二极管的阳级分别与FPGA相应的管脚相连,只需要改变与LED灯相连的FPGA管脚的电平,LED灯的亮灭状态就会发生改变。当FPGA管脚为高电平时,LED灯点亮;为低电平时,LED灯熄灭。

        根据人的视觉暂留效应,这里我们让流水灯每隔0.2s变化一次,如果变化时间太快,人眼就不能捕捉到流水灯的视觉效果了。

流水灯模块代码如下:

/*========================================*
    filename    : flow_led.v
    description : led流水灯实验
    time        : 2022-11-08 
    author      : 卡夫卡与海
*========================================*/

module flow_led(
    input                clk     ,//系统时钟 50MHZ
    input                rst_n   ,//系统复位

    output  reg  [3:0]   led      //4个LED灯
);
//参数定义
parameter   TIME_200ms = 24'd10_000_000;//计数0.2s

//信号定义
reg    [23:0]     cnt_200ms   ;//计数器,计数200ms

//cnt 计算器对系统时钟计数,计数200ms
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt_200ms <= 24'd0;
    end
    else if(cnt_200ms == (TIME_200ms - 1))begin
        cnt_200ms <= 24'd0;
    end
    else begin
        cnt_200ms <= cnt_200ms + 1'b1;
    end
end

//通过移位寄存器控制IO口的高低电平,改变LED的显示状态
always @(posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        led <= 4'b0001;
    end
    else if(cnt_200ms == (TIME_200ms - 1))begin
        led[3:0] <= {led[2:0],led[3]};
    end
    else begin
        led <= led;
    end
end

endmodule

测试模块代码如下:

`timescale 1ns/1ns   //定义仿真时间单位1ns和仿真时间精度1ns

module flow_led_tb(); //测试模块
    reg           clk   ;//时钟信号
    reg           rst_n ;//复位信号

    wire  [3:0]   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

//模块例化
flow_led u_flow_led(
    /*input                */.clk     (clk  ),//系统时钟 50MHZ
    /*input                */.rst_n   (rst_n),//系统复位

    /*output  reg  [3:0]   */.led     (led  ) //4个LED灯
);

endmodule

说明:

        本程序的系统时钟为50MHZ,一个周期为20ns。

        每当计数器计数到10-000-000时,将各个LED灯状态左移一位,并将最高位的值移到最低位,循环往复,在其他时间段内,LED灯的状态保持不变。且LED灯的初始值必须有一位为1,其他为是0,这样在循环左移的过程中才能呈现出流水灯的效果。

3.仿真验证:

仿真波形如下:

         这里为了减少仿真过程中所需要的时间,我把流水灯变化的时间改为了100ns变化一次。从Modelsim的仿真波形来看,LED灯的变化顺序为0001→0010→0100→1000,符合我们预想的效果。


总结

        到此为止,LED灯的基本实验及内容就是这些了,感兴趣的小伙伴还可以利用LED灯去做更加复杂的逻辑控制,但是需要一个清晰的思路,那样会事半功倍,在有必要的时候还可以画一画时序图,最后看看仿真出来的时序图是否与你所画的时序图匹配。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FPGA(现场可编程门阵列)是一种可使用户定制硬件功能的集成电路芯片。UART(通用异步收发传输器)是一种在计算机和外部设备之间传输数据的串行通信协议。 串口控制LED流水灯是一种利用FPGA控制LED灯的方式。流水灯是一种 LED 灯条,其上的 LED 依次亮起或熄灭,给人一种流动的效果。 使用FPGA来实现UART串口控制LED流水灯,首先需要通过FPGA的引脚连接到UART串口模块。然后,根据串口通信协议,通过FPGA的逻辑电路将串口数据传输到LED流水灯控制部分。 在流水灯控制部分,通过设置FPGA的逻辑电路,可以实现LED灯的闪烁、亮度调节、流动速度调节等功能。对于串口数据,FPGA可以解析其中的指令,根据指令来控制LED灯的状态和效果。 例如,当收到特定的指令时,FPGA可以使得LED流水灯按照设定的亮度和速度流动。当收到其他指令时,FPGA可以使得LED流水灯停止流动或改变流动方向。 通过FPGA UART串口控制LED流水灯,可以实现灵活、可定制的LED灯条效果。用户可以通过发送不同的指令,改变LED灯的亮度、流动速度,与外设进行交互,实现更丰富的应用场景。这种方式充分利用FPGA的可编程性和UART串口的通信能力,为LED控制提供了一种高效、可定制的解决方案。 ### 回答2: FPGA是一种可编程逻辑器件,可以根据设计人员的需求进行灵活的编程控制。UART是一种通用异步收发传输接口,用于串行数据的传输。而LED流水灯是一种LED灯串联连接的电路,可以实现灯光的流水效果。 要使用FPGA控制LED流水灯,首先需要设计一个适当的电路。可以使用FPGA的数字逻辑单元和可编程的I/O引脚,将UART接口与LED灯的串口控制连接起来。 在FPGA中,通过编程的方式,配置UART的工作模式和传输参数,例如波特率、数据位数、校验等。接收到来自外部设备的串行数据后,通过逻辑单元进行解析和处理,将数据转换为相应的控制信号。 在LED流水灯方面,可以通过FPGA的I/O引脚输出控制信号,控制LED流水灯的亮灭。根据UART接收到的控制数据,FPGA可以实现不同的流水灯模式,例如顺序流水、倒序流水、闪烁等。 通过编程控制UART接收数据和LED流水灯控制信号的传输和处理,就可以实现FPGA对UART串口控制LED流水灯的功能。 总之,FPGA是一种具有灵活性的电路设备,可以通过编程对UART串口进行控制,实现LED流水灯控制效果。这种方法可以根据需求自定义串口传输和LED控制的参数和模式,具有很大的灵活性和可扩展性。 ### 回答3: FPGA是可重新配置的硬件,它可以实现各种数字电路设计的功能。UART是串行通信接口的一种标准,可用于在电路板之间进行数据传输。LED流水灯是一种LED灯效果,LED灯在不同的时间间隔内依次点亮。 要实现FPGA UART串口控制LED流水灯,需要进行以下步骤: 1. 首先,在FPGA上创建或导入所需的UART通信模块。该模块应支持常用的串口通信协议,如UART通信协议的发送和接收功能。 2. 在FPGA上创建或导入LED控制模块。该模块应支持控制LED的亮灭,以及按照一定的顺序和时间间隔点亮LED的功能。 3. 在FPGA上实现UART和LED控制模块之间的数据传输。通过UART通信模块,FPGA可以接收来自其他设备(如电脑或微控制器)发送的指令,以控制LED流水灯的效果。 4. 设计指令协议,以使来自UART的指令能够正确地被LED控制模块识别和执行。指令可以设定灯光的点亮顺序、时间间隔以及其他特效。 5. 配置和连接FPGA的输入和输出引脚。UART模块应与外部设备(如电脑或其他微控制器)的串口通信引脚连接,而LED控制模块应与LED灯的控制引脚连接。 最终,当FPGA通过UART接收到来自外部设备的指令时,LED控制模块会根据指令的要求,按照预设的顺序和时间间隔点亮LED灯。这样就实现了FPGA UART串口控制LED流水灯的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值