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
一个从亮到灭的过程