勇敢的芯伴你玩转Altera FPGA连载56:流水灯实例

发布时间:2018-3-23 21:39    发布者:rousong1989
勇敢的芯伴你玩转Altera FPGA连载56:流水灯实例
特权同学,版权所有
配套例程和更多资料下载链接:
http://pan.baidu.com/s/1i5LMUUD
1.jpg
         如图8.7在SF-CY4开发板的左上角有8个LED指示灯。
2.jpg
图8.7 电路LED实物照片
如图8.8所示,这些LED的正极连接510欧姆限流电阻到3.3V电压,负极都连接到了FPGA的IO引脚上。因此,FPGA可以通过引脚的高或低电平控制LED的亮灭状态。
3.jpg
图8.8 LED电路
         本实例,通过FPGA内部的定时器,循环点亮每个LED,达到流水灯的效果。如图8.9所示,8个LED指示灯,我们依次给他们赋值,每次只有一个LED点亮,每次点亮某个LED的时间一定(固定延时)。8个LED依次被点亮一次,如此循环便成就了流水灯的效果。
4.jpg
图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流水切换的效果。

本文地址:https://www.eechina.com/thread-523885-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表