FPGA循环点亮流水灯

本文详细介绍了FPGA中实现循环流水灯的原理和Verilog代码,包括共阴极和共阳极两种情况,从4个LED的简单实例出发,解析了如何通过位移操作实现LED的循环点亮,并提供了仿真验证。此外,文章还提及了结合定时器模块实现周期性的流水灯效果。
摘要由CSDN通过智能技术生成

本篇文章包含FPGA循环点亮流水灯程序的思路代码,看完这一篇就能学会循环控制流水灯咯!

创作不易,求赞赞~~


点亮流水灯几乎是所有编程学习的必经之路,在设计程序之前,首先我们要先对 “ 流水灯” 进行了解:

流水灯如下图所示分为共阴极和共阳极,共阴极接法需要用高电平(led_out=1)去驱动;共阳极接法需要低电平(led_out=0)去驱动

下面分为共阴极和共阳极,以4个流水灯举例实现依次点亮,我采用的更简单的拼位实现方法:

共阴极4个流水灯依次点亮(从led_3到led_0)

led_3

led_2

led_1

led_0

1

0

0

0

0

1

0

0

0

0

1

0

0

0

0

1

依次点亮即为原led_3到led_1的三个状态变到led_2到led_0,原led_0的状态变到led_3

如果把led看做是一个4位2进制数,下个状态的led就是上个状态的( led_0  , led_3到led_1) 拼起来

共阴极4个流水灯依次点亮(从led_0到led_3)

led_3

led_2

led_1

led_0

0

0

0

1

0

0

1

0

0

1

0

0

1

0

0

0

依次点亮即为原led_2到led_0的三个状态变到led_3到led_1,原led_3的状态变到led_0

下个状态的led就是上个状态的(  led_2到led_0 , led_3  ) 拼起来

共阳极4个流水灯依次点亮(从led_0到led_3)

led_3

led_2

led_1

led_0

1

1

1

0

1

1

0

1

1

0

1

1

0

1

1

1

依次点亮即为原led_2到led_0的三个状态变到led_3到led_1,原led_3的状态变到led_0

下个状态的led就是上个状态的(  led_2到led_0 , led_3  ) 拼起来

共阳极4个流水灯依次点亮(从led_3到led_0)

led_3

led_2

led_1

led_0

0

1

1

1

1

0

1

1

1

1

0

1

1

1

1

0

依次点亮即为原led_3到led_1的三个状态变到led_2到led_0,原led_0的状态变到led_3

下个状态的led就是上个状态的( led_0  , led_3到led_1) 拼起来


弄懂流水灯原理之后,就可以开始设计程序,我们要设计一个每隔一定时间就能循环点亮的流水灯

所以我们需要根据需要写一个定时器程序,定时器实现的方法在我上一篇文章中有详细介绍:

FPGA———任意时间的定时器_居安士的博客-CSDN博客

系统框图如下:

时钟经过锁相环,进入定时器模块,定时器每隔1s,time_en拉高一次,4个led循环一次

代码如下:

module led_cycle(
input clk_25m,
input reset,
input time_en,
output reg[3:0] led_out
    );
//eg1:共阴极从右向左    
    always@(posedge clk_25m)begin
    	if(reset)begin
    		led_out<=4'b1000; 		
    	end
    	else if(time_en==1)begin
    		led_out<={led_out[0],led_out[3:1]};
    	end
    	else begin
    		led_out<=led_out; 
    	end
    end

/*eg1:共阴极从左向右    
    always@(posedge clk_25m)begin
    	if(reset)begin
    		led_out<=4'b0001; 		
    	end
    	else if(time_en==1)begin
    		led_out<={led[2:0],led[3]};
    	end
    	else begin
    		led_out<=led_out; 
    	end
    end
    
//eg1:共阳极从右向左    
    always@(posedge clk_25m)begin
    	if(reset)begin
    		led_out<=4'b0111; 		
    	end
    	else if(time_en==1)begin
    		led_out<={led[0],led[3:1]};
    	end
    	else begin
    		led_out<=led_out; 
    	end
    end

//eg1:共阳极从左向右    
    always@(posedge clk_25m)begin
    	if(reset)begin
    		led_out<=4'b1000; 		
    	end
    	else if(time_en==1)begin
    		led_out<={led[2:0],led[3]};
    	end
    	else begin
    		led_out<=led_out; 
    	end
    end
*/
endmodule

对代码进行仿真,每个time_en到来时,LED右移一位


这样我们就完成了LED循环点亮的设计,我们只需要根据自己需求,更换led_out位数(led个数),更换定时器时间即可

ps,完整工程已经上传! 后面会更新花式流水灯设计,点赞支持Thanks♪(・ω・)ノ

  • 13
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、一盏一盏:第一盏--延时--熄灭--延时--下一盏; 2、利用数组方法点亮:定义一个数组(即0xfe,0xfd,0xfb,0xf7,0xef,oxdf,0xbf,0x7f:依次代表只有第一盏,第二盏....),再利总线,按顺序点亮八盏; 3、利用移位方法点亮:(1)、利用移位运算和按位或运算,依次点亮八盏; (2)、包含intrins头文件(里面含有移位函数),使用相应的左移或右移函数进行移位, 下面是代码和注释,详细解释了点亮流水灯的思路,附件含有源代码和仿真文件,有需要的可以下载 //方式0控制流水灯循环点亮 #include //包含51单片机寄存器定义的头文件 #include //包含函数_nop_()定义的头文件 unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//流水灯控制码,该数组被定义为全局变量 sbit P17=P1^7; /************************************************************** 函数功能:延时约150ms **************************************************************/ void delay(void) { unsigned char m,n; for(m=0;m<200;m++) for(n=0;n<250;n++) ; } /************************************************************** 函数功能:发送一个字节的数据 **************************************************************/ void Send(unsigned char dat) { P17=0; //P1.7引脚输出清0信号,对74LS164清0 _nop_(); //延时一个机器周期 _nop_(); //延时一个机器周期,保证清0完成 P17=1; //结束对74LS164的清0 SBUF=dat; //将数据写入发送缓冲器,启动发送 while(TI==0) //若没有发送完毕,等待 ; TI=0; //发送完毕,TI被置“1”,需将其清0 } /******************************************* 函数功能:主函数 ******************************************/ void main(void) { unsigned char i; SCON=0x00; //SCON=0000 0000B,使串行口工作于方式0 while(1) { for(i=0;i<8;i++) { Send(Tab[i]); //发送数据 delay(); //延时 } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值