呼吸灯的原理在这里就不说,随便去网站上搜下就知道了。在这里我设计了三个计数器和一个标志信号。在2s内完成由灭到亮的过程,2us的计数器正常写,2ms的计数器需要考虑2us的条件,2s的计数器考虑前两个计数器的条件;flag信号的变化取决于三个计数器的条件。
module breath_led(
input clk ,
input rst_n ,
output reg[9:0] led
);
parameter TIME_2S = 1000 ,
TIME_2MS = 1000 ,
TIME_2US = 100 ;
reg [9:0] cnt_2s ;
reg [9:0] cnt_2ms ;
reg [6:0] cnt_2us ;
reg flag;
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt_2us <= 0;
else if(cnt_2us == TIME_2US - 1)
cnt_2us <= 0;
else
cnt_2us <= cnt_2us + 1;
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt_2ms <= 0;
else if(cnt_2ms == TIME_2MS - 1 && cnt_2us == TIME_2US - 1)
cnt_2ms <= 0;
else if(cnt_2us == TIME_2US - 1)
cnt_2ms <= cnt_2ms + 1;
always @(posedge clk or negedge rst_n)
if(!rst_n)
cnt_2s <= 0;
else if(cnt_2s == TIME_2S - 1 && cnt_2ms == TIME_2MS - 1 && cnt_2us == TIME_2US - 1)
cnt_2s <= 0;
else if(cnt_2us == TIME_2US - 1 && cnt_2ms == TIME_2MS - 1)
cnt_2s <= cnt_2s + 1;
always @(posedge clk or negedge rst_n) begin
if(!rst_n)begin
flag <= 1'b0;
end
else if(cnt_2s == TIME_2S - 1 && cnt_2ms ==TIME_2MS - 1 && cnt_2us == TIME_2US - 1)begin
flag <= 1'b1;
end
else
flag <= 1'b0;
end
always @(posedge clk or negedge rst_n) begin
if(!rst_n)begin
led <= 10'b0000_0000_00;
end
else if(((flag == 1'b0) && cnt_2ms < cnt_2s) || ((flag == 1'b1) && cnt_2ms > cnt_2s))begin
led <= 10'b1111_1111_11;
end
else begin
led <= 10'b0000_0000_00;
end
end
endmodule
当flag为0且计满2s后,led灯有亮变暗;当flag为1且计满2s后,led由暗变亮。
在实验中出现:计数器情况考虑不周全,flag标志信号的条件判定出现问题。还是需要谨慎,注意细节。