学习笔记——流水灯实例(FPGA)

一、功能简介

在这里插入图片描述

  • 如图所示:开发板上左上角有八个LED灯。下图是LED灯的电路图。

在这里插入图片描述

  • 由图可知,这些LED灯,正极连接51Ω限流电阻后到3.3Ⅴ电压。负极都连接到FPGA的I/O口上。有电路可知。我们可以通过I/O口的高低电平控制LED灯的亮灭,这和通过高低电平控制蜂鸣器的声响是同一个道理。只有两个状态,那就是响与不响,和亮与不亮。但是不同之处在于蜂鸣器是通过拨码开关控制,而且之前的拨码开关只是设置了一个开关控制蜂鸣器。现在这个是有多个灯需要我们控制。
  • 流水灯的话,就需要我们循环点亮。循环的话就是有一个时间的规定,那么我们需要一个定时器,我们选用FPGA内部的定时器来规定流水灯的循环时间。
  • 功能:通过FPGA内部的定时器循环点亮每个LED灯,达到流水灯的效果,八个LED灯我们依次赋值,每次赋值只允许一个灯亮,每次点亮延时一定时间,八个LED灯依次被点亮一次然后再重新,从第一个灯开始,以此达到了流水灯的效果,这个功能和我们学习单片机的时候是相同的,那么在代码和原理上面有和不同呢,我们接着学习。

二、状态机结构

在这里插入图片描述

三、代码分析

方法一

module cy4(
input ext_clk_25m, //外部输入 25MHz 时钟信号
input ext_rst_n, //外部输入复位信号,低电平有效
output reg[7:0] led //8 个 LED 指示灯接口
);
//-------------------------------------
reg[19:0] cnt; //20 位计数器
//cnt 计数器进行循环计数
always @ (posedge ext_clk_25m or negedge ext_rst_n)
if(!ext_rst_n) cnt <= 20'd0;
else cnt <= cnt+1'b1;
//-------------------------------------
//计数器 cnt 计数到最大值时,切换点亮的指示灯
always @ (posedge ext_clk_25m or negedge ext_rst_n) 
if(!ext_rst_n) led <= 8'b1111_1110; //默认只点亮一个指示灯 D2
else if(cnt == 20'hfffff) led <= {led[6:0],led[7]}; //循环移位操作
else ;
endmodule
  • 由代码可以得到,我们只有一个底层模块cy4.在这个模块中,接口很简单,与上一节的蜂鸣器实例一样,有时钟信号,复位信号为FPGA的输入信号,8个LED灯为FPGA的输出信号,我们控制LED的亮和灭。当我们输出LED点的值为0时LED点亮,当我们输出LED点的值为1的时候LED灭,这就是低电平亮,高电平灭。
  • 然后我们选用20位的计数器位cnt。cnt每个时钟周期复位的时候都清零,每个时钟周期会计数,cnt从0开始计数直到最大值——>FFFFFH,然后下一个计数值虽然会溢出,但是实际上会从0从新开始计数。
  • 在最后一个always语句当中,我们就对LED赋值,首先赋一个初值if(!ext_rst_n) led <= 8'b1111_1110; //默认只点亮一个指示灯 D2默认最低位为0,由此可得,初始状态的时候,最低位是点亮的,其他位是熄灭的。
  • 然后当cnt计数到最大值的时候,我们将我们的LED灯循环左移一次。else if(cnt == 20'hfffff) led <= {led[6:0],led[7]};此操作是将LED的最高位赋给LED的最低位,然后其他位依次左移一位。
  • 时钟信号位25MHZ,即位40ns,一个计数周期为2的20次方即为1048576,由此可知,一个计数周期为40ns*1048576约为42ns。

方法二

//对外部输入时钟做二分频
module 1(
input ext_clk_25m, //外部输入 25MHz 时钟信号
input ext_rst_n, //外部输入复位信号,低电平有效
output reg clk_12m5 //二分频时钟信号
);
always @(posedge ext_clk_25m or negedge ext_rst_n)
if(!ext_rst_n) clk_12m5 <= 1'b0;
else clk_12m5 <= ~clk_12m5;
end one;
  • 方法二与方法一不同的是,方法二使用的是时钟分频的形式,将时钟信号二分频得到一个分频信号。
  • 时钟分频举例:clk1是时钟取反,clk2为二分频,clk3是四分频
    在这里插入图片描述
    当复位信号为低电平的时候也就是复位按键被按下的时候,输出信号为低电平,即蜂鸣器不发声。而当 ext_rst_n 为高电平的时候,也就是系统正常运行时,将clk信号反转实现分频。从而实现流水灯效果。

四、下载配置

我在蜂鸣器实例博客里面有详细的写,如何下载配置,大家可以结合那个博客一起完成此步骤
https://blog.csdn.net/quanqueen/article/details/112436547

五、效果展示

视频没有上传
在这里插入图片描述
只能以图片的形式大概的展示一下。
在这里插入图片描述
由于流水灯延时较短,大家会看到一下现象。
在这里插入图片描述

参考链接

https://blog.csdn.net/skywalker1996/article/details/72802027?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161088614216780264097801%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=161088614216780264097801&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-6-72802027.first_rank_v2_pc_rank_v29&utm_term=FPGA%E5%AE%9A%E6%97%B6%E5%99%A8
https://www.bilibili.com/video/BV1E7411V7s1?from=search&seid=1836393549280420133

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱生活的fuyao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值