呼吸灯verilog实现

实现流程


1:呼吸灯分为两个部分,一个部分是 由亮变暗,

一个部分是 由暗变亮,

2:当由亮变暗,也就是: 

首先,占空比100%为零,

然后,占空比99%为零,1%为1;等于占空比100%

然后,占空比98%为零,2%为1;等于占空比100%

。。。。。。。。

。。。。。。。。

然后,占空比2%为零,98%为1;等于占空比100%

然后,占空比1%为零,99%为1;等于占空比100%

3:当由暗变亮,也就是:

首先,占空比100%为1,

然后,占空比99%为1,1%为零;等于占空比100%

然后,占空比98%为1,2%为零;等于占空比100%

。。。。。。。。

。。。。。。。。

然后,占空比2%为1,98%为零;等于占空比100%


然后,占空比1%为1,99%为零;等于占空比100%

 

功能分解


01)定义:一个完整的呼吸灯时间为2s,也就是,由亮变暗需要1s,由暗变亮需要1s;

02)将    1s分为1000等份,也就是 由亮变暗,需要100次的变化,每次为1ms

03)将1ms分为1000等份,占空比100%过渡到0%,需要1000次的变化,每次为1us;

04)增加hold状态,每次最亮和最暗的时候,保持一端时间,呼吸灯的观感效果感觉更好(个人喜好)


 

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2019/10/17 10:34:46
// Design Name: 
// Module Name: breath_led
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
module	breath_led(
	input		wire		clk_in1_p,
	input		wire		clk_in1_n,
	input		wire		rst,
	
	output		reg		led
	);

	//==================//
	parameter	T_ms = 10'd999;	//10'd22;1s
	parameter	T_us = 10'd999; //10'd22;//	//1ms
	parameter   T_ns = 10'd99 ; //10'd9; ns
	parameter   LED_ON = 1'b1 ;
	parameter   LED_OFF = 1'b0 ;
	
	reg	      		cnt_s;
	reg	[9:0]		cnt_ms;
	reg	[9:0]		cnt_us;
	reg	[6:0]		cnt_ns;
	wire            clk ;
	reg [19:0]      cnt_hold ;
	reg 			hold_on ;

	 clk_wiz_0 u_pll
	 (
	  // Clock out ports
	  .clk_out1 (clk ),  // 100Mhz
	  // Status and control signals
	  .reset   (rst),
	  .locked  (  ),
	 // Clock in ports
	  .clk_in1_p (clk_in1_p),
	  .clk_in1_n(clk_in1_n)
	 );

    always @(posedge clk) begin
        if(rst)    
    		hold_on <= 1'b0 ;
    	else if(&cnt_hold[19:16])
    		hold_on <= 1'b0 ;
    	else if((cnt_ms == T_ms) && (cnt_us == T_us) && (cnt_ns == T_ns)) 
    		hold_on <= 1'b1 ;
    	else 
    		hold_on <= hold_on ;
    end 

    always @(posedge clk) begin
        if(rst)    
    		cnt_hold <= 20'd0 ;
    	else if(hold_on)
    		cnt_hold <= cnt_hold + 20'd1 ;
    	else 
    		cnt_hold <= 20'd0 ;
    end 

    always @(posedge clk) begin
        if(rst)
        	cnt_ns <= 7'd0 ;
        else if(cnt_ns == T_ns)
        	cnt_ns <= 7'd0 ;
        else if(!hold_on)
        	cnt_ns <= cnt_ns + 7'd1 ;  
        else 
        	cnt_ns <= cnt_ns ;  
    end 
    
    always @(posedge clk) begin
        if(rst)
        	cnt_us <= 10'd0 ;
        else if((cnt_us == T_us) && (cnt_ns == T_ns))
        	cnt_us <= 10'd0 ;
        else if(cnt_ns == T_ns)
        	cnt_us <= cnt_us + 10'd1 ;
        else 
        	cnt_us <= cnt_us ;    
    end     
    
    always @(posedge clk) begin
        if(rst)   
        	cnt_ms <= 10'd0 ;
        else if((cnt_ms == T_ms) && (cnt_us == T_us) && (cnt_ns == T_ns)) 
        	cnt_ms <= 10'd0 ;
        else if((cnt_us == T_us) && (cnt_ns == T_ns))
        	cnt_ms <= cnt_ms + 10'd1 ;
        else 
        	cnt_ms <= cnt_ms ;
    end     
    
    always @(posedge clk) begin
        if(rst)    
        	cnt_s <= 1'b0 ;
        else if((cnt_ms == T_ms) && (cnt_us == T_us) && (cnt_ns == T_ns)) 
        	cnt_s <= !cnt_s ;
        else 
        	cnt_s <= cnt_s ;
    end     
    
    always @(posedge clk) begin
        if(rst)
        	led <= LED_ON ;
        else if(hold_on)
        	led <= !cnt_s ;
        else if(!cnt_s)
            begin 
	        	if(cnt_ms <= cnt_us)
	        		led <= LED_ON ;
	        	else 
	        		led <= LED_OFF ;
        	end 
        else 
            begin 
	        	if(cnt_ms <= cnt_us)
	        		led <= LED_OFF ;
	        	else 
	        		led <= LED_ON ;
        	end         	    
    end     
    
endmodule		

 

你可能感兴趣的:(FPGA编程,FPGA,仿真)