一、功能简介
- 如图所示:开发板上左上角有八个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