Verilog——呼吸灯

1、代码

module led_breath
(
input wire clk,
input wire rst,
output reg [3:0] led
);

reg [5:0] cntus;
reg [9:0] cntms;
reg [9:0] cnts;
reg flag;

//48M//48次计数需要1微秒
always@(posedge clk or negedge rst)
	if(rst==0)
		cntus<=0;
	else if(cntus==48-1)
		cntus<=0;
	else 
		cntus<=cntus+1;//一直累加,直到47
		
//1ms 计数器
always@(posedge clk or negedge rst)
	if(rst==0)
		cntms<=0;
	else if(cntms==999 && cntus==48-1)//cntms==999代表1毫秒
		cntms<=0;
	else if(cntus==48-1)
		cntms<=cntms+1;
	else
		cntms<=cntms;
		
//1s 计数器
always@(posedge clk or negedge rst)
	if(rst==0)
		cnts<=0;
	else if(cnts==999 && cntms==1000-1 && cntus==48-1)//cnts==999代表1秒
		cnts<=0;
	else if(cntms==999 && cntus==48-1)
		cnts<=cnts+1;
	else
		cnts<=cnts;
	
//1s 计数器标志信号
always@(posedge clk or negedge rst)
	if(rst==0)
		flag<=0;
	else if(cnts==1000-1 && cntms==1000-1 && cntus==48-1)
		flag<=~flag;
	else
		flag<=flag;
//输出信号连接到外部的 led 灯
always@(posedge clk or negedge rst)
	if(rst==0)
		led<=4'b1111;
	else if((flag == 1'b1 && cntms < cnts) 
	||(flag == 1'b0 && cntms > cnts))
		led<=4'b0000;
	else 
		led<=4'b1111;

endmodule

2、注意

由亮到灭用时1秒,由灭到亮用时1秒,呼吸效果,flag 来切换

 

如下图所示,cnt1s=999时,cnt1sen切换,也就是flag切换。

 

flag==1 && cntms<cnts时的情况,灯点亮。

第一个1毫秒的时候,cnts=0,cntms计数从0-999

第二个1毫秒的时候,cnts=1,cntms计数从0-999

。。。

第一千个1毫秒的时候,cnts=999,cntms计数从0-999

一个从灭到亮的过程

同理

flag==0 && cntms>cnts时的情况,灯点亮。

第一个1毫秒的时候,cnts=0,cntms计数从0-999

第二个1毫秒的时候,cnts=1,cntms计数从0-999

。。。

第一千个1毫秒的时候,cnts=999,cntms计数从0-999

一个从亮到灭的过程

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值