module breath_water_led
(
input clk,
input rst,
output reg [3:0] led
);
reg [12:0] cnt1;
reg [12:0] cnt2;
reg [2:0] state;
reg flag;
wire flag1;
parameter CNT_NUM = 8000;//计数器的最大值 period=(4899 ^2 *2=48m)
always @(posedge clk or negedge rst)
begin
if(rst==1'b0)
state <= 3'd0;
else if(state == 3'd4)
state <=3'd0;
else if(flag1==1'b1)
state <= state + 3'd1;
else
state <= state;
end
assign flag1 = ((cnt2==13'd0)&&(cnt1==CNT_NUM-13'd1)&&(flag==1'b1)) ? 1'b1:1'b0;
/************************************************/
always @(posedge clk or negedge rst)
begin
if(rst==1'b0)
begin
cnt1<=13'd0;
end
else if((cnt1 == CNT_NUM-1'd1))//
cnt1<=13'd0;
else
cnt1<= cnt1 + 13'd1;
end
always @(posedge clk or negedge rst)
begin
if(rst==1'b0)
begin
cnt2 <= 13'd0;
flag <= 1'b0;
end
else if(cnt1==CNT_NUM - 1'd1)
begin
if(flag==1'b0)
begin
if(cnt2>= CNT_NUM-1'd1)
flag <= 1'b1;
else
cnt2 <= cnt2 + 13'd1;
end
else
begin
if(cnt2 <= 13'd0)
flag <= 1'b0;
else
cnt2 <= cnt2 - 1'b1;
end
end
else
cnt2<=cnt2;
end
/************************************************/
always @(posedge clk or negedge rst)
begin
if(rst==1'b0)
led<=4'b1111;
else
case(state)
0: if(cnt2>cnt1)
led<=4'b1110;
else
led<=4'b1111;
1: if(cnt2>cnt1)
led<=4'b1101;
else
led<=4'b1111;
2: if(cnt2>cnt1)
led<=4'b1011;
else
led<=4'b1111;
3: if(cnt2>cnt1)
led<=4'b0111;
else
led<=4'b1111;
default:led <= 4'b1111;
endcase
end
endmodule
呼吸流水灯的实现
于 2023-03-23 23:48:51 首次发布