呼吸灯的写法

芯片周期20ns,当计数50次为1us,在计数1000次则1ms,在计数1000次为1s,因此设置3个计数器分别为cnt_s,cnt_ms,cnt_us. 为了实现呼吸灯从亮到暗,在由暗到亮需要设置一个标志位flag

呼吸灯的画出分析

这里写代码片
module  huxi(
input       wire        clk,
input       wire      rst_n,
output      reg[3:0]    led

);
reg[9:0]      cnt_2s    ;   
reg[9:0]      cnt_2ms   ;
reg[6:0]      cnt_2us   ;
parameter     CNT_MAX =  999;
reg           flag         ;  

//cnt_2us
always@(posedge clk or negedge rst_n)
if(rst_n==0)
cnt_2us <=  0;
else if(cnt_2us==99)
cnt_2us <=  0;
else
cnt_2us <=   cnt_2us +   1;

//cnt_2ms
always@(posedge clk or negedge rst_n)
if(rst_n==0)
cnt_2ms <=  0;
else if(cnt_2ms==999&&cnt_2us==99)
cnt_2ms <=  0;
else if(cnt_2us==99)
cnt_2ms <=   cnt_2ms +   1;

//cnt_2s
always@(posedge clk or negedge rst_n)
if(rst_n==0)
cnt_2s <=  0;
else if(cnt_2s==CNT_MAX&&cnt_2ms==999&&cnt_2us==99)
cnt_2s <=  0;
else if(cnt_2ms==999&&cnt_2us==99)
cnt_2s <=   cnt_2s +   1;

//flag
always@(posedge clk or negedge rst_n)
if(rst_n==0)
flag    <=   0;
else if(cnt_2s==999&&cnt_2ms==999&&cnt_2us==99)
flag    <=   ~flag;


//led
always@(posedge clk or negedge rst_n)
if(rst_n==0)
led <=   0 ;
else if(cnt_2ms<=cnt_2s&&flag==0)
led <=   4'b1111;
else if(cnt_2ms>cnt_2s&&flag==0)
led <=   0;
else if(cnt_2ms>=cnt_2s&&flag==1)
led <=   4'b1111;
else if(cnt_2ms1)
led <=   0;


endmodule

你可能感兴趣的:(呼吸灯的写法)