玩转Altera FPGA:流水灯实例

来源:本站
导读:目前正在解读《玩转Altera FPGA:流水灯实例》的相关信息,《玩转Altera FPGA:流水灯实例》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《玩转Altera FPGA:流水灯实例》的详细说明。
简介:本文主要讲了流水灯的原理图以及程序代码,下面一起来学习一下:

如图8.7在SF-CY4开发板的左上角有8个LED指示灯。玩转Altera FPGA:流水灯实例

图8.7电路LED实物照片

如图8.8所示,这些LED的正极连接510欧姆限流电阻到3.3V电压,负极都连接到了FPGA的IO引脚上。因此,FPGA可以通过引脚的高或低电平控制LED的亮灭状态。

玩转Altera FPGA:流水灯实例

图8.8 LED电路

本实例,通过FPGA内部的定时器,循环点亮每个LED,达到流水灯的效果。如图8.9所示,8个LED指示灯,我们依次给他们赋值,每次只有一个LED点亮,每次点亮某个LED的时间一定(固定延时)。8个LED依次被点亮一次,如此循环便成就了流水灯的效果。

玩转Altera FPGA:流水灯实例

图8.9 流水灯示意图

本实例的工程代码如下。

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

这里只有两个很简单的always语句。在第一个always语句中,我们对计数器cnt循环计数,cnt为20位宽,从0开始不断的计数到最大值20’hfffff,然后下一个计数值虽然溢出,但实际上又返回计数值0,然后重新计数,如此反复。一个完整的cnt计数周期的时间,大家可以算算,时钟信号ext_clk_25m是25MHz,即40ns,一个计数周期是2的20次方,即1048576,那么一个计数周期就是40ns*1048576,约为42ms。

再来看第二个always语句,复位状态下给8个LED赋初始值8’b1111_1110,也就是只有led[0]是点亮的。而正常运行时,判断cnt计数值是否为20’hfffff,也就是说每一个cnt计数周期,都会做一次这样的处理:将led循环左移一位,从而实现LED流水切换的效果。

提醒:《玩转Altera FPGA:流水灯实例》最后刷新时间 2024-03-14 00:52:27,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《玩转Altera FPGA:流水灯实例》该内容的真实性请自行鉴别。