让灯呼吸起来

本文探讨了一款呼吸灯模块的设计,涉及三个计数器和flag信号的管理。设计目标是在2秒内实现灯的亮暗切换,但实验中发现计数器逻辑和flag判断存在问题。作者分享了修正后的代码,并强调了细节处理在硬件设计中的重要性。
摘要由CSDN通过智能技术生成

呼吸灯的原理在这里就不说,随便去网站上搜下就知道了。在这里我设计了三个计数器和一个标志信号。在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标志信号的条件判定出现问题。还是需要谨慎,注意细节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值