阿东Verilog技术专版
直播中

马超群

12年用户 5经验值
私信 关注
[求助]

verilog写的电子钟,键盘校时问题

各位兄弟,帮我看下我写的电子钟,键盘校时的时候,不是1分钟加,而是按一下键就+8。我是初学者,代码如下:
/****************************************Copyright (c)**************************************************
**                                      Dongdong   Studio
**                                    
**---------------------------------------File Info-----------------------------------------------------
** File name:           SegLed_V2
** Last modified Date:  2012-12-18
** Last Version:        2.0
** Descriptions:        SegLed
**------------------------------------------------------------------------------------------------------
** Created by:          dongdong
** Created date:        2009-10-18
** Version:             1.0
** Descriptions:        The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:   
** Modified date:  
** Version:   
** Descriptions:    modify hc595 driver segled to 8550
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
module SegLed_V2 (
//input
input                   sys_clk        ,
input                   sys_rst_n      ,
input                key1  ,
input                key2 ,
//output
output reg              seg_c1         ,//wire  macq modify
output reg              seg_c2         ,
output reg              seg_c3         ,
output reg              seg_c4         ,

output reg               seg_a          ,
output reg               seg_b          ,
output reg               seg_c          ,
output reg               seg_d          ,
output reg               seg_e          ,
output reg               seg_f          ,
output reg               seg_g          ,
output reg               seg_h         
              );
//parameter define
//parameter WIDTH2 = 26;
//parameter WIDTH = 5;
//parameter SIZE  = 8;
//reg define
reg    [3:0]             counter;
//reg    [WIDTH2-1:0]      count                  ;  //macq del
//reg    [SIZE-1:0]        disp_data              ;//macq del
//reg    [SIZE-1:0]        dat                    ;//macq del
//reg                      disp_clk               ;//macq del
reg  [19:0]    dis_cnt;
reg   [27:0]        clk_cnt; //时钟clock的计数器
reg  [3:0]     led_en;
reg [19:0]  key_cnt; //扫键计数寄存器

reg                     segled_a          ;
reg                     segled_b          ;
reg                     segled_c          ;
reg                     segled_d          ;
reg                     segled_e          ;
reg                     segled_f          ;
reg                     segled_g          ;
reg                     segled_h          ;
//wire define
//////////////////////////////////////////// macq add
//reg[27:0] count;
reg[3:0]  sec,min,hour;
reg[2:0]  sec1,min1,hour1;
//////////////////////////////////////////////
reg  [1:0] low_sw;
reg  [1:0] low_sw_r;       //每个时钟周期的上升沿将low_sw信号锁存到low_sw_r中
  
  //当寄存器low_sw由1变为0时,led_ctrl的值变为高,维持一个时钟周期
  wire [1:0] key_ctrl = low_sw_r[1:0] & ( ~low_sw[1:0]);
  reg d1;
  reg d2;

/*******************************************************************************************************
**                              Main Program   
**  
********************************************************************************************************/

  always @ (posedge sys_clk  or negedge sys_rst_n)
    if (!sys_rst_n)   //异步复位
      key_cnt <= 20'd0;
    else
      key_cnt <= key_cnt + 1'b1;  
  


always @(posedge sys_clk or negedge sys_rst_n)
begin  

  if (!sys_rst_n)
      begin      
   low_sw <= 2'b11;
  low_sw_r <= 2'b11;
      end
  else if (key_cnt == 20'hfffff) //满20ms,将按键值锁存到寄存器low_sw中
  begin
      low_sw <= {key2,key1};
       low_sw_r <= low_sw;
  end

    if (!sys_rst_n)
      begin
        d1 <= 1'b0;
        d2 <= 1'b0;     

      end
  
    else
      begin  //某个按键值变化时...
        if ( key_ctrl[0] ) d1 <= ~d1;
        if ( key_ctrl[1] ) d2 <= ~d2;
      
   if(d1 == 1'b1)
   begin                  
    if((hour==3)&&(hour1==2))//是否到了24小时   
     begin
      sec<=4'd0;
      sec1<=3'd0;
      min<=4'd0;
      min1<=3'd0;
      hour<=4'd0;
      hour1<=3'd0;
     end
    else if(hour==9)
     begin
      hour1<=hour1+1'b1;
      hour<=4'd0;
     end  
    else
     hour <= hour + 1'b1;
   end
   
   if(d2 == 1'b1)   
   begin
    if((min==9)&& (min1==5))
     begin         
      min<=4'd0;
      min1<=3'd0;
     end
    else if(min==9)
     begin         
      min1 <= min1+1'b1;
      min<=4'd0;
     end     
    else
     min <= min+1'b1;
   end

end
   if (sys_rst_n ==1'b0)  //按键复位,如果复位电平是1位宽的二进制0(低电平复位)
  begin
       clk_cnt <= 28'b0;  
  // dis_cnt <= 20'd0;
  
   sec <= 4'b0;//macq add
   min <= 4'b0;//macq add
   hour <= 4'b0;//macq add  
   sec1 <= 3'b0;//macq add
   min1 <= 3'b0;//macq add
   hour1 <= 3'b0;//macq add   
   
  
  end
   else if (clk_cnt == 28'd50000000)// 板子晶振为50Mhz,定时 1 秒
  begin
   clk_cnt <=28'd0;
   sec<=sec+1'b1;
/*  
   //校时,以每秒钟作为触发探测校时按键状态
   if(key1 == 1'b0)
   begin                  
    if((hour==3)&&(hour1==2))//是否到了24小时   
     begin
      sec<=4'd0;
      sec1<=3'd0;
      min<=4'd0;
      min1<=3'd0;
      hour<=4'd0;
      hour1<=3'd0;
     end
    else if(hour==9)
     begin
      hour1<=hour1+1'b1;
      hour<=4'd0;
     end  
    else
     hour <= hour + 1'b1;
   end
   
   if(key2 == 1'b0)   
   begin
    if((min==9)&& (min1==5))
     begin         
      min<=4'd0;
      min1<=3'd0;
     end
    else if(min==9)
     begin         
      min1 <= min1+1'b1;
      min<=4'd0;
     end     
    else
     min <= min+1'b1;
   end
   //校时完
*/  
   if(sec==9)
    begin ////////begin 4
     if(sec==9&&sec1==5) //是否到分
      begin//begin 3
       if(min==9)
        begin///////////begin 2
         if(min1==5)//是否到时
          begin                     //////////begin 1
           if(hour==9)
            begin
             hour1<=hour+1'b1;
             hour<=4'd0;
            end
           else if(hour==3&&hour1==2)//是否到了24小时
            begin
             sec<=4'd0;
             sec1<=3'd0;
             min<=4'd0;
             min1<=3'd0;
             hour<=4'd0;
             hour1<=3'd0;
            end
           else
            begin
            sec<=4'd0;
            sec1<=3'd0;
            min<=4'd0;
            min1<=3'd0;
            hour<=hour+1'b1;
            end
          end                  ////////////////end 1
         else
          begin
          sec<=4'd0;
          sec1<=3'd0;
          min<=4'd0;
          min1<=min1+1'b1;
          end
        end  //////end 2
       else
        begin
        sec<=4'd0;
        sec1<=3'd0;
        min<=min+1'b1;
        end
      end////end 3
     else
      begin
       sec<=4'd0;
       sec1<=sec1+1'b1;
      end
    end /////////end 4
  end
else
  clk_cnt <= clk_cnt+1'b1;
end
      
  
  
always @(posedge sys_clk) //大约1到2毫秒钟的分频
begin
  if(dis_cnt==100000)
   begin
   
    dis_cnt <= 20'd0;
    led_en<=led_en+1'b1;
    if(led_en==4)
    led_en<=4'd0;
   end
  else
   dis_cnt<=dis_cnt+1'b1;
end
always @(posedge sys_clk)
begin
  case(led_en)
   4'd0:
   begin
   
       //清屏
     segled_a = 0 ;   
      segled_b = 0 ;   
      segled_c = 0 ;   
      segled_d = 0 ;   
      segled_e = 0;   
      segled_f = 0 ;   
      segled_g = 0 ;   
     segled_h = 0 ;
     
    if(clk_cnt >= 28'd4000000)
     begin
      seg_c1 = 1'b1;//数码管的位选通,下同
      seg_c2 = 1'b1;
      seg_c3 = 1'b0;
      seg_c4 = 1'b1;  
      
      segled_a = 0;   
      segled_b = 0 ;   
      segled_c = 0 ;   
      segled_d = 0 ;   
      segled_e = 0;   
      segled_f = 0 ;   
      segled_g = 0;   
      segled_h = 1 ;  
     end   
   
   end
   4'd1:
   begin
    //清屏
     segled_a = 0 ;   
      segled_b = 0 ;   
      segled_c = 0 ;   
      segled_d = 0 ;   
      segled_e = 0;   
      segled_f = 0 ;   
      segled_g = 0 ;   
      segled_h = 0 ;         
      
     seg_c1 = 1'b0;//数码管的位选通,下同
     seg_c2 = 1'b1;
     seg_c3 = 1'b1;
     seg_c4 = 1'b1;
    case(min)
     4'd0://0
      begin
        segled_a = 1 ;   
        segled_b = 1 ;   
        segled_c = 1 ;   
        segled_d = 1 ;   
        segled_e = 1 ;   
        segled_f = 1 ;   
        segled_g = 0 ;   
        segled_h = 0 ;   
      end
     4'd1://1
      begin
        segled_a = 0 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 0 ;   
         segled_f = 0 ;   
                   segled_g = 0 ;   
         segled_h = 0 ;   
      end
     4'd2:
      begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 0 ;   
         segled_d = 1 ;   
         segled_e = 1 ;   
         segled_f = 0 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;   
      end
     4'd3:
      begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 1 ;   
         segled_f = 0 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
      end
     4'd4:
     begin
                   segled_a = 0 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 0 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
     end
     4'd5:
     begin
                   segled_a = 1 ;   
         segled_b = 0 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 1 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
     end
     4'd6:
     begin
                   segled_a = 1 ;   
         segled_b = 0 ;   
                   segled_c = 1 ;   
         segled_d = 1 ;   
         segled_e = 1 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
     end
     4'd7:
     begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 0 ;   
         segled_f = 0 ;   
                   segled_g = 0 ;   
         segled_h = 0 ;   
     end
     4'd8:
     begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 1 ;   
         segled_e = 1 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0;   //.
     end
     4'd9:
     begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 1 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;   
     end
     default:
     begin
        segled_a = 0 ;   
        segled_b = 0 ;   
        segled_c = 0 ;   
        segled_d = 0 ;   
        segled_e = 0 ;   
        segled_f = 0 ;   
        segled_g = 0 ;   
        segled_h = 0 ;
     end
    endcase
   end
   4'd2:
   begin
       segled_a = 0 ;   
        segled_b = 0 ;   
        segled_c = 0 ;   
        segled_d = 0 ;   
        segled_e = 0;   
        segled_f = 0 ;   
        segled_g = 0 ;   
        segled_h = 0 ;
        
        
        seg_c1 = 1'b1;
        seg_c2 = 1'b0;
        seg_c3 = 1'b1;
        seg_c4 = 1'b1;
    case(min1)
     3'd0://0
      begin
        segled_a = 1 ;   
        segled_b = 1 ;   
        segled_c = 1 ;   
        segled_d = 1 ;   
        segled_e = 1 ;   
        segled_f = 1 ;   
        segled_g = 0 ;   
        segled_h = 0 ;//.   
      end
     3'd1://1
      begin
        segled_a = 0 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 0 ;   
         segled_f = 0 ;   
                   segled_g = 0 ;   
         segled_h = 0 ;   
      end
     3'd2:
      begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 0 ;   
         segled_d = 1 ;   
         segled_e = 1 ;   
         segled_f = 0 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;   
      end
     3'd3:
      begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 1 ;   
         segled_f = 0 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
      end
     3'd4:
     begin
                   segled_a = 0 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 0 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
     end
     3'd5:
     begin
                   segled_a = 1 ;   
         segled_b = 0 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 1 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
     end
     
     default:
     begin
        segled_a = 0;   
        segled_b = 0 ;   
        segled_c = 0 ;   
        segled_d = 0 ;   
        segled_e = 0 ;   
        segled_f = 0 ;   
        segled_g = 0 ;   
        segled_h = 0 ;
     end
    endcase
   end
   
   
   
   
   4'd3:
   begin
       segled_a = 0 ;   
        segled_b = 0 ;   
        segled_c = 0 ;   
        segled_d = 0 ;   
        segled_e = 0;   
        segled_f = 0 ;   
        segled_g = 0 ;   
        segled_h = 0 ;     //en<=8'hfe; //数码管的位选通,下同
        
        seg_c1 = 1'b1;
        seg_c2 = 1'b1;
        seg_c3 = 1'b0;
        seg_c4 = 1'b1;
    case(hour)
     4'd0://0
      begin
        segled_a = 1 ;   
        segled_b = 1 ;   
        segled_c = 1 ;   
        segled_d = 1 ;   
        segled_e = 1 ;   
        segled_f = 1 ;   
        segled_g = 0 ;   
        segled_h = 0;//.   
      end
     4'd1://1
      begin
        segled_a = 0 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 0 ;   
         segled_f = 0 ;   
                   segled_g = 0 ;   
         segled_h = 0 ;   
      end
     4'd2:
      begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 0 ;   
         segled_d = 1 ;   
         segled_e = 1 ;   
         segled_f = 0 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;   
      end
     4'd3:
      begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 1 ;   
         segled_f = 0 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
      end
     4'd4:
     begin
                   segled_a = 0 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 0 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
     end
     4'd5:
     begin
                   segled_a = 1 ;   
         segled_b = 0 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 1 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
     end
     4'd6:
     begin
                   segled_a = 1 ;   
         segled_b = 0 ;   
                   segled_c = 1 ;   
         segled_d = 1 ;   
         segled_e = 1 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
     end
     4'd7:
     begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 0 ;   
         segled_f = 0 ;   
                   segled_g = 0 ;   
         segled_h = 0 ;   
     end
     4'd8:
     begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 1 ;   
         segled_e = 1 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;//.   
     end
     4'd9:
     begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 1 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;   
     end
     default:
     begin
        segled_a = 0 ;   
        segled_b = 0 ;   
        segled_c = 0 ;   
        segled_d = 0 ;   
        segled_e = 0 ;   
        segled_f = 0 ;   
        segled_g = 0 ;   
        segled_h = 0 ;
     end
    endcase   
   end
   4'd4:
   begin
       segled_a = 0 ;   
        segled_b = 0 ;   
        segled_c = 0 ;   
        segled_d = 0 ;   
        segled_e = 0;   
        segled_f = 0 ;   
        segled_g = 0 ;   
        segled_h = 0 ;     //en<=8'hfd;
        
      
        seg_c1 = 1'b1;
        seg_c2 = 1'b1;
        seg_c3 = 1'b1;
        seg_c4 = 1'b0;
    case(hour1)
     3'd0://0
      begin
        segled_a = 1 ;   
        segled_b = 1 ;   
        segled_c = 1 ;   
        segled_d = 1 ;   
        segled_e = 1 ;   
        segled_f = 1 ;   
        segled_g = 0 ;   
        segled_h = 0 ;//.   
      end
     3'd1://1
      begin
        segled_a = 0 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 0 ;   
         segled_f = 0 ;   
                   segled_g = 0 ;   
         segled_h = 0 ;   
      end
     3'd2:
      begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 0 ;   
         segled_d = 1 ;   
         segled_e = 1 ;   
         segled_f = 0 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;   
      end
     3'd3:
      begin
                   segled_a = 1 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 1 ;   
         segled_f = 0 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
      end
     3'd4:
     begin
                   segled_a = 0 ;   
         segled_b = 1 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 0 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
     end
     3'd5:
     begin
                   segled_a = 1 ;   
         segled_b = 0 ;   
                   segled_c = 1 ;   
         segled_d = 0 ;   
         segled_e = 1 ;   
         segled_f = 1 ;   
                   segled_g = 1 ;   
         segled_h = 0 ;  
     end
     
     default:
     begin
        segled_a = 0 ;   
        segled_b = 0 ;   
        segled_c = 0 ;   
        segled_d = 0 ;   
        segled_e = 0 ;   
        segled_f = 0 ;   
        segled_g = 0 ;   
        segled_h = 0 ;
     end
    endcase
   end

      endcase
end








always @(*)
begin
    seg_a = ~segled_a ;
    seg_b = ~segled_b ;
    seg_c = ~segled_c ;
    seg_d = ~segled_d ;
    seg_e = ~segled_e ;
    seg_f = ~segled_f ;
    seg_g = ~segled_g ;
    seg_h = ~segled_h ;
end
//assign seg_c1 = 1'b0;
//assign seg_c2 = 1'b0;
//assign seg_c3 = 1'b0;
//assign seg_c4 = 1'b0;
endmodule
//end of RTL code                       

更多回帖

发帖
×
20
完善资料,
赚取积分