FPGA学习日记(13)--呼吸灯

 

 

module breath_led
#(
    parameter CNT_1S_MAX = 10'd999  ,
    parameter CNT_1MS_MAX = 10'd999 ,
    parameter CNT_1US_MAX = 6'd49   

)
(
    input wire sys_clk      ,
    input wire sys_rst_n    ,
    
    output reg led_out
);
reg [9:0] cnt_1s;
reg [9:0] cnt_1ms;//最大计数值999,十位宽
reg [5:0] cnt_1us;//最大计数值49 ,需要六位

reg       cnt_en;

//1us计数器
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)  
        cnt_1us <= 6'd0;
    else if(cnt_1us == CNT_1US_MAX)
        cnt_1us <= 6'd0;
    else
        cnt_1us <= cnt_1us + 6'd1;
        
//1ms计数器
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)  
        cnt_1ms <= 10'd0;
    else if ((cnt_1us == CNT_1US_MAX)&&(cnt_1ms == CNT_1MS_MAX))
        cnt_1ms <= 10'd0;
    else  if(cnt_1us == CNT_1US_MAX)  //1us计数器完成计数

        cnt_1ms <= cnt_1ms + 10'd1;
    else 
        cnt_1ms <= cnt_1ms;
        
//1s计数器
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0) 
        cnt_1s <= 10'd0;
    else if((cnt_1us == CNT_1US_MAX)&&(cnt_1ms == CNT_1MS_MAX)&&(cnt_1s == CNT_1S_MAX))
        cnt_1s <= 10'd0;
    else if ((cnt_1us == CNT_1US_MAX)&&(cnt_1ms == CNT_1MS_MAX))
        cnt_1s <= cnt_1s + 10'd1;
    else
        cnt_1s <= cnt_1s; 
//使能信号
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0) 
        cnt_en <= 1'b0;
    else if ((cnt_1us == CNT_1US_MAX)&&(cnt_1ms == CNT_1MS_MAX)&&(cnt_1s == CNT_1S_MAX))
        cnt_en <= ~cnt_en;
    else 
        cnt_en <= cnt_en;
    
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0) 
        led_out <= 1'b1;
    else if(((cnt_en == 1'b0)&&(cnt_1ms <= cnt_1s))||((cnt_en == 1'b1)&&(cnt_1ms > cnt_1s)))
        led_out <= 1'b0;
    else 
        led_out <= 1'b1;
        
endmodule
        
`timescale 1ns/1ns
module tb_breath_led();
 
reg sys_clk;
reg sys_rst_n;


wire led_out;

initial
    begin
        sys_clk <= 1'b1;
        sys_rst_n <= 1'b0;
        #20
        sys_rst_n <= 1'b1;
        
    end

always #10 sys_clk = ~sys_clk;

 breath_led
#(
    .  CNT_1S_MAX (10'd9 )  ,
    . CNT_1MS_MAX (10'd9)  ,
    . CNT_1US_MAX (6'd4 )   

)
breath_led_inst
(
    .sys_clk    (sys_clk  )  ,
    .sys_rst_n  (sys_rst_n )  ,
   
    .led_out    (led_out )
);            

endmodule

 

ms计数器

 

s计数器

 

led_out 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值