初级会员 
  
	- 积分
 - 199
 
        - 金钱
 - 199 
 
       - 注册时间
 - 2020-9-2
 
      - 在线时间
 - 21 小时
 
 
 
 | 
 
 
发表于 2020-11-6 14:33:59
|
显示全部楼层
 
 
 
给你个代码参考一下: 
module key_shift( 
        input  clk,   
                                input         rst_n, 
                                input         sw1_n, 
        input  sw2_n, 
                                input shift, 
        output[7:0] shift_cnt, 
                                output        fm    
                 ); 
//------------------------------------------------------------------                   
reg[1:0] key_rst, key_r; 
always@(posedge clk or negedge rst_n) 
   if(!rst_n) begin   
                   key_rst <= 2'b11; 
                   key_r <= 2'b11; 
              end         
        else      begin  
                   key_rst <= {sw1_n, sw2_n}; 
              key_r <= key_rst; 
                                  end  
/*                                   
always@(posedge clk or negedge rst_n) 
   if(!rst_n) key_r <= 3'b111; 
   else key_r <= key_rst; 
*/ 
wire[1:0] key_an; 
assign key_an = key_r &(~key_rst); 
//------------------------------------------------------------- 
reg[19:0] cnt; 
always@(posedge clk or negedge rst_n) 
   if(!rst_n) cnt <= 20'h00000; 
        else if (key_an) cnt <= 20'h00000; 
   else cnt <= cnt + 1'b1; 
 
reg[1:0] key_down, key_down_r; 
always@(posedge clk or negedge rst_n) 
   if(!rst_n) key_down <= 2'b11;  
   else if (cnt == 20'hfffff) 
           key_down <= {sw1_n, sw2_n}; 
                 
always@(posedge clk or negedge rst_n) 
   if(!rst_n) key_down_r <= 2'b11;  
   else key_down_r <= key_down; 
         
wire[1:0] sw_ctro; 
assign sw_ctro = key_down_r[1:0] &(~key_down[1:0]); 
//------------------------------------------------------------- 
reg[23:0] cnt_fm; 
always@(posedge clk or negedge rst_n) 
    if(!rst_n) cnt_fm <= 23'd0; 
         else if (sw_ctro[0] | sw_ctro[1]) cnt_fm <= 23'd0;                                
         else if (cnt_fm < 23'd8_000_000) cnt_fm <= cnt_fm + 1'b1;// 1s 
         
reg fm1;          
always@(posedge clk or negedge rst_n) 
    if(!rst_n) fm1 <= 1'b0; 
         else if (sw_ctro[0] | sw_ctro[1]) fm1 <= 1'b1;     
assign fm = (fm1 && ( cnt_fm < 23'd8_000_000)) ? 1'b1 : 1'b0; 
 
//---------------------------------------------------------- 
reg[7:0] shift_cnt_r; 
always@(posedge clk or negedge rst_n) 
begin 
                        if(!rst_n) shift_cnt_r <= 8'd0; 
                        else if(sw_ctro[0]| shift) begin 
                                                                        if(shift_cnt_r < 8'd12) shift_cnt_r <= shift_cnt_r + 8'd1; 
                                                                        else shift_cnt_r <= 8'd0; 
                                                                end 
 
                        else if(sw_ctro[1]) begin 
                                                                        if(shift_cnt_r > 0) shift_cnt_r <= shift_cnt_r - 8'd1; 
                                                                        else shift_cnt_r <= 8'd12;//num 
                                                                 end 
                                                          
end 
assign shift_cnt = shift_cnt_r;          
 
endmodule                          |   
 
 
 
 |