芯片周期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_2ms<cnt_2s&&flag==1)
led <= 0;
endmodule