今天看了按键程序:
源程序是这样的:
	module key_debounce(sys_clk          ,
                    sys_rstn         ,
                    key_in           ,
                    led_out
                    );
//输入/输出信号
input               sys_clk          ;
input               sys_rstn         ;
input               key_in           ;
output              led_out          ;
//寄存器定义
reg                 led_out          ;
reg      [19:0]     delay_cnt        ;
wire                key_scan         ;
wire                key_low          ;
reg                 key_samp         ;
reg                 key_samp_r       ;
reg                 key_rst          ;
reg                 key_rst_r        ; 
//逻辑部分  
always@(posedge sys_clk or negedge sys_rstn)        
    begin
        if(!sys_rstn)
            key_samp<=1'b1;
        else
            key_samp<=key_in;
    end
always@(posedge sys_clk or negedge sys_rstn)        
    begin
        if(!sys_rstn)
            key_samp_r<=1'b1;
        else
            key_samp_r<=key_samp;
    end
assign key_scan=key_samp_r&(~key_samp);
//延时部分
always@(posedge sys_clk or negedge sys_rstn) 
    begin
        if(!sys_rstn)
            delay_cnt<=20'h0;
        else if(key_scan)
            delay_cnt<=20'h0;
        else
            delay_cnt<=delay_cnt+1'b1;
    end
always@(posedge sys_clk or negedge sys_rstn)        
    begin
        if(!sys_rstn)
            key_rst<=1'b1;
        else if(delay_cnt==20'hfffff)
            key_rst<=key_in;
    end
always@(posedge sys_clk or negedge sys_rstn)        
    begin
        if(!sys_rstn)
            key_rst_r<=1'b1;
        else
            key_rst_r<=key_rst;
    end
assign key_low=key_rst_r&(~key_rst);
//按键控制LED翻转输出
always@(posedge sys_clk or negedge sys_rstn) 
    begin
        if(!sys_rstn)
            led_out<=1'b1;
        else if(key_low)
            led_out<=~led_out;
        else
            led_out<=led_out;
    end
endmodule
不过我分析了一下,好像这个程序没有延时消抖的功能吧,key_scan只是起到了一个清零的作用,其实寄存器记满了本来就会清零的啊,所以中间有段程序完全是浪费啊! 
所以改成这样:
	
module key_debounce(input sys_clk,input sys_rstn,input key_in,output reg led_out);
reg      [19:0]     delay_cnt     ;
wire                temp             ;
reg                 key_rst          ;
reg                 key_rst_r       ; 
always@(posedge sys_clk or negedge sys_rstn) 
    begin
        if(!sys_rstn)
            delay_cnt<=20'h0;
        else
            delay_cnt<=delay_cnt+1'b1;
    end
assign temp=key_rst;    
always@(posedge sys_clk or negedge sys_rstn)        
    begin
        if(!sys_rstn)
            key_rst<=1'b1;
        else if(delay_cnt==20'hfffff)
            key_rst<=key_in;
    end 
	
always@(posedge sys_clk or negedge sys_rstn)        
    begin
        if(!sys_rstn)
            key_rst_r<=1'b1;
        else
            key_rst_r<=temp;
    end
assign key_low=key_rst_r&(~key_rst); 
	
always@(posedge sys_clk or negedge sys_rstn) 
    begin
        if(!sys_rstn)
            led_out<=1'b1;
        else if(key_low)
            led_out<=~led_out;
        else
            led_out<=led_out;
    end
endmodule
功能实现是一样的,不过只是个人见解!如有错误请指正!
 
	
			
			
			
						
			



 我要赚赏金
